From ae0bc3f2a59be1a5119ac003d7256301ad836910 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 14 Dec 2019 21:33:29 +0200 Subject: [PATCH 001/237] Test for admin controllers --- app/controllers/admin/keys.php | 181 +++++++++++++ app/controllers/admin/platforms.php | 182 +++++++++++++ app/controllers/admin/projects.php | 401 ++++++++++++++++++++++++++++ app/controllers/admin/tasks.php | 264 ++++++++++++++++++ app/controllers/admin/webhooks.php | 228 ++++++++++++++++ 5 files changed, 1256 insertions(+) create mode 100644 app/controllers/admin/keys.php create mode 100644 app/controllers/admin/platforms.php create mode 100644 app/controllers/admin/projects.php create mode 100644 app/controllers/admin/tasks.php create mode 100644 app/controllers/admin/webhooks.php diff --git a/app/controllers/admin/keys.php b/app/controllers/admin/keys.php new file mode 100644 index 0000000000..f8f6f0c2ad --- /dev/null +++ b/app/controllers/admin/keys.php @@ -0,0 +1,181 @@ +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(); + } + ); \ No newline at end of file diff --git a/app/controllers/admin/platforms.php b/app/controllers/admin/platforms.php new file mode 100644 index 0000000000..dfdc239f10 --- /dev/null +++ b/app/controllers/admin/platforms.php @@ -0,0 +1,182 @@ +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(); + } + ); diff --git a/app/controllers/admin/projects.php b/app/controllers/admin/projects.php new file mode 100644 index 0000000000..98828c8a0f --- /dev/null +++ b/app/controllers/admin/projects.php @@ -0,0 +1,401 @@ +get('/v1/projects') + ->desc('List Projects') + ->label('scope', 'projects.read') + ->label('sdk.namespace', 'projects') + ->label('sdk.method', 'listProjects') + ->action( + function () use ($request, $response, $providers, $consoleDB) { + $results = $consoleDB->getCollection([ + 'limit' => 20, + 'offset' => 0, + 'orderField' => 'name', + 'orderType' => 'ASC', + 'orderCast' => 'string', + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_PROJECTS, + ], + ]); + + foreach ($results as $project) { + foreach ($providers as $provider => $node) { + $secret = json_decode($project->getAttribute('usersOauth'.ucfirst($provider).'Secret', '{}'), true); + + if (!empty($secret) && isset($secret['version'])) { + $key = $request->getServer('_APP_OPENSSL_KEY_V'.$secret['version']); + $project->setAttribute('usersOauth'.ucfirst($provider).'Secret', OpenSSL::decrypt($secret['data'], $secret['method'], $key, 0, hex2bin($secret['iv']), hex2bin($secret['tag']))); + } + } + } + + $response->json($results); + } + ); + +$utopia->get('/v1/projects/:projectId') + ->desc('Get Project') + ->label('scope', 'projects.read') + ->label('sdk.namespace', 'projects') + ->label('sdk.method', 'getProject') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') + ->action( + function ($projectId) use ($request, $response, $providers, $consoleDB) { + $project = $consoleDB->getDocument($projectId); + + if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + throw new Exception('Project not found', 404); + } + + foreach ($providers as $provider => $node) { + $secret = json_decode($project->getAttribute('usersOauth'.ucfirst($provider).'Secret', '{}'), true); + + if (!empty($secret) && isset($secret['version'])) { + $key = $request->getServer('_APP_OPENSSL_KEY_V'.$secret['version']); + $project->setAttribute('usersOauth'.ucfirst($provider).'Secret', OpenSSL::decrypt($secret['data'], $secret['method'], $key, 0, hex2bin($secret['iv']), hex2bin($secret['tag']))); + } + } + + $response->json($project->getArrayCopy()); + } + ); + +$utopia->get('/v1/projects/:projectId/usage') + ->desc('Get Project') + ->label('scope', 'projects.read') + ->label('sdk.namespace', 'projects') + ->label('sdk.method', 'getProjectUsage') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') + ->action( + function ($projectId) use ($response, $consoleDB, $projectDB, $register) { + $project = $consoleDB->getDocument($projectId); + + if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + throw new Exception('Project not found', 404); + } + + $client = $register->get('influxdb'); + + $requests = []; + $network = []; + + if ($client) { + $start = DateTime::createFromFormat('U', strtotime('last day of last month')); + $start = $start->format(DateTime::RFC3339); + $end = DateTime::createFromFormat('U', strtotime('last day of this month')); + $end = $end->format(DateTime::RFC3339); + $database = $client->selectDB('telegraf'); + + // Requests + $result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_requests_all" WHERE time > \''.$start.'\' AND time < \''.$end.'\' AND "metric_type"=\'counter\' AND "project"=\''.$project->getUid().'\' GROUP BY time(1d) FILL(null)'); + $points = $result->getPoints(); + + foreach ($points as $point) { + $requests[] = [ + 'value' => (!empty($point['value'])) ? $point['value'] : 0, + 'date' => strtotime($point['time']), + ]; + } + + // Network + $result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_network_all" WHERE time > \''.$start.'\' AND time < \''.$end.'\' AND "metric_type"=\'counter\' AND "project"=\''.$project->getUid().'\' GROUP BY time(1d) FILL(null)'); + $points = $result->getPoints(); + + foreach ($points as $point) { + $network[] = [ + 'value' => (!empty($point['value'])) ? $point['value'] : 0, + 'date' => strtotime($point['time']), + ]; + } + } + + // Users + + $projectDB->getCollection([ + 'limit' => 0, + 'offset' => 0, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + ], + ]); + + $usersTotal = $projectDB->getSum(); + + // Documents + + $collections = $projectDB->getCollection([ + 'limit' => 100, + 'offset' => 0, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_COLLECTIONS, + ], + ]); + + $collectionsTotal = $projectDB->getSum(); + + $documents = []; + + foreach ($collections as $collection) { + $result = $projectDB->getCollection([ + 'limit' => 0, + 'offset' => 0, + 'filters' => [ + '$collection='.$collection['$uid'], + ], + ]); + + $documents[] = ['name' => $collection['name'], 'total' => $projectDB->getSum()]; + } + + // Tasks + $tasksTotal = count($project->getAttribute('tasks', [])); + + $response->json([ + 'requests' => [ + 'data' => $requests, + 'total' => array_sum(array_map(function ($item) { + return $item['value']; + }, $requests)), + ], + 'network' => [ + 'data' => $network, + 'total' => array_sum(array_map(function ($item) { + return $item['value']; + }, $network)), + ], + 'collections' => [ + 'data' => $collections, + 'total' => $collectionsTotal, + ], + 'documents' => [ + 'data' => $documents, + 'total' => array_sum(array_map(function ($item) { + return $item['total']; + }, $documents)), + ], + 'users' => [ + 'data' => [], + 'total' => $usersTotal, + ], + 'tasks' => [ + 'data' => [], + 'total' => $tasksTotal, + ], + 'storage' => [ + 'total' => $projectDB->getCount( + [ + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_FILES, + ], + ] + ), + ], + ]); + } + ); + +$utopia->post('/v1/projects') + ->desc('Create Project') + ->label('scope', 'projects.write') + ->label('sdk.namespace', 'projects') + ->label('sdk.method', 'createProject') + ->param('name', null, function () { return new Text(100); }, 'Project name') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') + ->param('description', '', function () { return new Text(255); }, 'Project description', true) + ->param('logo', '', function () { return new Text(1024); }, 'Project logo', true) + ->param('url', '', function () { return new URL(); }, 'Project URL', true) + ->param('legalName', '', function () { return new Text(256); }, 'Project Legal Name', true) + ->param('legalCountry', '', function () { return new Text(256); }, 'Project Legal Country', true) + ->param('legalState', '', function () { return new Text(256); }, 'Project Legal State', true) + ->param('legalCity', '', function () { return new Text(256); }, 'Project Legal City', true) + ->param('legalAddress', '', function () { return new Text(256); }, 'Project Legal Address', true) + ->param('legalTaxId', '', function () { return new Text(256); }, 'Project Legal Tax ID', true) + ->action( + function ($name, $teamId, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId) use ($response, $user, $consoleDB, $projectDB) { + $team = $projectDB->getDocument($teamId); + + if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + throw new Exception('Team not found', 404); + } + + $project = $consoleDB->createDocument( + [ + '$collection' => Database::SYSTEM_COLLECTION_PROJECTS, + '$permissions' => [ + 'read' => ['team:'.$teamId], + 'write' => ['team:'.$teamId.'/owner', 'team:'.$teamId.'/developer'], + ], + 'name' => $name, + 'description' => $description, + 'logo' => $logo, + 'url' => $url, + 'legalName' => $legalName, + 'legalCountry' => $legalCountry, + 'legalState' => $legalState, + 'legalCity' => $legalCity, + 'legalAddress' => $legalAddress, + 'legalTaxId' => $legalTaxId, + 'teamId' => $team->getUid(), + 'webhooks' => [], + 'keys' => [], + ] + ); + + if (false === $project) { + throw new Exception('Failed saving project to DB', 500); + } + + $consoleDB->createNamespace($project->getUid()); + + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->json($project->getArrayCopy()) + ; + } + ); + +$utopia->patch('/v1/projects/:projectId') + ->desc('Update Project') + ->label('scope', 'projects.write') + ->label('sdk.namespace', 'projects') + ->label('sdk.method', 'updateProject') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') + ->param('name', null, function () { return new Text(100); }, 'Project name') + ->param('description', '', function () { return new Text(255); }, 'Project description', true) + ->param('logo', '', function () { return new Text(1024); }, 'Project logo', true) + ->param('url', '', function () { return new URL(); }, 'Project URL', true) + ->param('legalName', '', function () { return new Text(256); }, 'Project Legal Name', true) + ->param('legalCountry', '', function () { return new Text(256); }, 'Project Legal Country', true) + ->param('legalState', '', function () { return new Text(256); }, 'Project Legal State', true) + ->param('legalCity', '', function () { return new Text(256); }, 'Project Legal City', true) + ->param('legalAddress', '', function () { return new Text(256); }, 'Project Legal Address', true) + ->param('legalTaxId', '', function () { return new Text(256); }, 'Project Legal Tax ID', true) + ->action( + function ($projectId, $name, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId) use ($response, $consoleDB) { + $project = $consoleDB->getDocument($projectId); + + if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + throw new Exception('Project not found', 404); + } + + $project = $consoleDB->updateDocument(array_merge($project->getArrayCopy(), [ + 'name' => $name, + 'description' => $description, + 'logo' => $logo, + 'url' => $url, + 'legalName' => $legalName, + 'legalCountry' => $legalCountry, + 'legalState' => $legalState, + 'legalCity' => $legalCity, + 'legalAddress' => $legalAddress, + 'legalTaxId' => $legalTaxId, + ])); + + if (false === $project) { + throw new Exception('Failed saving project to DB', 500); + } + + $response->json($project->getArrayCopy()); + } + ); + +$utopia->patch('/v1/projects/:projectId/oauth') + ->desc('Update Project OAuth') + ->label('scope', 'projects.write') + ->label('sdk.namespace', 'projects') + ->label('sdk.method', 'updateProjectOAuth') + ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') + ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'Provider Name', false) + ->param('appId', '', function () { return new Text(256); }, 'Provider App ID', true) + ->param('secret', '', function () { return new text(256); }, 'Provider Secret Key', true) + ->action( + function ($projectId, $provider, $appId, $secret) 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; + $secret = json_encode([ + 'data' => OpenSSL::encrypt($secret, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag), + 'method' => OpenSSL::CIPHER_AES_128_GCM, + 'iv' => bin2hex($iv), + 'tag' => bin2hex($tag), + 'version' => '1', + ]); + + $project = $consoleDB->updateDocument(array_merge($project->getArrayCopy(), [ + 'usersOauth'.ucfirst($provider).'Appid' => $appId, + 'usersOauth'.ucfirst($provider).'Secret' => $secret, + ])); + + if (false === $project) { + throw new Exception('Failed saving project to DB', 500); + } + + $response->json($project->getArrayCopy()); + } + ); + +$utopia->delete('/v1/projects/:projectId') + ->desc('Delete Project') + ->label('scope', 'projects.write') + ->label('sdk.namespace', 'projects') + ->label('sdk.method', 'deleteProject') + ->param('projectId', '', 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); + } + + // Delete all children (keys, webhooks, tasks [stop tasks?], platforms) + + if (!$consoleDB->deleteDocument($projectId)) { + throw new Exception('Failed to remove project from DB', 500); + } + + // Delete all DBs + // $consoleDB->deleteNamespace($project->getUid()); + + // Optimize DB? + + // Delete all storage files + // Delete all storage cache + + $response->noContent(); + } + ); \ No newline at end of file diff --git a/app/controllers/admin/tasks.php b/app/controllers/admin/tasks.php new file mode 100644 index 0000000000..6ba47ac02f --- /dev/null +++ b/app/controllers/admin/tasks.php @@ -0,0 +1,264 @@ +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(); + } + ); \ No newline at end of file diff --git a/app/controllers/admin/webhooks.php b/app/controllers/admin/webhooks.php new file mode 100644 index 0000000000..bf3d26c248 --- /dev/null +++ b/app/controllers/admin/webhooks.php @@ -0,0 +1,228 @@ +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(); + } + ); \ No newline at end of file From d59cfd7a68b97057d9fe2104953b798847994cde Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 15 Dec 2019 05:03:43 +0200 Subject: [PATCH 002/237] Splited controllers to client vs admin vs web --- app/controllers/{ => admin}/users.php | 2 +- app/controllers/{ => client}/account.php | 2 +- app/controllers/{ => client}/auth.php | 2 +- app/controllers/{ => client}/avatars.php | 2 +- app/controllers/{ => client}/database.php | 2 +- app/controllers/{ => client}/locale.php | 2 +- app/controllers/{ => client}/storage.php | 2 +- app/controllers/{ => client}/teams.php | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) rename app/controllers/{ => admin}/users.php (99%) rename app/controllers/{ => client}/account.php (99%) rename app/controllers/{ => client}/auth.php (99%) rename app/controllers/{ => client}/avatars.php (99%) rename app/controllers/{ => client}/database.php (99%) rename app/controllers/{ => client}/locale.php (99%) rename app/controllers/{ => client}/storage.php (99%) rename app/controllers/{ => client}/teams.php (99%) diff --git a/app/controllers/users.php b/app/controllers/admin/users.php similarity index 99% rename from app/controllers/users.php rename to app/controllers/admin/users.php index 716aa2db68..f13ca28a70 100644 --- a/app/controllers/users.php +++ b/app/controllers/admin/users.php @@ -16,7 +16,7 @@ use Database\Validator\UID; use DeviceDetector\DeviceDetector; use GeoIp2\Database\Reader; -include_once 'shared/api.php'; +include_once '../shared/api.php'; $utopia->get('/v1/users') ->desc('List Users') diff --git a/app/controllers/account.php b/app/controllers/client/account.php similarity index 99% rename from app/controllers/account.php rename to app/controllers/client/account.php index 37c67c156f..1bf8a68e38 100644 --- a/app/controllers/account.php +++ b/app/controllers/client/account.php @@ -13,7 +13,7 @@ use Database\Validator\Authorization; use DeviceDetector\DeviceDetector; use GeoIp2\Database\Reader; -include_once 'shared/api.php'; +include_once '../shared/api.php'; $utopia->get('/v1/account') ->desc('Get Account') diff --git a/app/controllers/auth.php b/app/controllers/client/auth.php similarity index 99% rename from app/controllers/auth.php rename to app/controllers/client/auth.php index 4b9e4a409d..0ebe403548 100644 --- a/app/controllers/auth.php +++ b/app/controllers/client/auth.php @@ -18,7 +18,7 @@ use Database\Validator\UID; use Template\Template; use OpenSSL\OpenSSL; -include_once 'shared/api.php'; +include_once '../shared/api.php'; $utopia->post('/v1/auth/register') ->desc('Register') diff --git a/app/controllers/avatars.php b/app/controllers/client/avatars.php similarity index 99% rename from app/controllers/avatars.php rename to app/controllers/client/avatars.php index 88d9aab0f2..3c5b99c75d 100644 --- a/app/controllers/avatars.php +++ b/app/controllers/client/avatars.php @@ -15,7 +15,7 @@ use BaconQrCode\Renderer\Image\ImagickImageBackEnd; use BaconQrCode\Renderer\RendererStyle\RendererStyle; use BaconQrCode\Writer; -include_once 'shared/api.php'; +include_once '../shared/api.php'; $types = [ 'browsers' => include __DIR__.'/../config/avatars/browsers.php', diff --git a/app/controllers/database.php b/app/controllers/client/database.php similarity index 99% rename from app/controllers/database.php rename to app/controllers/client/database.php index 2cf404cd7b..955026425d 100644 --- a/app/controllers/database.php +++ b/app/controllers/client/database.php @@ -19,7 +19,7 @@ use Database\Validator\Authorization; use Database\Exception\Authorization as AuthorizationException; use Database\Exception\Structure as StructureException; -include_once 'shared/api.php'; +include_once '../shared/api.php'; $isDev = (App::ENV_TYPE_PRODUCTION !== $utopia->getEnv()); diff --git a/app/controllers/locale.php b/app/controllers/client/locale.php similarity index 99% rename from app/controllers/locale.php rename to app/controllers/client/locale.php index 9e67a7404c..0d6826569f 100644 --- a/app/controllers/locale.php +++ b/app/controllers/client/locale.php @@ -6,7 +6,7 @@ use Utopia\App; use Utopia\Locale\Locale; use GeoIp2\Database\Reader; -include_once 'shared/api.php'; +include_once '../shared/api.php'; $utopia->get('/v1/locale') ->desc('Get User Locale') diff --git a/app/controllers/storage.php b/app/controllers/client/storage.php similarity index 99% rename from app/controllers/storage.php rename to app/controllers/client/storage.php index b918e59b1f..cc88d07514 100644 --- a/app/controllers/storage.php +++ b/app/controllers/client/storage.php @@ -22,7 +22,7 @@ use Storage\Compression\Algorithms\GZIP; use Resize\Resize; use OpenSSL\OpenSSL; -include_once 'shared/api.php'; +include_once '../shared/api.php'; Storage::addDevice('local', new Local('app-'.$project->getUid())); diff --git a/app/controllers/teams.php b/app/controllers/client/teams.php similarity index 99% rename from app/controllers/teams.php rename to app/controllers/client/teams.php index 21f6942dea..0b6ad0cb66 100644 --- a/app/controllers/teams.php +++ b/app/controllers/client/teams.php @@ -18,7 +18,7 @@ use Database\Validator\Authorization; use Template\Template; use Auth\Auth; -include_once 'shared/api.php'; +include_once '../shared/api.php'; $utopia->get('/v1/teams') ->desc('List Teams') From 6664c851e5967fdc4b88b191e30acf7e7261dc62 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 15 Dec 2019 20:56:29 +0200 Subject: [PATCH 003/237] Added project validation --- app/app.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/app.php b/app/app.php index 9eb799f279..c9aeeef471 100644 --- a/app/app.php +++ b/app/app.php @@ -13,6 +13,7 @@ use Utopia\Validator\Range; use Utopia\View; use Utopia\Exception; use Auth\Auth; +use Database\Database; use Database\Document; use Database\Validator\Authorization; use Event\Event; @@ -54,6 +55,11 @@ $clients = array_unique(array_merge($clientsConsole, array_map(function ($node) })))); $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $roles, $webhook, $audit, $usage, $domain, $clients) { + + if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + throw new Exception('Project not found', 404); + } + $route = $utopia->match($request); $referrer = $request->getServer('HTTP_REFERER', ''); From cfb5806b170bb05907a0f0c4ee510a54cdbde80c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 15 Dec 2019 20:56:44 +0200 Subject: [PATCH 004/237] Removed project query --- app/controllers/admin/keys.php | 57 ++++++--------------------- app/controllers/admin/platforms.php | 61 ++++++----------------------- app/controllers/admin/projects.php | 13 ------ app/controllers/admin/tasks.php | 57 ++++++--------------------- app/controllers/admin/webhooks.php | 57 ++++++--------------------- 5 files changed, 45 insertions(+), 200 deletions(-) diff --git a/app/controllers/admin/keys.php b/app/controllers/admin/keys.php index f8f6f0c2ad..354ffc845c 100644 --- a/app/controllers/admin/keys.php +++ b/app/controllers/admin/keys.php @@ -1,6 +1,6 @@ get('/v1/projects/:projectId/keys') +$utopia->get('/v1/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); - } - + function () use ($response, $consoleDB, $project) { $response->json($project->getAttribute('keys', [])); //FIXME make sure array objects return correctly } ); -$utopia->get('/v1/projects/:projectId/keys/:keyId') +$utopia->get('/v1/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); - } - + function ($keyId) use ($response, $consoleDB, $project) { $key = $project->search('$uid', $keyId, $project->getAttribute('keys', [])); if (empty($key) && $key instanceof Document) { @@ -69,22 +55,15 @@ $utopia->get('/v1/projects/:projectId/keys/:keyId') } ); -$utopia->post('/v1/projects/:projectId/keys') +$utopia->post('/v1/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); - } - + function ($name, $scopes) use ($response, $consoleDB, $project) { $key = $consoleDB->createDocument([ '$collection' => Database::SYSTEM_COLLECTION_KEYS, '$permissions' => [ @@ -115,23 +94,16 @@ $utopia->post('/v1/projects/:projectId/keys') } ); -$utopia->put('/v1/projects/:projectId/keys/:keyId') +$utopia->put('/v1/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); - } - + function ($keyId, $name, $scopes) use ($response, $consoleDB, $project) { $key = $project->search('$uid', $keyId, $project->getAttribute('keys', [])); if (empty($key) && $key instanceof Document) { @@ -151,21 +123,14 @@ $utopia->put('/v1/projects/:projectId/keys/:keyId') } ); -$utopia->delete('/v1/projects/:projectId/keys/:keyId') +$utopia->delete('/v1/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); - } - + function ($keyId) use ($response, $consoleDB, $project) { $key = $project->search('$uid', $keyId, $project->getAttribute('keys', [])); if (empty($key) && $key instanceof Document) { diff --git a/app/controllers/admin/platforms.php b/app/controllers/admin/platforms.php index dfdc239f10..5f358731bd 100644 --- a/app/controllers/admin/platforms.php +++ b/app/controllers/admin/platforms.php @@ -1,6 +1,6 @@ get('/v1/projects/:projectId/platforms') +$utopia->get('/v1/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); + function () use ($request, $response, $consoleDB, $project) { + $response->json($project->getAttribute('platforms', [])); } ); -$utopia->get('/v1/projects/:projectId/platforms/:platformId') +$utopia->get('/v1/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); - } - + function ($platformId) use ($request, $response, $consoleDB, $project) { $platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', [])); if (empty($platform) && $platform instanceof Document) { @@ -58,25 +42,18 @@ $utopia->get('/v1/projects/:projectId/platforms/:platformId') } ); -$utopia->post('/v1/projects/:projectId/platforms') +$utopia->post('/v1/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); - } - + function ($type, $name, $key, $store, $url) use ($response, $consoleDB, $project) { $platform = $consoleDB->createDocument([ '$collection' => Database::SYSTEM_COLLECTION_PLATFORMS, '$permissions' => [ @@ -111,25 +88,18 @@ $utopia->post('/v1/projects/:projectId/platforms') } ); -$utopia->put('/v1/projects/:projectId/platforms/:platformId') +$utopia->put('/v1/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); - } - + function ($platformId, $name, $key, $store, $url) use ($response, $consoleDB, $project) { $platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', [])); if (empty($platform) && $platform instanceof Document) { @@ -152,21 +122,14 @@ $utopia->put('/v1/projects/:projectId/platforms/:platformId') } ); -$utopia->delete('/v1/projects/:projectId/platforms/:platformId') +$utopia->delete('/v1/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); - } - + function ($platformId) use ($response, $consoleDB, $project) { $platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', [])); if (empty($platform) && $platform instanceof Document) { diff --git a/app/controllers/admin/projects.php b/app/controllers/admin/projects.php index 98828c8a0f..cbb4bda649 100644 --- a/app/controllers/admin/projects.php +++ b/app/controllers/admin/projects.php @@ -15,19 +15,6 @@ use OpenSSL\OpenSSL; include_once '../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') diff --git a/app/controllers/admin/tasks.php b/app/controllers/admin/tasks.php index 6ba47ac02f..33c4afb745 100644 --- a/app/controllers/admin/tasks.php +++ b/app/controllers/admin/tasks.php @@ -1,6 +1,6 @@ get('/v1/projects/:projectId/tasks') +$utopia->get('/v1/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); - } - + function () use ($request, $response, $consoleDB, $project) { $tasks = $project->getAttribute('tasks', []); foreach ($tasks as $task) { /* @var $task Document */ @@ -50,21 +43,14 @@ $utopia->get('/v1/projects/:projectId/tasks') } ); -$utopia->get('/v1/projects/:projectId/tasks/:taskId') +$utopia->get('/v1/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); - } - + function ($taskId) use ($request, $response, $consoleDB, $project) { $task = $project->search('$uid', $taskId, $project->getAttribute('tasks', [])); if (empty($task) && $task instanceof Document) { @@ -82,12 +68,11 @@ $utopia->get('/v1/projects/:projectId/tasks/:taskId') } ); -$utopia->post('/v1/projects/:projectId/tasks') +$utopia->post('/v1/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') @@ -98,13 +83,7 @@ $utopia->post('/v1/projects/:projectId/tasks') ->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); - } - + function ($name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass) use ($request, $response, $consoleDB, $project) { $cron = CronExpression::factory($schedule); $next = ($status == 'play') ? $cron->getNextRunDate()->format('U') : null; @@ -164,12 +143,11 @@ $utopia->post('/v1/projects/:projectId/tasks') } ); -$utopia->put('/v1/projects/:projectId/tasks/:taskId') +$utopia->put('/v1/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') @@ -181,13 +159,7 @@ $utopia->put('/v1/projects/:projectId/tasks/:taskId') ->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); - } - + function ($taskId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass) use ($request, $response, $consoleDB, $project) { $task = $project->search('$uid', $taskId, $project->getAttribute('tasks', [])); if (empty($task) && $task instanceof Document) { @@ -234,21 +206,14 @@ $utopia->put('/v1/projects/:projectId/tasks/:taskId') } ); -$utopia->delete('/v1/projects/:projectId/tasks/:taskId') +$utopia->delete('/v1/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); - } - + function ($taskId) use ($response, $consoleDB, $project) { $task = $project->search('$uid', $taskId, $project->getAttribute('tasks', [])); if (empty($task) && $task instanceof Document) { diff --git a/app/controllers/admin/webhooks.php b/app/controllers/admin/webhooks.php index bf3d26c248..15df68220a 100644 --- a/app/controllers/admin/webhooks.php +++ b/app/controllers/admin/webhooks.php @@ -1,6 +1,6 @@ get('/v1/projects/:projectId/webhooks') +$utopia->get('/v1/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); - } - + function () use ($request, $response, $consoleDB, $project) { $webhooks = $project->getAttribute('webhooks', []); foreach ($webhooks as $webhook) { /* @var $webhook Document */ @@ -47,21 +40,14 @@ $utopia->get('/v1/projects/:projectId/webhooks') } ); -$utopia->get('/v1/projects/:projectId/webhooks/:webhookId') +$utopia->get('/v1/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); - } - + function ($webhookId) use ($request, $response, $consoleDB, $project) { $webhook = $project->search('$uid', $webhookId, $project->getAttribute('webhooks', [])); if (empty($webhook) && $webhook instanceof Document) { @@ -79,12 +65,11 @@ $utopia->get('/v1/projects/:projectId/webhooks/:webhookId') } ); -$utopia->post('/v1/projects/:projectId/webhooks') +$utopia->post('/v1/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') @@ -92,13 +77,7 @@ $utopia->post('/v1/projects/:projectId/webhooks') ->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); - } - + function ($name, $events, $url, $security, $httpUser, $httpPass) use ($request, $response, $consoleDB, $project) { $key = $request->getServer('_APP_OPENSSL_KEY_V1'); $iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM)); $tag = null; @@ -143,12 +122,11 @@ $utopia->post('/v1/projects/:projectId/webhooks') } ); -$utopia->put('/v1/projects/:projectId/webhooks/:webhookId') +$utopia->put('/v1/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') @@ -157,13 +135,7 @@ $utopia->put('/v1/projects/:projectId/webhooks/:webhookId') ->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); - } - + function ($webhookId, $name, $events, $url, $security, $httpUser, $httpPass) use ($request, $response, $consoleDB, $project) { $key = $request->getServer('_APP_OPENSSL_KEY_V1'); $iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM)); $tag = null; @@ -198,21 +170,14 @@ $utopia->put('/v1/projects/:projectId/webhooks/:webhookId') } ); -$utopia->delete('/v1/projects/:projectId/webhooks/:webhookId') +$utopia->delete('/v1/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); - } - + function ($webhookId) use ($response, $consoleDB, $project) { $webhook = $project->search('$uid', $webhookId, $project->getAttribute('webhooks', [])); if (empty($webhook) && $webhook instanceof Document) { From 53a97a59ca49e96755ddb1a4c98dae7b0eca6e33 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 15 Dec 2019 20:59:13 +0200 Subject: [PATCH 005/237] Project bot found check --- app/app.php | 5 ----- app/controllers/shared/api.php | 7 ++++--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/app.php b/app/app.php index c9aeeef471..d9acd72f75 100644 --- a/app/app.php +++ b/app/app.php @@ -55,11 +55,6 @@ $clients = array_unique(array_merge($clientsConsole, array_map(function ($node) })))); $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $roles, $webhook, $audit, $usage, $domain, $clients) { - - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { - throw new Exception('Project not found', 404); - } - $route = $utopia->match($request); $referrer = $request->getServer('HTTP_REFERER', ''); diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 020f8d9adf..8fc2fcc7ef 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -8,10 +8,11 @@ use Database\Database; global $utopia, $request, $response, $register, $user, $project; $utopia->init(function () use ($utopia, $request, $response, $register, $user, $project) { - if (is_null($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { - throw new Exception('Missing Project UID', 400); + + if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { + throw new Exception('Project not found', 404); } - + $route = $utopia->match($request); /* From 178c47610957e249b1b7ab0651117903cefee029 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 16 Dec 2019 06:55:05 +0200 Subject: [PATCH 006/237] Changed controllers location --- app/controllers/{client => api}/account.php | 0 app/controllers/{client => api}/auth.php | 0 app/controllers/{client => api}/avatars.php | 0 app/controllers/{client => api}/database.php | 0 app/controllers/{ => api}/health.php | 0 app/controllers/{admin => api}/keys.php | 20 ++++++++++---------- app/controllers/{client => api}/locale.php | 0 app/controllers/{admin => api}/platforms.php | 20 ++++++++++---------- app/controllers/{admin => api}/projects.php | 0 app/controllers/{client => api}/storage.php | 0 app/controllers/{admin => api}/tasks.php | 20 ++++++++++---------- app/controllers/{client => api}/teams.php | 0 app/controllers/{admin => api}/users.php | 0 app/controllers/{admin => api}/webhooks.php | 20 ++++++++++---------- app/controllers/{ => web}/console.php | 0 app/controllers/{ => web}/home.php | 0 16 files changed, 40 insertions(+), 40 deletions(-) rename app/controllers/{client => api}/account.php (100%) rename app/controllers/{client => api}/auth.php (100%) rename app/controllers/{client => api}/avatars.php (100%) rename app/controllers/{client => api}/database.php (100%) rename app/controllers/{ => api}/health.php (100%) rename app/controllers/{admin => api}/keys.php (92%) rename app/controllers/{client => api}/locale.php (100%) rename app/controllers/{admin => api}/platforms.php (93%) rename app/controllers/{admin => api}/projects.php (100%) rename app/controllers/{client => api}/storage.php (100%) rename app/controllers/{admin => api}/tasks.php (96%) rename app/controllers/{client => api}/teams.php (100%) rename app/controllers/{admin => api}/users.php (100%) rename app/controllers/{admin => api}/webhooks.php (95%) rename app/controllers/{ => web}/console.php (100%) rename app/controllers/{ => web}/home.php (100%) diff --git a/app/controllers/client/account.php b/app/controllers/api/account.php similarity index 100% rename from app/controllers/client/account.php rename to app/controllers/api/account.php diff --git a/app/controllers/client/auth.php b/app/controllers/api/auth.php similarity index 100% rename from app/controllers/client/auth.php rename to app/controllers/api/auth.php diff --git a/app/controllers/client/avatars.php b/app/controllers/api/avatars.php similarity index 100% rename from app/controllers/client/avatars.php rename to app/controllers/api/avatars.php diff --git a/app/controllers/client/database.php b/app/controllers/api/database.php similarity index 100% rename from app/controllers/client/database.php rename to app/controllers/api/database.php diff --git a/app/controllers/health.php b/app/controllers/api/health.php similarity index 100% rename from app/controllers/health.php rename to app/controllers/api/health.php diff --git a/app/controllers/admin/keys.php b/app/controllers/api/keys.php similarity index 92% rename from app/controllers/admin/keys.php rename to app/controllers/api/keys.php index 354ffc845c..a38765b51f 100644 --- a/app/controllers/admin/keys.php +++ b/app/controllers/api/keys.php @@ -28,8 +28,8 @@ $scopes = [ // TODO sync with console UI list $utopia->get('/v1/keys') ->desc('List Keys') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') + ->label('scope', 'keys.read') + ->label('sdk.namespace', 'keys') ->label('sdk.method', 'listKeys') ->action( function () use ($response, $consoleDB, $project) { @@ -39,8 +39,8 @@ $utopia->get('/v1/keys') $utopia->get('/v1/keys/:keyId') ->desc('Get Key') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') + ->label('scope', 'keys.read') + ->label('sdk.namespace', 'keys') ->label('sdk.method', 'getKey') ->param('keyId', null, function () { return new UID(); }, 'Key unique ID.') ->action( @@ -57,8 +57,8 @@ $utopia->get('/v1/keys/:keyId') $utopia->post('/v1/keys') ->desc('Create Key') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'keys.write') + ->label('sdk.namespace', 'keys') ->label('sdk.method', 'createKey') ->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') @@ -96,8 +96,8 @@ $utopia->post('/v1/keys') $utopia->put('/v1/keys/:keyId') ->desc('Update Key') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'keys.write') + ->label('sdk.namespace', 'keys') ->label('sdk.method', 'updateKey') ->param('keyId', null, function () { return new UID(); }, 'Key unique ID.') ->param('name', null, function () { return new Text(256); }, 'Key name') @@ -125,8 +125,8 @@ $utopia->put('/v1/keys/:keyId') $utopia->delete('/v1/keys/:keyId') ->desc('Delete Key') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'keys.write') + ->label('sdk.namespace', 'keys') ->label('sdk.method', 'deleteKey') ->param('keyId', null, function () { return new UID(); }, 'Key unique ID.') ->action( diff --git a/app/controllers/client/locale.php b/app/controllers/api/locale.php similarity index 100% rename from app/controllers/client/locale.php rename to app/controllers/api/locale.php diff --git a/app/controllers/admin/platforms.php b/app/controllers/api/platforms.php similarity index 93% rename from app/controllers/admin/platforms.php rename to app/controllers/api/platforms.php index 5f358731bd..771a94844c 100644 --- a/app/controllers/admin/platforms.php +++ b/app/controllers/api/platforms.php @@ -15,8 +15,8 @@ include_once '../shared/api.php'; $utopia->get('/v1/platforms') ->desc('List Platforms') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') + ->label('scope', 'platforms.read') + ->label('sdk.namespace', 'platforms') ->label('sdk.method', 'listPlatforms') ->action( function () use ($request, $response, $consoleDB, $project) { @@ -26,8 +26,8 @@ $utopia->get('/v1/platforms') $utopia->get('/v1/platforms/:platformId') ->desc('Get Platform') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') + ->label('scope', 'platforms.read') + ->label('sdk.namespace', 'platforms') ->label('sdk.method', 'getPlatform') ->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.') ->action( @@ -44,8 +44,8 @@ $utopia->get('/v1/platforms/:platformId') $utopia->post('/v1/platforms') ->desc('Create Platform') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'platforms.write') + ->label('sdk.namespace', 'platforms') ->label('sdk.method', 'createPlatform') ->param('type', null, function () { return new WhiteList(['web', 'ios', 'android', 'unity']); }, 'Platform name') ->param('name', null, function () { return new Text(256); }, 'Platform name') @@ -90,8 +90,8 @@ $utopia->post('/v1/platforms') $utopia->put('/v1/platforms/:platformId') ->desc('Update Platform') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'platforms.write') + ->label('sdk.namespace', 'platforms') ->label('sdk.method', 'updatePlatform') ->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.') ->param('name', null, function () { return new Text(256); }, 'Platform name') @@ -124,8 +124,8 @@ $utopia->put('/v1/platforms/:platformId') $utopia->delete('/v1/platforms/:platformId') ->desc('Delete Platform') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'platforms.write') + ->label('sdk.namespace', 'platforms') ->label('sdk.method', 'deletePlatform') ->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.') ->action( diff --git a/app/controllers/admin/projects.php b/app/controllers/api/projects.php similarity index 100% rename from app/controllers/admin/projects.php rename to app/controllers/api/projects.php diff --git a/app/controllers/client/storage.php b/app/controllers/api/storage.php similarity index 100% rename from app/controllers/client/storage.php rename to app/controllers/api/storage.php diff --git a/app/controllers/admin/tasks.php b/app/controllers/api/tasks.php similarity index 96% rename from app/controllers/admin/tasks.php rename to app/controllers/api/tasks.php index 33c4afb745..5d135f6079 100644 --- a/app/controllers/admin/tasks.php +++ b/app/controllers/api/tasks.php @@ -20,8 +20,8 @@ include_once '../shared/api.php'; $utopia->get('/v1/tasks') ->desc('List Tasks') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') + ->label('scope', 'tasks.read') + ->label('sdk.namespace', 'tasks') ->label('sdk.method', 'listTasks') ->action( function () use ($request, $response, $consoleDB, $project) { @@ -45,8 +45,8 @@ $utopia->get('/v1/tasks') $utopia->get('/v1/tasks/:taskId') ->desc('Get Task') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') + ->label('scope', 'tasks.read') + ->label('sdk.namespace', 'tasks') ->label('sdk.method', 'getTask') ->param('taskId', null, function () { return new UID(); }, 'Task unique ID.') ->action( @@ -70,8 +70,8 @@ $utopia->get('/v1/tasks/:taskId') $utopia->post('/v1/tasks') ->desc('Create Task') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'tasks.write') + ->label('sdk.namespace', 'tasks') ->label('sdk.method', 'createTask') ->param('name', null, function () { return new Text(256); }, 'Task name') ->param('status', null, function () { return new WhiteList(['play', 'pause']); }, 'Task status') @@ -145,8 +145,8 @@ $utopia->post('/v1/tasks') $utopia->put('/v1/tasks/:taskId') ->desc('Update Task') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'tasks.write') + ->label('sdk.namespace', 'tasks') ->label('sdk.method', 'updateTask') ->param('taskId', null, function () { return new UID(); }, 'Task unique ID.') ->param('name', null, function () { return new Text(256); }, 'Task name') @@ -208,8 +208,8 @@ $utopia->put('/v1/tasks/:taskId') $utopia->delete('/v1/tasks/:taskId') ->desc('Delete Task') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'tasks.write') + ->label('sdk.namespace', 'tasks') ->label('sdk.method', 'deleteTask') ->param('taskId', null, function () { return new UID(); }, 'Task unique ID.') ->action( diff --git a/app/controllers/client/teams.php b/app/controllers/api/teams.php similarity index 100% rename from app/controllers/client/teams.php rename to app/controllers/api/teams.php diff --git a/app/controllers/admin/users.php b/app/controllers/api/users.php similarity index 100% rename from app/controllers/admin/users.php rename to app/controllers/api/users.php diff --git a/app/controllers/admin/webhooks.php b/app/controllers/api/webhooks.php similarity index 95% rename from app/controllers/admin/webhooks.php rename to app/controllers/api/webhooks.php index 15df68220a..4c1ec59a32 100644 --- a/app/controllers/admin/webhooks.php +++ b/app/controllers/api/webhooks.php @@ -17,8 +17,8 @@ include_once '../shared/api.php'; $utopia->get('/v1/webhooks') ->desc('List Webhooks') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') + ->label('scope', 'webhooks.read') + ->label('sdk.namespace', 'webhooks') ->label('sdk.method', 'listWebhooks') ->action( function () use ($request, $response, $consoleDB, $project) { @@ -42,8 +42,8 @@ $utopia->get('/v1/webhooks') $utopia->get('/v1/webhooks/:webhookId') ->desc('Get Webhook') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') + ->label('scope', 'webhooks.read') + ->label('sdk.namespace', 'webhooks') ->label('sdk.method', 'getWebhook') ->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.') ->action( @@ -67,8 +67,8 @@ $utopia->get('/v1/webhooks/:webhookId') $utopia->post('/v1/webhooks') ->desc('Create Webhook') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'webhooks.write') + ->label('sdk.namespace', 'webhooks') ->label('sdk.method', 'createWebhook') ->param('name', null, function () { return new Text(256); }, 'Webhook name') ->param('events', null, function () { return new ArrayList(new Text(256)); }, 'Webhook events list') @@ -124,8 +124,8 @@ $utopia->post('/v1/webhooks') $utopia->put('/v1/webhooks/:webhookId') ->desc('Update Webhook') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'webhooks.write') + ->label('sdk.namespace', 'webhooks') ->label('sdk.method', 'updateWebhook') ->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.') ->param('name', null, function () { return new Text(256); }, 'Webhook name') @@ -172,8 +172,8 @@ $utopia->put('/v1/webhooks/:webhookId') $utopia->delete('/v1/webhooks/:webhookId') ->desc('Delete Webhook') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') + ->label('scope', 'webhooks.write') + ->label('sdk.namespace', 'webhooks') ->label('sdk.method', 'deleteWebhook') ->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.') ->action( diff --git a/app/controllers/console.php b/app/controllers/web/console.php similarity index 100% rename from app/controllers/console.php rename to app/controllers/web/console.php diff --git a/app/controllers/home.php b/app/controllers/web/home.php similarity index 100% rename from app/controllers/home.php rename to app/controllers/web/home.php From 69633e81c860d25d35ad3c4a8eef42ec0a0df3f0 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 16 Dec 2019 07:00:07 +0200 Subject: [PATCH 007/237] Fixed controllers paths --- app/config/services.php | 24 ++++++++++++------------ app/controllers/web/console.php | 2 +- app/controllers/web/home.php | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/config/services.php b/app/config/services.php index 0e4a3385c3..b3bbd14799 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -3,81 +3,81 @@ return [ '/' => [ 'name' => 'Homepage', - 'controller' => 'controllers/home.php', + 'controller' => 'controllers/web/home.php', 'sdk' => false, 'tests' => false, ], 'console/' => [ 'name' => 'Console', - 'controller' => 'controllers/console.php', + 'controller' => 'controllers/web/console.php', 'sdk' => false, 'tests' => false, ], 'v1/account' => [ 'name' => 'Account', 'description' => '/docs/services/account.md', - 'controller' => 'controllers/account.php', + 'controller' => 'controllers/api/account.php', 'sdk' => true, 'tests' => false, ], 'v1/auth' => [ // Add to docs later: You can also learn how to [configure support for our supported OAuth providers](/docs/oauth) 'name' => 'Auth', 'description' => '/docs/services/auth.md', - 'controller' => 'controllers/auth.php', + 'controller' => 'controllers/api/auth.php', 'sdk' => true, 'tests' => false, ], 'v1/avatars' => [ 'name' => 'Avatars', 'description' => '/docs/services/avatars.md', - 'controller' => 'controllers/avatars.php', + 'controller' => 'controllers/api/avatars.php', 'sdk' => true, 'tests' => false, ], 'v1/database' => [ 'name' => 'Database', 'description' => '/docs/services/database.md', - 'controller' => 'controllers/database.php', + 'controller' => 'controllers/api/database.php', 'sdk' => true, 'tests' => false, ], 'v1/locale' => [ 'name' => 'Locale', 'description' => '/docs/services/locale.md', - 'controller' => 'controllers/locale.php', + 'controller' => 'controllers/api/locale.php', 'sdk' => true, 'tests' => false, ], 'v1/health' => [ 'name' => 'Health', - 'controller' => 'controllers/health.php', + 'controller' => 'controllers/api/health.php', 'sdk' => false, 'tests' => false, ], 'v1/projects' => [ 'name' => 'Projects', - 'controller' => 'controllers/projects.php', + 'controller' => 'controllers/api/projects.php', 'sdk' => true, 'tests' => false, ], 'v1/storage' => [ 'name' => 'Storage', 'description' => '/docs/services/storage.md', - 'controller' => 'controllers/storage.php', + 'controller' => 'controllers/api/storage.php', 'sdk' => true, 'tests' => false, ], 'v1/teams' => [ 'name' => 'Teams', 'description' => '/docs/services/teams.md', - 'controller' => 'controllers/teams.php', + 'controller' => 'controllers/api/teams.php', 'sdk' => true, 'tests' => false, ], 'v1/users' => [ 'name' => 'Users', 'description' => '/docs/services/users.md', - 'controller' => 'controllers/users.php', + 'controller' => 'controllers/api/users.php', 'sdk' => true, 'tests' => false, ], diff --git a/app/controllers/web/console.php b/app/controllers/web/console.php index 95a15991ab..a2d0753148 100644 --- a/app/controllers/web/console.php +++ b/app/controllers/web/console.php @@ -1,6 +1,6 @@ Date: Mon, 16 Dec 2019 07:11:41 +0200 Subject: [PATCH 008/237] Synced scopes --- app/config/roles.php | 8 + app/config/scopes.php | 22 + app/controllers/api/keys.php | 13 +- app/controllers/projects.php | 1191 ------------------------------- app/controllers/web/console.php | 3 + 5 files changed, 34 insertions(+), 1203 deletions(-) create mode 100644 app/config/scopes.php delete mode 100644 app/controllers/projects.php diff --git a/app/config/roles.php b/app/config/roles.php index 81d3437840..c68c52ca2f 100644 --- a/app/config/roles.php +++ b/app/config/roles.php @@ -33,6 +33,14 @@ $admins = [ 'users.write', 'collections.read', 'collections.write', + 'platforms.read', + 'platforms.write', + 'keys.read', + 'keys.write', + 'tasks.read', + 'tasks.write', + 'webhooks.read', + 'webhooks.write', ]; return [ diff --git a/app/config/scopes.php b/app/config/scopes.php new file mode 100644 index 0000000000..ea309401e6 --- /dev/null +++ b/app/config/scopes.php @@ -0,0 +1,22 @@ +get('/v1/keys') ->desc('List Keys') diff --git a/app/controllers/projects.php b/app/controllers/projects.php deleted file mode 100644 index 10f07e603f..0000000000 --- a/app/controllers/projects.php +++ /dev/null @@ -1,1191 +0,0 @@ -get('/v1/projects') - ->desc('List Projects') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'listProjects') - ->action( - function () use ($request, $response, $providers, $consoleDB) { - $results = $consoleDB->getCollection([ - 'limit' => 20, - 'offset' => 0, - 'orderField' => 'name', - 'orderType' => 'ASC', - 'orderCast' => 'string', - 'filters' => [ - '$collection='.Database::SYSTEM_COLLECTION_PROJECTS, - ], - ]); - - foreach ($results as $project) { - foreach ($providers as $provider => $node) { - $secret = json_decode($project->getAttribute('usersOauth'.ucfirst($provider).'Secret', '{}'), true); - - if (!empty($secret) && isset($secret['version'])) { - $key = $request->getServer('_APP_OPENSSL_KEY_V'.$secret['version']); - $project->setAttribute('usersOauth'.ucfirst($provider).'Secret', OpenSSL::decrypt($secret['data'], $secret['method'], $key, 0, hex2bin($secret['iv']), hex2bin($secret['tag']))); - } - } - } - - $response->json($results); - } - ); - -$utopia->get('/v1/projects/:projectId') - ->desc('Get Project') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'getProject') - ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') - ->action( - function ($projectId) use ($request, $response, $providers, $consoleDB) { - $project = $consoleDB->getDocument($projectId); - - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { - throw new Exception('Project not found', 404); - } - - foreach ($providers as $provider => $node) { - $secret = json_decode($project->getAttribute('usersOauth'.ucfirst($provider).'Secret', '{}'), true); - - if (!empty($secret) && isset($secret['version'])) { - $key = $request->getServer('_APP_OPENSSL_KEY_V'.$secret['version']); - $project->setAttribute('usersOauth'.ucfirst($provider).'Secret', OpenSSL::decrypt($secret['data'], $secret['method'], $key, 0, hex2bin($secret['iv']), hex2bin($secret['tag']))); - } - } - - $response->json($project->getArrayCopy()); - } - ); - -$utopia->get('/v1/projects/:projectId/usage') - ->desc('Get Project') - ->label('scope', 'projects.read') - ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'getProjectUsage') - ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') - ->action( - function ($projectId) use ($response, $consoleDB, $projectDB, $register) { - $project = $consoleDB->getDocument($projectId); - - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { - throw new Exception('Project not found', 404); - } - - $client = $register->get('influxdb'); - - $requests = []; - $network = []; - - if ($client) { - $start = DateTime::createFromFormat('U', strtotime('last day of last month')); - $start = $start->format(DateTime::RFC3339); - $end = DateTime::createFromFormat('U', strtotime('last day of this month')); - $end = $end->format(DateTime::RFC3339); - $database = $client->selectDB('telegraf'); - - // Requests - $result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_requests_all" WHERE time > \''.$start.'\' AND time < \''.$end.'\' AND "metric_type"=\'counter\' AND "project"=\''.$project->getUid().'\' GROUP BY time(1d) FILL(null)'); - $points = $result->getPoints(); - - foreach ($points as $point) { - $requests[] = [ - 'value' => (!empty($point['value'])) ? $point['value'] : 0, - 'date' => strtotime($point['time']), - ]; - } - - // Network - $result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_network_all" WHERE time > \''.$start.'\' AND time < \''.$end.'\' AND "metric_type"=\'counter\' AND "project"=\''.$project->getUid().'\' GROUP BY time(1d) FILL(null)'); - $points = $result->getPoints(); - - foreach ($points as $point) { - $network[] = [ - 'value' => (!empty($point['value'])) ? $point['value'] : 0, - 'date' => strtotime($point['time']), - ]; - } - } - - // Users - - $projectDB->getCollection([ - 'limit' => 0, - 'offset' => 0, - 'filters' => [ - '$collection='.Database::SYSTEM_COLLECTION_USERS, - ], - ]); - - $usersTotal = $projectDB->getSum(); - - // Documents - - $collections = $projectDB->getCollection([ - 'limit' => 100, - 'offset' => 0, - 'filters' => [ - '$collection='.Database::SYSTEM_COLLECTION_COLLECTIONS, - ], - ]); - - $collectionsTotal = $projectDB->getSum(); - - $documents = []; - - foreach ($collections as $collection) { - $result = $projectDB->getCollection([ - 'limit' => 0, - 'offset' => 0, - 'filters' => [ - '$collection='.$collection['$uid'], - ], - ]); - - $documents[] = ['name' => $collection['name'], 'total' => $projectDB->getSum()]; - } - - // Tasks - $tasksTotal = count($project->getAttribute('tasks', [])); - - $response->json([ - 'requests' => [ - 'data' => $requests, - 'total' => array_sum(array_map(function ($item) { - return $item['value']; - }, $requests)), - ], - 'network' => [ - 'data' => $network, - 'total' => array_sum(array_map(function ($item) { - return $item['value']; - }, $network)), - ], - 'collections' => [ - 'data' => $collections, - 'total' => $collectionsTotal, - ], - 'documents' => [ - 'data' => $documents, - 'total' => array_sum(array_map(function ($item) { - return $item['total']; - }, $documents)), - ], - 'users' => [ - 'data' => [], - 'total' => $usersTotal, - ], - 'tasks' => [ - 'data' => [], - 'total' => $tasksTotal, - ], - 'storage' => [ - 'total' => $projectDB->getCount( - [ - 'filters' => [ - '$collection='.Database::SYSTEM_COLLECTION_FILES, - ], - ] - ), - ], - ]); - } - ); - -$utopia->post('/v1/projects') - ->desc('Create Project') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'createProject') - ->param('name', null, function () { return new Text(100); }, 'Project name') - ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') - ->param('description', '', function () { return new Text(255); }, 'Project description', true) - ->param('logo', '', function () { return new Text(1024); }, 'Project logo', true) - ->param('url', '', function () { return new URL(); }, 'Project URL', true) - ->param('legalName', '', function () { return new Text(256); }, 'Project Legal Name', true) - ->param('legalCountry', '', function () { return new Text(256); }, 'Project Legal Country', true) - ->param('legalState', '', function () { return new Text(256); }, 'Project Legal State', true) - ->param('legalCity', '', function () { return new Text(256); }, 'Project Legal City', true) - ->param('legalAddress', '', function () { return new Text(256); }, 'Project Legal Address', true) - ->param('legalTaxId', '', function () { return new Text(256); }, 'Project Legal Tax ID', true) - ->action( - function ($name, $teamId, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId) use ($response, $user, $consoleDB, $projectDB) { - $team = $projectDB->getDocument($teamId); - - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { - throw new Exception('Team not found', 404); - } - - $project = $consoleDB->createDocument( - [ - '$collection' => Database::SYSTEM_COLLECTION_PROJECTS, - '$permissions' => [ - 'read' => ['team:'.$teamId], - 'write' => ['team:'.$teamId.'/owner', 'team:'.$teamId.'/developer'], - ], - 'name' => $name, - 'description' => $description, - 'logo' => $logo, - 'url' => $url, - 'legalName' => $legalName, - 'legalCountry' => $legalCountry, - 'legalState' => $legalState, - 'legalCity' => $legalCity, - 'legalAddress' => $legalAddress, - 'legalTaxId' => $legalTaxId, - 'teamId' => $team->getUid(), - 'webhooks' => [], - 'keys' => [], - ] - ); - - if (false === $project) { - throw new Exception('Failed saving project to DB', 500); - } - - $consoleDB->createNamespace($project->getUid()); - - $response - ->setStatusCode(Response::STATUS_CODE_CREATED) - ->json($project->getArrayCopy()) - ; - } - ); - -$utopia->patch('/v1/projects/:projectId') - ->desc('Update Project') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'updateProject') - ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') - ->param('name', null, function () { return new Text(100); }, 'Project name') - ->param('description', '', function () { return new Text(255); }, 'Project description', true) - ->param('logo', '', function () { return new Text(1024); }, 'Project logo', true) - ->param('url', '', function () { return new URL(); }, 'Project URL', true) - ->param('legalName', '', function () { return new Text(256); }, 'Project Legal Name', true) - ->param('legalCountry', '', function () { return new Text(256); }, 'Project Legal Country', true) - ->param('legalState', '', function () { return new Text(256); }, 'Project Legal State', true) - ->param('legalCity', '', function () { return new Text(256); }, 'Project Legal City', true) - ->param('legalAddress', '', function () { return new Text(256); }, 'Project Legal Address', true) - ->param('legalTaxId', '', function () { return new Text(256); }, 'Project Legal Tax ID', true) - ->action( - function ($projectId, $name, $description, $logo, $url, $legalName, $legalCountry, $legalState, $legalCity, $legalAddress, $legalTaxId) use ($response, $consoleDB) { - $project = $consoleDB->getDocument($projectId); - - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { - throw new Exception('Project not found', 404); - } - - $project = $consoleDB->updateDocument(array_merge($project->getArrayCopy(), [ - 'name' => $name, - 'description' => $description, - 'logo' => $logo, - 'url' => $url, - 'legalName' => $legalName, - 'legalCountry' => $legalCountry, - 'legalState' => $legalState, - 'legalCity' => $legalCity, - 'legalAddress' => $legalAddress, - 'legalTaxId' => $legalTaxId, - ])); - - if (false === $project) { - throw new Exception('Failed saving project to DB', 500); - } - - $response->json($project->getArrayCopy()); - } - ); - -$utopia->patch('/v1/projects/:projectId/oauth') - ->desc('Update Project OAuth') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'updateProjectOAuth') - ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') - ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'Provider Name', false) - ->param('appId', '', function () { return new Text(256); }, 'Provider App ID', true) - ->param('secret', '', function () { return new text(256); }, 'Provider Secret Key', true) - ->action( - function ($projectId, $provider, $appId, $secret) 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; - $secret = json_encode([ - 'data' => OpenSSL::encrypt($secret, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag), - 'method' => OpenSSL::CIPHER_AES_128_GCM, - 'iv' => bin2hex($iv), - 'tag' => bin2hex($tag), - 'version' => '1', - ]); - - $project = $consoleDB->updateDocument(array_merge($project->getArrayCopy(), [ - 'usersOauth'.ucfirst($provider).'Appid' => $appId, - 'usersOauth'.ucfirst($provider).'Secret' => $secret, - ])); - - if (false === $project) { - throw new Exception('Failed saving project to DB', 500); - } - - $response->json($project->getArrayCopy()); - } - ); - -$utopia->delete('/v1/projects/:projectId') - ->desc('Delete Project') - ->label('scope', 'projects.write') - ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'deleteProject') - ->param('projectId', '', 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); - } - - // Delete all children (keys, webhooks, tasks [stop tasks?], platforms) - - if (!$consoleDB->deleteDocument($projectId)) { - throw new Exception('Failed to remove project from DB', 500); - } - - // Delete all DBs - // $consoleDB->deleteNamespace($project->getUid()); - - // Optimize DB? - - // Delete all storage files - // Delete all storage cache - - $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(); - } - ); diff --git a/app/controllers/web/console.php b/app/controllers/web/console.php index a2d0753148..b61bbdf84e 100644 --- a/app/controllers/web/console.php +++ b/app/controllers/web/console.php @@ -140,8 +140,11 @@ $utopia->get('/console/keys') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout) { + $scopes = include __DIR__.'/../../../app/config/scopes.php'; $page = new View(__DIR__.'/../views/console/keys/index.phtml'); + $page->setParam('scopes', $scopes); + $layout ->setParam('title', APP_NAME.' - API Keys') ->setParam('body', $page); From 6ab90cd01e3397f444d40ca5c4adaba42d044325 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 16 Dec 2019 21:35:33 +0200 Subject: [PATCH 009/237] Fixed paths --- app/app.php | 5 +++-- app/controllers/api/account.php | 2 +- app/controllers/api/auth.php | 8 +++---- app/controllers/api/avatars.php | 8 +++---- app/controllers/api/database.php | 2 +- app/controllers/api/keys.php | 2 +- app/controllers/api/locale.php | 14 ++++++------ app/controllers/api/platforms.php | 2 +- app/controllers/api/projects.php | 2 +- app/controllers/api/storage.php | 2 +- app/controllers/api/tasks.php | 2 +- app/controllers/api/teams.php | 6 +++--- app/controllers/api/users.php | 2 +- app/controllers/api/webhooks.php | 2 +- app/controllers/web/console.php | 36 +++++++++++++++---------------- app/controllers/web/home.php | 20 ++++++++--------- public/index.php | 4 ++-- 17 files changed, 60 insertions(+), 59 deletions(-) diff --git a/app/app.php b/app/app.php index d9acd72f75..f48a33fb0a 100644 --- a/app/app.php +++ b/app/app.php @@ -436,7 +436,7 @@ $utopia->get('/v1/open-api-2.json') if (!$tests && !$service['sdk']) { continue; } - + /** @noinspection PhpIncludeInspection */ include_once $service['controller']; } @@ -722,7 +722,8 @@ $utopia->get('/v1/open-api-2.json') ksort($output['paths']); - $response->json($output); + $response + ->json($output); } ); diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 1bf8a68e38..b7b06638ab 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -13,7 +13,7 @@ use Database\Validator\Authorization; use DeviceDetector\DeviceDetector; use GeoIp2\Database\Reader; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/account') ->desc('Get Account') diff --git a/app/controllers/api/auth.php b/app/controllers/api/auth.php index 0ebe403548..bc3b953d07 100644 --- a/app/controllers/api/auth.php +++ b/app/controllers/api/auth.php @@ -18,7 +18,7 @@ use Database\Validator\UID; use Template\Template; use OpenSSL\OpenSSL; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->post('/v1/auth/register') ->desc('Register') @@ -137,7 +137,7 @@ $utopia->post('/v1/auth/register') $confirm['query'] = Template::mergeQuery(((isset($confirm['query'])) ? $confirm['query'] : ''), ['userId' => $user->getUid(), 'token' => $confirmSecret]); $confirm = Template::unParseURL($confirm); - $body = new Template(__DIR__.'/../config/locales/templates/'.Locale::getText('auth.emails.confirm.body')); + $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.confirm.body')); $body ->setParam('{{direction}}', Locale::getText('settings.direction')) ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) @@ -275,7 +275,7 @@ $utopia->post('/v1/auth/register/confirm/resend') $confirm['query'] = Template::mergeQuery(((isset($confirm['query'])) ? $confirm['query'] : ''), ['userId' => $user->getUid(), 'token' => $secret]); $confirm = Template::unParseURL($confirm); - $body = new Template(__DIR__.'/../config/locales/templates/'.Locale::getText('auth.emails.confirm.body')); + $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.confirm.body')); $body ->setParam('{{direction}}', Locale::getText('settings.direction')) ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) @@ -731,7 +731,7 @@ $utopia->post('/v1/auth/recovery') $reset['query'] = Template::mergeQuery(((isset($reset['query'])) ? $reset['query'] : ''), ['userId' => $profile->getUid(), 'token' => $secret]); $reset = Template::unParseURL($reset); - $body = new Template(__DIR__.'/../config/locales/templates/'.Locale::getText('auth.emails.recovery.body')); + $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.recovery.body')); $body ->setParam('{{direction}}', Locale::getText('settings.direction')) ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) diff --git a/app/controllers/api/avatars.php b/app/controllers/api/avatars.php index 3c5b99c75d..017fa8acbb 100644 --- a/app/controllers/api/avatars.php +++ b/app/controllers/api/avatars.php @@ -15,12 +15,12 @@ use BaconQrCode\Renderer\Image\ImagickImageBackEnd; use BaconQrCode\Renderer\RendererStyle\RendererStyle; use BaconQrCode\Writer; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $types = [ - 'browsers' => include __DIR__.'/../config/avatars/browsers.php', - 'credit-cards' => include __DIR__.'/../config/avatars/credit-cards.php', - 'flags' => include __DIR__.'/../config/avatars/flags.php', + 'browsers' => include __DIR__.'/../../config/avatars/browsers.php', + 'credit-cards' => include __DIR__.'/../../config/avatars/credit-cards.php', + 'flags' => include __DIR__.'/../../config/avatars/flags.php', ]; $avatarCallback = function ($type, $code, $width, $height, $quality) use ($types, $response, $request) { diff --git a/app/controllers/api/database.php b/app/controllers/api/database.php index 955026425d..62f7ef5fff 100644 --- a/app/controllers/api/database.php +++ b/app/controllers/api/database.php @@ -19,7 +19,7 @@ use Database\Validator\Authorization; use Database\Exception\Authorization as AuthorizationException; use Database\Exception\Structure as StructureException; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $isDev = (App::ENV_TYPE_PRODUCTION !== $utopia->getEnv()); diff --git a/app/controllers/api/keys.php b/app/controllers/api/keys.php index 63d60d98d8..177b767a43 100644 --- a/app/controllers/api/keys.php +++ b/app/controllers/api/keys.php @@ -11,7 +11,7 @@ use Database\Database; use Database\Document; use Database\Validator\UID; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $scopes = include __DIR__.'/../../../app/config/scopes.php'; diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index 0d6826569f..b220e32195 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -6,7 +6,7 @@ use Utopia\App; use Utopia\Locale\Locale; use GeoIp2\Database\Reader; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/locale') ->desc('Get User Locale') @@ -16,9 +16,9 @@ $utopia->get('/v1/locale') ->label('sdk.description', '/docs/references/locale/get-locale.md') ->action( function () use ($response, $request, $utopia) { - $eu = include __DIR__.'/../config/eu.php'; - $currencies = include __DIR__.'/../config/currencies.php'; - $reader = new Reader(__DIR__.'/../db/GeoLite2/GeoLite2-Country.mmdb'); + $eu = include __DIR__.'/../../config/eu.php'; + $currencies = include __DIR__.'/../../config/currencies.php'; + $reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb'); $output = []; $ip = $request->getIP(); $time = (60 * 60 * 24 * 45); // 45 days cache @@ -90,7 +90,7 @@ $utopia->get('/v1/locale/countries/eu') ->action( function () use ($response) { $countries = Locale::getText('countries'); /* @var $countries array */ - $eu = include __DIR__.'/../config/eu.php'; + $eu = include __DIR__.'/../../config/eu.php'; $list = []; foreach ($eu as $code) { @@ -113,7 +113,7 @@ $utopia->get('/v1/locale/countries/phones') ->label('sdk.description', '/docs/references/locale/get-countries-phones.md') ->action( function () use ($response) { - $list = include __DIR__.'/../config/phones.php'; /* @var $list array */ + $list = include __DIR__.'/../../config/phones.php'; /* @var $list array */ $countries = Locale::getText('countries'); /* @var $countries array */ @@ -154,7 +154,7 @@ $utopia->get('/v1/locale/currencies') ->label('sdk.description', '/docs/references/locale/get-currencies.md') ->action( function () use ($response) { - $currencies = include __DIR__.'/../config/currencies.php'; + $currencies = include __DIR__.'/../../config/currencies.php'; $response->json($currencies); } diff --git a/app/controllers/api/platforms.php b/app/controllers/api/platforms.php index 771a94844c..ec0b978837 100644 --- a/app/controllers/api/platforms.php +++ b/app/controllers/api/platforms.php @@ -11,7 +11,7 @@ use Database\Database; use Database\Document; use Database\Validator\UID; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/platforms') ->desc('List Platforms') diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index cbb4bda649..8c1c003b62 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -13,7 +13,7 @@ use Database\Document; use Database\Validator\UID; use OpenSSL\OpenSSL; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/projects') ->desc('List Projects') diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index cc88d07514..2eb2f4986e 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -22,7 +22,7 @@ use Storage\Compression\Algorithms\GZIP; use Resize\Resize; use OpenSSL\OpenSSL; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; Storage::addDevice('local', new Local('app-'.$project->getUid())); diff --git a/app/controllers/api/tasks.php b/app/controllers/api/tasks.php index 5d135f6079..c7ea8c19b6 100644 --- a/app/controllers/api/tasks.php +++ b/app/controllers/api/tasks.php @@ -16,7 +16,7 @@ use Database\Validator\UID; use OpenSSL\OpenSSL; use Cron\CronExpression; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/tasks') ->desc('List Tasks') diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 0b6ad0cb66..0fee00552e 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -18,7 +18,7 @@ use Database\Validator\Authorization; use Template\Template; use Auth\Auth; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/teams') ->desc('List Teams') @@ -358,7 +358,7 @@ $utopia->post('/v1/teams/:teamId/memberships') $redirect['query'] = Template::mergeQuery(((isset($redirect['query'])) ? $redirect['query'] : ''), ['inviteId' => $membership->getUid(), 'teamId' => $team->getUid(), 'userId' => $invitee->getUid(), 'secret' => $secret]); $redirect = Template::unParseURL($redirect); - $body = new Template(__DIR__.'/../config/locales/templates/'.Locale::getText('auth.emails.invitation.body')); + $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.invitation.body')); $body ->setParam('{{direction}}', Locale::getText('settings.direction')) ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) @@ -437,7 +437,7 @@ $utopia->post('/v1/teams/:teamId/memberships/:inviteId/resend') $redirect['query'] = Template::mergeQuery(((isset($redirect['query'])) ? $redirect['query'] : ''), ['inviteId' => $membership->getUid(), 'userId' => $membership->getAttribute('userId'), 'secret' => $secret]); $redirect = Template::unParseURL($redirect); - $body = new Template(__DIR__.'/../config/locales/templates/'.Locale::getText('auth.emails.invitation.body')); + $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.invitation.body')); $body ->setParam('{{direction}}', Locale::getText('settings.direction')) ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index f13ca28a70..ec9452b3ac 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -16,7 +16,7 @@ use Database\Validator\UID; use DeviceDetector\DeviceDetector; use GeoIp2\Database\Reader; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/users') ->desc('List Users') diff --git a/app/controllers/api/webhooks.php b/app/controllers/api/webhooks.php index 4c1ec59a32..78362e1a2e 100644 --- a/app/controllers/api/webhooks.php +++ b/app/controllers/api/webhooks.php @@ -13,7 +13,7 @@ use Database\Document; use Database\Validator\UID; use OpenSSL\OpenSSL; -include_once '../shared/api.php'; +include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/webhooks') ->desc('List Webhooks') diff --git a/app/controllers/web/console.php b/app/controllers/web/console.php index b61bbdf84e..8470e5ba7d 100644 --- a/app/controllers/web/console.php +++ b/app/controllers/web/console.php @@ -1,6 +1,6 @@ init(function () use ($layout, $utopia) { }); $utopia->shutdown(function () use ($utopia, $response, $request, $layout, $version) { - $header = new View(__DIR__.'/../views/console/comps/header.phtml'); - $footer = new View(__DIR__.'/../views/console/comps/footer.phtml'); + $header = new View(__DIR__.'/../../views/console/comps/header.phtml'); + $footer = new View(__DIR__.'/../../views/console/comps/footer.phtml'); $footer ->setParam('home', $request->getServer('_APP_HOME', '')) @@ -44,7 +44,7 @@ $utopia->get('/error/:code') ->label('scope', 'home') ->param('code', null, new \Utopia\Validator\Numeric(), 'Valid status code number', false) ->action(function ($code) use ($layout) { - $page = new View(__DIR__.'/../views/error.phtml'); + $page = new View(__DIR__.'/../../views/error.phtml'); $page ->setParam('code', $code) @@ -59,7 +59,7 @@ $utopia->get('/console') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout, $request) { - $page = new View(__DIR__.'/../views/console/index.phtml'); + $page = new View(__DIR__.'/../../views/console/index.phtml'); $page ->setParam('home', $request->getServer('_APP_HOME', '')) @@ -74,9 +74,9 @@ $utopia->get('/console/account') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/console/account/index.phtml'); + $page = new View(__DIR__.'/../../views/console/account/index.phtml'); - $cc = new View(__DIR__.'/../views/console/forms/credit-card.phtml'); + $cc = new View(__DIR__.'/../../views/console/forms/credit-card.phtml'); $page ->setParam('cc', $cc) @@ -92,7 +92,7 @@ $utopia->get('/console/notifications') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/v1/console/notifications/index.phtml'); + $page = new View(__DIR__.'/../../views/v1/console/notifications/index.phtml'); $layout ->setParam('title', APP_NAME.' - Notifications') @@ -104,7 +104,7 @@ $utopia->get('/console/home') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/console/home/index.phtml'); + $page = new View(__DIR__.'/../../views/console/home/index.phtml'); $layout ->setParam('title', APP_NAME.' - Console') @@ -116,7 +116,7 @@ $utopia->get('/console/settings') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/console/settings/index.phtml'); + $page = new View(__DIR__.'/../../views/console/settings/index.phtml'); $layout ->setParam('title', APP_NAME.' - Settings') @@ -128,7 +128,7 @@ $utopia->get('/console/webhooks') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/console/webhooks/index.phtml'); + $page = new View(__DIR__.'/../../views/console/webhooks/index.phtml'); $layout ->setParam('title', APP_NAME.' - Webhooks') @@ -141,7 +141,7 @@ $utopia->get('/console/keys') ->label('scope', 'console') ->action(function () use ($layout) { $scopes = include __DIR__.'/../../../app/config/scopes.php'; - $page = new View(__DIR__.'/../views/console/keys/index.phtml'); + $page = new View(__DIR__.'/../../views/console/keys/index.phtml'); $page->setParam('scopes', $scopes); @@ -155,7 +155,7 @@ $utopia->get('/console/tasks') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/console/tasks/index.phtml'); + $page = new View(__DIR__.'/../../views/console/tasks/index.phtml'); $layout ->setParam('title', APP_NAME.' - Tasks') @@ -167,7 +167,7 @@ $utopia->get('/console/database') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/console/database/index.phtml'); + $page = new View(__DIR__.'/../../views/console/database/index.phtml'); $layout ->setParam('title', APP_NAME.' - Database') @@ -186,7 +186,7 @@ $utopia->get('/console/database/collection') throw new Exception('Collection not found', 404); } - $page = new View(__DIR__.'/../views/console/database/collection.phtml'); + $page = new View(__DIR__.'/../../views/console/database/collection.phtml'); $page ->setParam('collection', $collection->getArrayCopy()) @@ -202,7 +202,7 @@ $utopia->get('/console/storage') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($request, $layout) { - $page = new View(__DIR__.'/../views/console/storage/index.phtml'); + $page = new View(__DIR__.'/../../views/console/storage/index.phtml'); $page ->setParam('home', $request->getServer('_APP_HOME', '')) @@ -218,7 +218,7 @@ $utopia->get('/console/users') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout, $providers) { - $page = new View(__DIR__.'/../views/console/users/index.phtml'); + $page = new View(__DIR__.'/../../views/console/users/index.phtml'); $page->setParam('providers', $providers); @@ -232,7 +232,7 @@ $utopia->get('/console/users/view') ->label('permission', 'public') ->label('scope', 'console') ->action(function () use ($layout, $providers) { - $page = new View(__DIR__.'/../views/console/users/view.phtml'); + $page = new View(__DIR__.'/../../views/console/users/view.phtml'); $layout ->setParam('title', APP_NAME.' - View User') diff --git a/app/controllers/web/home.php b/app/controllers/web/home.php index dc29fe1427..45e564b80f 100644 --- a/app/controllers/web/home.php +++ b/app/controllers/web/home.php @@ -1,13 +1,13 @@ setParam('version', $version) @@ -39,7 +39,7 @@ $utopia->get('/auth/signin') ->label('permission', 'public') ->label('scope', 'home') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/home/auth/signin.phtml'); + $page = new View(__DIR__.'/../../views/home/auth/signin.phtml'); $layout ->setParam('title', 'Sign In - '.APP_NAME) @@ -51,7 +51,7 @@ $utopia->get('/auth/signup') ->label('permission', 'public') ->label('scope', 'home') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/home/auth/signup.phtml'); + $page = new View(__DIR__.'/../../views/home/auth/signup.phtml'); $layout ->setParam('title', 'Sign Up - '.APP_NAME) @@ -63,7 +63,7 @@ $utopia->get('/auth/recovery') ->label('permission', 'public') ->label('scope', 'home') ->action(function () use ($request, $layout) { - $page = new View(__DIR__.'/../views/home/auth/recovery.phtml'); + $page = new View(__DIR__.'/../../views/home/auth/recovery.phtml'); $layout ->setParam('title', 'Password Recovery - '.APP_NAME) @@ -75,7 +75,7 @@ $utopia->get('/auth/confirm') ->label('permission', 'public') ->label('scope', 'home') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/home/auth/confirm.phtml'); + $page = new View(__DIR__.'/../../views/home/auth/confirm.phtml'); $layout ->setParam('title', 'Account Confirmation - '.APP_NAME) @@ -87,7 +87,7 @@ $utopia->get('/auth/join') ->label('permission', 'public') ->label('scope', 'home') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/home/auth/join.phtml'); + $page = new View(__DIR__.'/../../views/home/auth/join.phtml'); $layout ->setParam('title', 'Invitation - '.APP_NAME) @@ -99,7 +99,7 @@ $utopia->get('/auth/recovery/reset') ->label('permission', 'public') ->label('scope', 'home') ->action(function () use ($layout) { - $page = new View(__DIR__.'/../views/home/auth/recovery/reset.phtml'); + $page = new View(__DIR__.'/../../views/home/auth/recovery/reset.phtml'); $layout ->setParam('title', 'Password Reset - '.APP_NAME) @@ -112,7 +112,7 @@ $utopia->get('/error/:code') ->label('scope', 'home') ->param('code', null, new \Utopia\Validator\Numeric(), 'Valid status code number', false) ->action(function ($code) use ($layout) { - $page = new View(__DIR__.'/../views/error.phtml'); + $page = new View(__DIR__.'/../../views/error.phtml'); $page ->setParam('code', $code) diff --git a/public/index.php b/public/index.php index b37cdb732b..46e8b5305d 100644 --- a/public/index.php +++ b/public/index.php @@ -25,9 +25,9 @@ switch ($version) { // Switch between API version case 'v1': $service = $version . '/' . array_shift($path); include __DIR__ . '/../app/app.php'; - break; + break; case 'console': - default: + default: $service = $version . '/'; include __DIR__ . '/../app/app.php'; break; From 8a8ceef67bf71d8d16b5430252216f98e38044ee Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 16 Dec 2019 22:19:48 +0200 Subject: [PATCH 010/237] Fixed gravatr filter --- public/dist/scripts/app-all.js | 2 +- public/dist/scripts/app.js | 2 +- public/scripts/filters.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index 01ada97e5b..9aa0766215 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -2542,7 +2542,7 @@ return k;} function J(k){k=k.replace(/rn/g,"n");let d="";for(let F=0;F127&&x<2048){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128);}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128);}}} return d;} let C=Array();let P,h,E,v,g,Y,X,W,V;let S=7,Q=12,N=17,M=22;let A=5,z=9,y=14,w=20;let o=4,m=11,l=16,j=23;let U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;Pchar.charCodeAt(0)).reduce((a,b)=>a+b,0).toString();let themes=[{color:"27005e",background:"e1d2f6"},{color:"5e2700",background:"f3d9c6"},{color:"006128",background:"c9f3c6"},{color:"580061",background:"f2d1f5"},{color:"00365d",background:"c6e1f3"},{color:"00075c",background:"d2d5f6"},{color:"610038",background:"f5d1e6"},{color:"386100",background:"dcf1bd"},{color:"615800",background:"f1ecba"},{color:"610008",background:"f6d2d5"}];name=name.split(" ").map(function(n){if(!isNaN(parseFloat(n))&&isFinite(n)){return"";} +let i=B(Y)+B(X)+B(W)+B(V);return i.toLowerCase();};let size=element.dataset["size"]||80;let email=$value.email||$value||"";let name=$value.name||$value||"";name=(typeof name!=='string')?'':name;let theme=name.split("").map(char=>char.charCodeAt(0)).reduce((a,b)=>a+b,0).toString();let themes=[{color:"27005e",background:"e1d2f6"},{color:"5e2700",background:"f3d9c6"},{color:"006128",background:"c9f3c6"},{color:"580061",background:"f2d1f5"},{color:"00365d",background:"c6e1f3"},{color:"00075c",background:"d2d5f6"},{color:"610038",background:"f5d1e6"},{color:"386100",background:"dcf1bd"},{color:"615800",background:"f1ecba"},{color:"610008",background:"f6d2d5"}];name=name.split(" ").map(function(n){if(!isNaN(parseFloat(n))&&isFinite(n)){return"";} return n[0];}).join("")||"--";let background=themes[theme[theme.length-1]]["background"];let color=themes[theme[theme.length-1]]["color"];let def="https://ui-avatars.com/api/"+ encodeURIComponent(name)+"/"+ size+"/"+ diff --git a/public/dist/scripts/app.js b/public/dist/scripts/app.js index f56c6e04aa..94796f4214 100644 --- a/public/dist/scripts/app.js +++ b/public/dist/scripts/app.js @@ -268,7 +268,7 @@ return k;} function J(k){k=k.replace(/rn/g,"n");let d="";for(let F=0;F127&&x<2048){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128);}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128);}}} return d;} let C=Array();let P,h,E,v,g,Y,X,W,V;let S=7,Q=12,N=17,M=22;let A=5,z=9,y=14,w=20;let o=4,m=11,l=16,j=23;let U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;Pchar.charCodeAt(0)).reduce((a,b)=>a+b,0).toString();let themes=[{color:"27005e",background:"e1d2f6"},{color:"5e2700",background:"f3d9c6"},{color:"006128",background:"c9f3c6"},{color:"580061",background:"f2d1f5"},{color:"00365d",background:"c6e1f3"},{color:"00075c",background:"d2d5f6"},{color:"610038",background:"f5d1e6"},{color:"386100",background:"dcf1bd"},{color:"615800",background:"f1ecba"},{color:"610008",background:"f6d2d5"}];name=name.split(" ").map(function(n){if(!isNaN(parseFloat(n))&&isFinite(n)){return"";} +let i=B(Y)+B(X)+B(W)+B(V);return i.toLowerCase();};let size=element.dataset["size"]||80;let email=$value.email||$value||"";let name=$value.name||$value||"";name=(typeof name!=='string')?'':name;let theme=name.split("").map(char=>char.charCodeAt(0)).reduce((a,b)=>a+b,0).toString();let themes=[{color:"27005e",background:"e1d2f6"},{color:"5e2700",background:"f3d9c6"},{color:"006128",background:"c9f3c6"},{color:"580061",background:"f2d1f5"},{color:"00365d",background:"c6e1f3"},{color:"00075c",background:"d2d5f6"},{color:"610038",background:"f5d1e6"},{color:"386100",background:"dcf1bd"},{color:"615800",background:"f1ecba"},{color:"610008",background:"f6d2d5"}];name=name.split(" ").map(function(n){if(!isNaN(parseFloat(n))&&isFinite(n)){return"";} return n[0];}).join("")||"--";let background=themes[theme[theme.length-1]]["background"];let color=themes[theme[theme.length-1]]["color"];let def="https://ui-avatars.com/api/"+ encodeURIComponent(name)+"/"+ size+"/"+ diff --git a/public/scripts/filters.js b/public/scripts/filters.js index 4bda20ebec..0697961b3d 100644 --- a/public/scripts/filters.js +++ b/public/scripts/filters.js @@ -3,7 +3,7 @@ window.ls.filter if (!$value) { return ""; } - + // MD5 (Message-Digest Algorithm) by WebToolkit let MD5 = function(s) { function L(k, d) { @@ -216,7 +216,7 @@ window.ls.filter let email = $value.email || $value || ""; let name = $value.name || $value || ""; - name = (typeof stringValue !== 'string') ? '' : name; + name = (typeof name !== 'string') ? '' : name; let theme = name .split("") From 5b94d3dc51a17ef46ec23e59313f26977d4a4fc2 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 16 Dec 2019 22:30:14 +0200 Subject: [PATCH 011/237] Limited alerts to max of 5 --- public/dist/scripts/app-all.js | 5 +++-- public/dist/scripts/app.js | 5 +++-- public/scripts/services/alerts.js | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index 9aa0766215..8a131d67c7 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -2397,8 +2397,9 @@ children[prop]=template.cloneNode(true);element.appendChild(children[prop]);(ind container.set('$index',originalIndex,true,false);container.set('$prefix',originalPrefix,true,false);container.set('$as',originalAs,true,false);element.dispatchEvent(new Event('looped'));};let template=(element.children.length===1)?element.children[0]:window.document.createElement('li');echo();container.bind(element,expr+'.length',echo);let path=(expr+'.length').split('.');while(path.length){container.bind(element,path.join('.'),echo);path.pop();}}});window.ls.container.get('view').add({selector:'data-ls-template',template:false,repeat:true,controller:function(element,view,http,expression,document){let template=expression.parse(element.getAttribute('data-ls-template'));let type=element.getAttribute('data-type')||'url';element.innerHTML='';if('script'===type){let inlineTemplate=document.getElementById(template);if(inlineTemplate&&inlineTemplate.innerHTML){element.innerHTML=inlineTemplate.innerHTML;element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));} else{element.innerHTML='Missing template "'+template+'"';} return;} -http.get(template).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});}});window.ls.error=function(){return function(error){console.error("ERROR-APP",error);};};window.addEventListener("error",function(event){console.error("ERROR-EVENT:",event.error.message,event.error.stack);});document.addEventListener("logout",function(){window.location="/auth/signin";});document.addEventListener("http-get-401",function(){document.dispatchEvent(new CustomEvent("logout"));},true);(function(window){"use strict";window.ls.container.set('alerts',function(window){return{list:[],counter:0,add:function(message,time){var scope=this;message.id=this.counter++;scope.list.unshift(message);if(time>0){window.setTimeout(function(message){return function(){scope.remove(message.id)}}(message),time);} -return message.id;},remove:function(id){let scope=this;for(let index=0;indexscope.max){scope.list.pop();scope.counter--;} +if(time>0){window.setTimeout(function(message){return function(){scope.remove(message.id)}}(message),time);} +return message.id;},remove:function(id){let scope=this;for(let index=0;index';} return;} -http.get(template).then(function(element){return function(data){element.innerHTML=data;view.render(element);element.dispatchEvent(new CustomEvent('template-loaded',{bubbles:true,cancelable:false}));}}(element),function(){throw new Error('Failed loading template');});}});window.ls.error=function(){return function(error){console.error("ERROR-APP",error);};};window.addEventListener("error",function(event){console.error("ERROR-EVENT:",event.error.message,event.error.stack);});document.addEventListener("logout",function(){window.location="/auth/signin";});document.addEventListener("http-get-401",function(){document.dispatchEvent(new CustomEvent("logout"));},true);(function(window){"use strict";window.ls.container.set('alerts',function(window){return{list:[],counter:0,add:function(message,time){var scope=this;message.id=this.counter++;scope.list.unshift(message);if(time>0){window.setTimeout(function(message){return function(){scope.remove(message.id)}}(message),time);} -return message.id;},remove:function(id){let scope=this;for(let index=0;indexscope.max){scope.list.pop();scope.counter--;} +if(time>0){window.setTimeout(function(message){return function(){scope.remove(message.id)}}(message),time);} +return message.id;},remove:function(id){let scope=this;for(let index=0;index scope.max) { + scope.list.pop(); + scope.counter--; + } if (time > 0) { // When 0 alert is unlimited in time window.setTimeout(function (message) { @@ -20,6 +29,7 @@ }(message), time); } + return message.id; }, remove: function (id) { @@ -29,11 +39,14 @@ let obj = scope.list[index]; if (obj.id === parseInt(id)) { + scope.counter--; + if (typeof obj.callback === "function") { obj.callback(); } scope.list.splice(index, 1); + }; } } From 795f5a138db05848245ddaf6ef0208a8ec9d71f8 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 17 Dec 2019 05:28:16 +0200 Subject: [PATCH 012/237] Updated changelog --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 13d1555de5..75c1cea240 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,10 +6,12 @@ * New database rule validation options * Update docs example with auth info * Allow non-web platform skip origin header +* Limited to console UI to show max 5 alerts at the same time ## Bug Fixes * Fixed bug where user status was saved as a string instead of an integer +* Fixed gravatar icons not showing up correctly on the console # Version 0.4.0 (PRE-RELEASE) From d8e93711563bd44aa034358df8bc133851734871 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 17 Dec 2019 05:40:37 +0200 Subject: [PATCH 013/237] Changed nav text size --- public/dist/styles/default-ltr.css | 2 +- public/dist/styles/default-rtl.css | 2 +- public/styles/scopes/console.less | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/public/dist/styles/default-ltr.css b/public/dist/styles/default-ltr.css index d9f2df5bd6..1c91c333d4 100644 --- a/public/dist/styles/default-ltr.css +++ b/public/dist/styles/default-ltr.css @@ -1 +1 @@ -.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300;font-size:16px}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8sg4EIBSkNCIeIDYBVBQkAfQYGP48GBoyAcQYGG4ohBQcIh4kGAAAAAAI////+APpAwsADwAfAC8APwBPAF8AbwB/AHZAc3l4cUlIQQYICWlhYCkhIAYEBVlYUVAZGBEQCAIDOTgxCQgBBgABBEcPAQkOAQgFCQhgDQEFDAEEAwUEXgsBAwoBAgEDAl4HAQEAAAFUBwEBAQBWBgEAAQBKfXt1c21rZWRdW1VUTUwmJhcmFxcXFxQQBR0rNxUUBicjIiY3NTQ2NzMyFicVFAYnIyImNzU0NhczMhYnFRQGByMiJjc1NDY7ATIWARUUBichIiYnNTQ2NyEyFgEVFAYrASImNzU0NjczMhYBFRQGJyEiJic1NDYXITIWJxUUBgchIiYnNTQ2MyEyFicVFAYjISImJzU0NjchMhaPCghrBwwBCghrBwwBCghrBwwBCghrBwwBCghrBwwBCghrBwwDWAoI/RIHCgEMBgLuBwz8pgoIawcMAQoIawcMA1gKCP0SBwoBDAYC7gcMAQoI/RIHCgEMBgLuBwwBCgj9EgcKAQwGAu4HDHZrBwwBCghrBwoBDNBrBwwBCghrBwwBCs5rBwoBDAZrCAoK/kxrBwwBCghrBwoBDAJ9awgKCghrBwoBDP5NawcMAQoIawcMAQrOawcKAQwGawgKCs9rCAoKCGsHCgEMAAIAAP/5A1kCxAAYAEAAUEBNDAEBAgFHIQEAAUYAAwcGBwMGbQACBgEGAgFtAAEFBgEFawAABQQFAARtAAcABgIHBmAABQAEBVQABQUEWAAEBQRMLCUqJxMWIxQIBRwrARQHAQYiJj0BIyImJzU0NjczNTQ2FhcBFjcRFAYrASImNycmPwE+ARczMjYnETQmByMiNCY2LwEmPwE+ARczMhYClQv+0QseFPoPFAEWDvoUHgsBLwvEXkOyBwwBAQEBAgEICLIlNgE0JrQGCgICAQEBAgEICLJDXgFeDgv+0AoUD6EWDtYPFAGhDhYCCf7QCrX+eENeCggLCQYNBwgBNiQBiCU2AQQCCAQLCQYNBwgBXgAAAAIAAP+xA1oDCwAIAGoARUBCZVlMQQQABDsKAgEANCgbEAQDAQNHAAUEBW8GAQQABG8AAAEAbwABAwFvAAMCA28AAgJmXFtTUUlIKyoiIBMSBwUWKwE0JiIOARYyNiUVFAYPAQYHFhcWFAcOASciLwEGBwYHBisBIiY1JyYnBwYiJyYnJjQ3PgE3Ji8BLgEnNTQ2PwE2NyYnJjQ3PgEzMh8BNjc2NzY7ATIWHwEWFzc2MhcWFxYUBw4BBxYfAR4BAjtSeFICVnRWARwIB2gKCxMoBgUPUA0HB00ZGgkHBBB8CAwQGxdPBhAGRhYEBQgoCg8IZgcIAQoFaAgOFyUGBQ9QDQcITRgaCQgDEXwHDAEPHBdPBQ8HSBQEBAkoCg8IZgcKAV47VFR2VFR4fAcMARAeFRsyBg4GFVABBTwNCEwcEAoHZwkMPAUGQB4FDgYMMg8cGw8BDAd8BwwBEBkaIC0HDAcUUAU8DQhMHBAKB2cJCzsFBUMcBQ4GDDIPHBoQAQwAAAABAAD/9wOIAsMALwBNQEouLCogAgUFBhkBBAUWEgIDBAsBAQIERwAGBQZvAAUEBW8ABAMEbwADAgNvAAIBAm8AAQAAAVQAAQEAWAAAAQBMJBYWIxEiKAcFGysBBgcVFA4DJyInFjMyNy4BJxYzMjcuAT0BFhcuATQ3HgEXJjU0NjcyFzY3Bgc2A4glNSpWeKhhl30TGH5iO1wSEw8YGD9SJiwlLBlEwHAFakpPNT02FTs0Am42JxdJkIZkQAJRAk0BRjYDBg1iQgIVAhlOYCpTZAUVFEtoATkMIEAkBgAAAAYAAP+eA48DHQADAAcACwAQABkAHgBKQEcAAQAAAwEAXgADAAIFAwJeAAUABAYFBF4KDAgDBgcHBlQKDAgDBgYHWAsJAgcGB0wSER4dHBsWFREZEhkREhEREREREA0FHCsBITUhASE1IQEhNSEBNDIUIiUyFg4BLgI2FzQyFCIDj/yDA33+sf3SAi4BT/yDA338g3BwARgWIgIeMCACJLxwcAKtcP6xcP6vb/58OHFxIiwkASIuIDc4cQAAAQAA/+8C1AKGACQAHkAbIhkQBwQAAgFHAwECAAJvAQEAAGYUHBQUBAUYKyUUDwEGIi8BBwYiLwEmND8BJyY0PwE2Mh8BNzYyHwEWFA8BFxYC1A9MECwQpKQQLBBMEBCkpBAQTBAsEKSkECwQTA8PpKQPcBYQTA8PpaUPD0wQLBCkpBAsEEwQEKSkEBBMDy4PpKQPAAIAAP/5A5ICxQAQADEALkArLiYlGBUPDg0IAQMMAQABAkcEAQMBA28AAQABbwIBAABmKigjIiERFAUFFysBERQGByM1IxUjIiYnEQkBFjcHBgcjIicJAQYmLwEmNjcBNjIfATU0NjsBMhYdARcWFAMSFg7Wj9YPFAEBQQFBAXwiBQcCBwX+fv5+Bw0FIwQCBQGREjATiAoIawgKegYBKP71DxQB1tYWDgEPAQj++AEkKQUBAwFC/r4EAgUpBg4FAU4PD3FsCAoKCONmBBAAAAABAAAAAAI8Ae0ADgAXQBQAAQABAUcAAQABbwAAAGY1FAIFFisBFA8BBiIvASY0NjMhMhYCOwr6CxwL+gsWDgH0DhYByQ4L+gsL+gscFhYAAAEAAP+xAhcDUgAUADNAMAABAAYBRwADAgNwAAYAAAEGAGAFAQECAgFSBQEBAQJWBAECAQJKIxERERETIQcFGysBFSMiBh0BMwcjESMRIzUzNTQ2MzICF1cwIqQWjquOjnRhUgNLkygoaqX+WAGopXpocgAAAQAA/7EDZAMLADUAHUAaNSwjGhEIBgABAUcAAQABbwAAAGYpJjsCBRUrAR4BDwEOAS8BFRQGByMiJjc1BwYmLwEmNj8BJy4BPwE+AR8BNTQ2NzMyFh0BNzYWHwEWBg8BAzsaDg4jDzoZlSodRx0sAZQaOg4kDg4blJQaEA8kDzgblCoeRx0qlRo4ECMPEBmUAQgOOho9Gg4OVasdKgEsHKtVDxAZPRo6DlZWDjoaPRoODlWrHSoBLByrVQ8QGT0aOg5WAAQAAP+xA6EDLgAIABEAKQBAAEZAQzUBBwYJAAICAAJHAAkGCW8IAQYHBm8ABwMHbwAEAAIEVAUBAwEBAAIDAGAABAQCWAACBAJMPTwjMyMiMiU5GBIKBR0rJTQmDgIeATY3NCYOAh4BNjcVFAYjISImJzU0NhczHgE7ATI2NzMyFgMGKwEVFAYHIyImJzUjIiY/ATYyHwEWAsoUHhQCGBoYjRQgEgIWHBhGIBb8yxceASAW7gw2I48iNg3uFiC2CRiPFA+PDxQBjxcTEfoKHgr6Eh0OFgISIBIEGgwOFgISIBIEGomzFiAgFrMWIAEfKCgfHgFSFvoPFAEWDvosEfoKCvoRAAAAAAUAAP86A6oDgQAoADEAQgBLAFQAgEB9GwoCBAEfAQoGAAENCgNHAAQBBgEEBm0ABgoBBgprAAkNBw0JB20PAQoADQkKDWAABwAIDAcIYBABDAALBQwLYAMBAQECWAACAgxIDgEFBQBYAAAADQBJTUxEQyopUVBMVE1USEdDS0RLQD86NzQyLi0pMSoxGCMzKBQRBRkrARYVFAAEADU0Ejc1JzUjIiY+ATczMh4BBicjFQcVFhc/ATYyFgYPAQYBMjYQJgQGEBYTMzIWFAYnIyImPQE0NjIWBycyFhIGIiYSNhMyNi4BDgIWA1dT/uz+fv7s8LICMxUgAhwX0BUeAiITNAGccgYbDyogAg4aBf50l9bW/tLW1stoFSAgFZwVICAqIAE0gbYCuv68BLSDa5oCltqWApoCGXWUwv7uAgEWwLQBChMBAzMgKh4BICgiATMBAxFsCRoPHiwPGgX9hdYBLtYC0v7O0gGeHiogAR4WnBYeHhaduP7+uLgBArj9wprWmgKW2pYAAgAA/9gD6ALkABUAJABGQEMjAQQCJBkCAQQDBAJHIgEBRQABAAIEAQJeAAUABAMFBGAGAQMAAANSBgEDAwBYAAADAEwAACEgFxYAFQAVFCU1BwUXKyU1NxUUBiMhIiY1ETQ2MyEOAQ8BIxEBIgYHND4FMzUFAQLuZB4U/RIUHhwWASAgNgwKggI4pphUAhAcPFCGUgFM/rQ8OFK8FB4eFAImFhwYMg4M/j4BXFKMCBxUSlxCLpz6/vwAAAABAAD/sQPoAwwAHAAhQB4RAQABAUcCAQEAAW8DAQAAZgEAFxUNCwAcARwEBRQrBSInAScuAzU0NjcyHgIXPgMXMhYUBwEGAfQOC/6kDwoqIhqOfSJIPi4TFCxARiN9joD+pQpPCgFQDwo2NlAle4oBGCoiFRQkKBoBjPWA/rEKAAEAAP/5AxIDCwAjAClAJgAEAwRvAAEAAXAFAQMAAANUBQEDAwBYAgEAAwBMIzMlIzMjBgUaKwEVFAYnIxUUBgcjIiY3NSMiJic1NDY3MzU0NjsBMhYXFTMyFgMSIBboIBZrFiAB6BceASAW6B4XaxceAegXHgG3axYgAekWHgEgFekeF2sXHgHoFiAgFuggAAH//wAAAjsByQAOABFADgABAAFvAAAAZhUyAgUWKyUUBichIi4BPwE2Mh8BFgI7FA/+DA8UAgz6Ch4K+gqrDhYBFB4L+goK+gsAAAADAAD/+QNaAsQADwAfAC8AN0A0KAEEBQgAAgABAkcABQAEAwUEYAADAAIBAwJgAAEAAAFUAAEBAFgAAAEATCY1JjUmMwYFGislFRQGByEiJic1NDY3ITIWAxUUBichIiYnNTQ2FyEyFgMVFAYjISImJzU0NhchMhYDWRQQ/O8PFAEWDgMRDxYBFBD87w8UARYOAxEPFgEUEPzvDxQBFg4DEQ8WZEcPFAEWDkcPFAEWARBIDhYBFA9IDhYBFAEORw4WFg5HDxYBFAAAAAABAAD/wAKYA0QAFAAXQBQBAQABAUcAAQABbwAAAGYXFwIFFisJAhYUDwEGIicBJjQ3ATYyHwEWFAKO/tcBKQoKXQscC/5iCwsBngoeCl0KAqr+2P7XCh4KXQoKAZ8KHgoBngsLXQoeAAEAAP/AAnQDRAAUABdAFAkBAAEBRwABAAFvAAAAZhwSAgUWKwkBBiIvASY0NwkBJjQ/ATYyFwEWFAJq/mILHAtdCwsBKP7YCwtdCh4KAZ4KAWn+YQoKXQscCwEpASgLHAtdCwv+YgscAAAAAAIAAP/5A1kCxAANACMAM0AwFgEEAwFHAgEAAQMBAANtAAUAAQAFAV4AAwQEA1IAAwMEWAAEAwRMKTQRIxQQBgUaKwEzNCYnAyEDDgEVMxczJREUBgchIiYnETQ3Ez4BFyEyFhcTFgI7sAIBdv51dgECsDWzAVMUEPzvDxQBDoUFHg4B0Q4eBYUOAToCBgEBFf7rAQYCa1v+8w8UARYOAQ0iIgE0DhQBEg/+zCIAAAAAAwAA/3YDoAMLAAgAFAAuADNAMCYBBAMoJxIDAgQAAQEAA0cAAwQDbwAEAgRvAAIAAm8AAAEAbwABAWYcIy0YEgUFGSs3NCYOAh4BNiUBBiIvASY0NwEeASUUBw4BJyImNDY3MhYXFhQPARUXNj8BNjIW1hQeFAIYGhgBZv6DFToWOxUVAXwWVAGZDRuCT2iSkmggRhkJCaNsAipLIQ8KHQ4WAhIgEgQa9v6DFBQ9FDsWAXw3VN0WJUteAZLQkAIUEAYSB159PAIZLRQKAAAAAAEAAP9pA+gCwwAmABxAGRsBAAEBRw0BAEQAAQABbwAAAGYkIiMCBRUrARQOASMiJwYHBgcGJic1JjYmPwE2PwE+Aj8BLgEnND4CMzIeAQPohuaIJypukxskCg4DAgQCAwwEDRQHFBAHD1hkAVCEvGSI5oYBXmGkYARhJggEAQwKAQIIBAMPBQ4WCBwcEyoyklRJhGA4YKQABwAA/2oDEANSAAcACwAPABMAFwAbAB8ARkBDEw8NAwQAAUceGxoZFxYVEhEJAEUCAQAEAG8ABAAFAQQFXgABAwMBUgABAQNWBgEDAQNKAAALCgkIAAcABxEREQcFFysVERcDIREzESUhFSE/AQUHJTcFBwE3BQcDNxMHEzcTB0wDAfVP/e4BiP54AQgBiQj+jBcBfBj+zCwBUi2qReZGF1RBVJYBoQH+sQFO/mHbU5RVJlXTUmtSATRJzEkBmTL+vzIBvA7+ew4AAAAAAwAA/8gDLQL1ABcAIAA1AKBACg4BAwERAQQDAkdLsBZQWEAyAAIAAQECZQsBBwkBAAIHAGAAAQADBAEDYQAECgEFBgQFYAAGCAgGVAAGBghYAAgGCEwbQDMAAgABAAIBbQsBBwkBAAIHAGAAAQADBAEDYQAECgEFBgQFYAAGCAgGVAAGBghYAAgGCExZQCEiIRkYAQAsKyE1IjUdHBggGSAQDw0LBwUEAwAXARcMBRQrASIGFTM0MzIWFRQGIyInFTM1PgE1NC4BAyIGFBYyNjQmAzIXFhcWFAcGBwYiJyYnJjQ3Njc2AZVOUoIdDg0iJAsJgjAxKkouHy0tPi4uH25fXDY4ODZcX91eXDY3NzZcXgJqVE86HB4jHwF6MwxFNzBKKf5rLj8uLj4vAiA4NVxf3V5cNjg4Nlxe3V9cNTgAAAAAAv/9/7EDXwMLABUAIgAwQC0HAQIBAUcABAAEbwAAAQBvAAECAW8AAgMDAlQAAgIDWAADAgNMFRcXFBQFBRkrATQvASYiDwEnJiIPAQYUHwEWMjcBNhcUDgEiLgI+ATIeAQLNCjMLHAvkfgscCzMKCsoKHgsBLwqMcsboyG4Gerz0un4BuBAKMgsL434LCzIKHwrKCgoBLwpLdcR0dMTqxHR0xAAD/+P/lgQfAyYADAAVACQANkAzAAEABAUBBGAABQADAgUDYAYBAgAAAlQGAQICAFgAAAIATA4NIiEbGhIRDRUOFRUyBwUWKyUWBiMhIicmNwE2MhcDMjY0JiIGHgETNjU0LgEGFxQfARYyNzYD30Boff2PfjM1QAE1PtY/qSIuLkQwAix5BTRMNgEGSAUQA0q6a7ldXGsCAWtr/Y8uRDAwRC4Bgw0TJjQCOCQREbIJCbIAAAAC//4AAAOQAoAAEQAjACRAIQAAAQBvAAEDAW8AAwICA1QAAwMCWAACAwJMFzkXMwQFGCsTJjc2MyEyBwYHBg8BBiIvASYFNhURFAYjISImNRE0FwUWMjceIAQCGANOJhIIEA6ythA6ErayA0QUIhD84BAiFAGAEjgSAkoSFg4gDggGYGIKCmJgXgoU/pAQICAQAXAUCsgKCgAAAAADAAD/ugOYA0kAHAA7AFwApkAaOgEJBVdHAgAEEwsCAQcDR1YrAglGBgIHAkZLsApQWEA2AAUDCQQFZQABBwIAAWUACAADBQgDYAAJAAAHCQBgAAQABwEEB2EAAgYGAlQAAgIGWAAGAgZMG0A4AAUDCQMFCW0AAQcCBwECbQAIAAMFCANgAAkAAAcJAGAABAAHAQQHYQACBgYCVAACAgZYAAYCBkxZQA5ZWBcXHCgXGBoYFAoFHSslNC8BJiIHFx4BHwEUBgciLgEvAQYUHwEWMj8BNgE0LwEmIg8BBhQfARYyNycuAjU0NhcyFh8BFh8BNgEUDwEGIi8BJjQ3JwYiLwEmND8BNjIfARYUBxc2Mh8BFgMtEHQQLhAWAwwBAiAWCA4OBBYTEHMPLRBSEP53D3MQLBBSEBB0Dy4RFwMKBB4XCQ4HCwQIChIB9DBSLocucy4xMTCHL3QvL1Ivhi9zLjExMIcvdC+rFw90EBIWAxAGDxceAQQKBBYRLg90Dw9REAGfFhBzEA9SDywQdA8RFwMODgkWIAEEBQgDCQsR/o5CL1EvMHMvhzAxMS90L4YuUi4vdC6IMDExL3QvAAAAAgAA/58DkAMdABQAHwBYQFUHAQEFAUcIAQEPAQICRgACAQMBAgNtAAMEAQMEawAEBG4HAQAABgUABmAIAQUBAQVUCAEFBQFYAAEFAUwWFQEAGxoVHxYfDg0MCwoJBgQAFAEUCQUUKwEyFg4BIyInBxUjFSMVITUBJjU0NhMyNi4BJyIGFRQWAnlzpAKgdhwXBXBv/rEBVAWkdBYiAh4ZGCAiAx2k5qQFBXBvceABVBcdc6L+siAyHAIiFRgiAAAAEgAA/9kDLgLjAA8AFAAYABwAIAAkACgALQAxADYAOgA+AEMASABLAE4AUQBUAGxAaUhHQ0JBQD49PDo5ODYzMTAvLSwqKCcmJCMiIB8eHBsaFxYVFBMlBQEBRwsBAAoHBgQDBQEFAAFeCQgCBQICBVIJCAIFBQJWAAIFAkoBAFRTUVBOTUtKRkU1NBIRCwkIBwUEAA8BDgwFFCsBMhYUBisBAyEDIyImNDYzBScjBxcHFzcnNxc3JxcHFzcnFzcnBzcnBycHHwE3FwcXNxcHFzM/AicHPwEnBz8BJwcXLwEjBxclNyMTFzMlBzMTNyMDARIbGxIGh/5KhgsTGhoTAUgTdhJNdBk8TiBNTk5tTExNLU1NTW1NTUyOKxEaTh9NTU4fTDkmOiBNTU2xGRFMdA01TEwfE3USTf6EKDBoEUsBEGtVcQo7AuMaJhr9UAKwGiYaaxERTrSBPE0gTU1MbE1NTW1NTUwtTkxMTCpVG076TkxMH006OiBMTk4qgBFNs0AzTE67ERFONyj98V1paQI9LwAC//j/tgPsAwgAHAAjAHe1HgECAQFHS7ALUFhAKQAHBgdvCQgCBgEGbwUBAQIBbwQBAgMDAmMAAwAAA1IAAwMAWQAAAwBNG0AoAAcGB28JCAIGAQZvBQEBAgFvBAECAwJvAAMAAANSAAMDAFkAAAMATVlAER0dHSMdIxETESITERY2CgUcKyUeAQ8BDgEjISImLwEmPwEzBzMyHwEhNzY7ASczJwUlMxEzEQPIEhIGHAQkFvzQFiQEHAoqnmKqsggEKAEsKAgEsqpiMP78/vymvsYKLBKaFBoaFJowGGyCCG5uCILW9PQBAP8AAAP//gAAA+gCYAAgACQAKAA2QDMAAAgGBwMEAwAEXgUBAwEBA1IFAQMDAVgCAQEDAUwlJSEhJSglKCcmISQhJBQnKhgJBRgrESY3JTYXFg8BIScmNzYXBRYHAwYjISYvASYPAQYjISYnNxchNzMXITcCCgFoHQwLGeMCkuQZCw4dAWoLAhsIGf7HGQYxJzUyBhr+yBsEJxMBBCvdKQEDFAGCDQy6CxshDGhoEB0bC7oMDf8AHgIY3xkY4BoCHOK9vb29AAAMAAD/+QMSAwsAAwAHAAsADwATABcAGwAfACMALwAzADcAwEC9JBsjAxkLAQkDGQleHgUdAwMEAQIIAwJeCgEIGgEYDQgYXgAHFg0HUgAWEwAWUiIXFR8EDQATAQ0TXhwBARIBAAYBAF4hESAPBAYMDAZSIREgDwQGBgxWFBAOAwwGDEo0NDAwJCQgIBwcGBgICAQEAAA0NzQ3NjUwMzAzMjEkLyQvLi0sKyopKCcmJSAjICMiIRwfHB8eHRgbGBsaGRcWFRQTEhEQDw4NDAgLCAsKCQQHBAcGBQADAAMRJQUVKzcVIzUTFSM1IRUjNQEzNSM1MzUjBTM1IwMRIREBFSM1MxUjNRMVIzUjFSMRMxUzNQERIREhESER1kdHRwH0SP4M19fX1wGt1taP/psCg0jXSEjXR0fWR/6b/psDEv6bz0dHAa1ISEhI/cXW1tbW1v6b/psBZf7iR0dHRwEe1kfWAWVHRwGt/poBZv6aAWYAAAADAAD/wwPoA0AAEgA3AHEAaEBlawEBCw0BAAEpAgIFBjEBBAVWJwIDBAVHAAsBC28ABgAFAAYFbQAFBAAFBGsAAgMCcAoBAQcBAAYBAGAJAQQDAwRUCQEEBANYCAEDBANMbm1qaVtYUlBCQD08NDMwLzMVNhgMBRgrAQYHJy4DJyMiJj0BNDY7ATIBFA8BBiImPQEjIgYvAS4FJzY3HgQ3MzU0NjIfARYRFA8BBiImPQEjIg4CBwYHDgIPAQ4CJyMiJj0BNDY7ATI+Ajc2PwE+BTczNTQ2Mh8BFgF0IisUCB4aLhZ9CAoKCH2LAs4FswUPCjAeHhonDS4YKBokDSErDBAeGiwYjwoOB7IFBbMFDwqPGywgGgwSGRAYJBIpFzZCJn0ICgoIfRsqJBQQERocDCQkLjZAKI8KDgeyBQJGNGUpECYaDAIKCGsICv3FCAWzBQwGawICAwEKChYWJhQ0ZBkeKhQUAmsICgWyBQHsCAWzBQwGaxAiIhsiPSUyRBUvGhgWAQoIawgKEiAkGSM9PhpAMCwiDANrCAoFsgUAAAMAAAAAA+gCdgAUAB0ALABDQEAiAQQFAUcGAQAAAwUAA2AABQAEAgUEYAcBAgEBAlQHAQICAVgAAQIBTBYVAQAqKCUkGhkVHRYdCwoAFAEUCAUUKwEyHgMUDgMiLgM0PgMTMjY0JiIGFBY3Fj4BFxQGIiY0NjMyDgEB9FyqcFYoKFZwqriqcFYoKFZwqlxcgoK4goJcCDoqBEJcQEAuDggQAnYySlA+HDxSSjIySlI8HD5QSjL+En6yfn6yftYIDAoOLD4+Wj4uMAAAAAIAAP/5AoMDCwAHAB8AKkAnBQMCAAECAQACbQACAm4ABAEBBFQABAQBWAABBAFMIxMlNhMQBgUaKxMhNTQmDgEXBREUBgchIiYnETQ2FzM1NDYyFgcVMzIWswEdVHZUAQHQIBb96RceASAWEZTMlgISFx4BpWw7VAJQPaH+vhYeASAVAUIWIAFsZpSUZmweAAL///9qA6EDDQAIACEAMkAvHwEBAA4BAwECRwACAwJwAAQAAAEEAGAAAQMDAVQAAQEDWAADAQNMFyMUExIFBRkrATQuAQYUFj4BARQGIi8BBiMiLgI+BB4CFxQHFxYCg5LQkpLQkgEeLDoUv2R7UJJoQAI8bI6kjmw8AUW/FQGCZ5IClsqYBoz+mh0qFb9FPmqQoo5uOgRCZpZNe2S/FQADAAD/agPEA1MADAAaAEIAhUAMAAECAAFHKBsCAwFGS7AOUFhALgcBBQEAAQVlAAACAQBjAAgABAMIBGAAAwABBQMBYAACBgYCVAACAgZYAAYCBkwbQC8HAQUBAAEFZQAAAgEAAmsACAAEAwgEYAADAAEFAwFgAAIGBgJUAAICBlgABgIGTFlADB8iEigWESMTEgkFHSsFNCMiJjc0IhUUFjcyJSEmETQuAiIOAhUQBRQGKwEUBiImNSMiJjU+BDc0NjcmNTQ+ARYVFAceARcUHgMB/QkhMAESOigJ/owC1pUaNFJsUjQaAqYqHfpUdlT6HSocLjAkEgKEaQUgLCAFaoIBFiIwMGAIMCEJCSk6AamoASkcPDgiIjg8HP7XqB0qO1RUOyodGDJUXohNVJIQCgsXHgIiFQsKEJJUToZgUjQAAAAG////agQvA1IAEQAyADsARABWAF8Ab0BsTw4CAwIBRxEBCQsJbwALCAtvEAEIAghvDwECAwJvBwEFAAEABQFtDAoCAQYAAQZrAAYEAAYEawAEBG4OAQMAAANUDgEDAwBYDQEAAwBMXl1aWVZUUlBLSklHQ0I/Pjo5GRUUGTcjEyEQEgUdKwEGByMiJjc0MzIeATcyNwYVFAEUBiMhIiYnND4FMzIeAj4BPwE2NzIeBBcBFAYiJjQ2MhYBFAYuAT4CFgUUBicjJic2NTQnFjMyPgEXMicUBiImNDYyFgFLWjpLLUABRQQqQiEmJQMCg1JD/hhEUAEEDBAgJjohBiQuSFBGGSkQCCI4JiAQDgH9xlR2VFR2VAGJfrCAAny0egFDPi5LOVotAyUlIUQoBEVHVHZUVHZUAV4DRCwsxRYaAQ0VEE7+W0JOTkIeOEI4NCYWGBwaAhYQGgoCFiY0OEIcAo87VFR2VFT+71l+Anq2eAaE0ysuAUQDQU4QFQ0YGAGPO1RUdlRUAAIAAP+xAjwDCwAIABgAJkAjAAEAAgABAm0AAgJuAAMAAANUAAMDAFgAAAMATBcXExIEBRgrATQmIgYUFjI2NxQHAw4BIiYnAyY1NDYyFgGtVHZUVHZUjhLLCSQmJgfMEqjsqAHtO1RUdlRUOz0n/lASFhYSAbAnPXaoqAADAAD/tgPoAwgAGAAgAC0AqrUlAQkLAUdLsA1QWEA7BgMCAQcFBwEFbQwBBQAHBQBrBAEACAcACGsKAQgLCwhjAAIABwECB2ANAQsJCQtSDQELCwlZAAkLCU0bQDwGAwIBBwUHAQVtDAEFAAcFAGsEAQAIBwAIawoBCAsHCAtrAAIABwECB2ANAQsJCQtSDQELCwlZAAkLCU1ZQB4hIQAAIS0hLSwrKSYjIiAdGxoAGAAYEiQ1IhEOBRkrARUhEzY7ATY/AT4BOwEyFhcWFzMyFxMhNQMHIScmKwEiEzUhBgcGIyEiNSchFQHI/jgKBGCgEBUXDhIc3hoUDBIqoGAECv46pBwBJBwOHJgclgGuBgQGVP0SWgoBrgFGZAEkbBopLRoMDhggUGz+3GQBYjY2Gv2KZFhOVFSmZAAABQAA/7EDWQMLAAgAEQAaAFQAbQBjQGASAQMFAUcACgIHBwplAA0LDgIGBQ0GYAAFAAQABQRgAAMAAAEDAGAAAQACCgECYAkIAgcMDAdUCQgCBwcMWQAMBwxNIBtqZV5ZUlE9PDo5ODc2NRtUIFMTFBMUExIPBRorATQmIg4BFjI2NxQGLgE+AhY3FAYiLgE2MhYlIisBIg4BBw4BBw4CFgYWBhYUHwEeARceATIWNhY2Fj4BNz4BNz4CJjYmNiY0LwEuAScuASImBgEUBw4BBwYiJy4BJyYQNz4BNzYgFx4BFxYCO1J4UgJWdFZLgLaCAn66fD8eLBwCICgi/uYEJzsURC4RHCoMBggEAgICAgIGCgwqHBAwQipMCkosQDQNHCwKBggEAgICAgIGCgsqHRAuRiZQAaoDBYBzMv4ydIAFAwMFgHQxAQAxdH4GAwFeO1RUdlRUO1uCAn66fgKCihUeHioeHmYEBggLKhwQMEQmUAZQJkQYKBwqCwYKBAQEBAQIAgoLKhwQMEQmUAZQJkQYKBwqCwYKBAT+ooAxdIAFAwMGfnUxAQAxdIAFAwMGfnUxAAMAAP+SA5gDKgAIABEAFwBJQEYWFRQTBAIEAUcHAQQDAgMEAm0FAQAAAwQAA2AGAQIBAQJUBgECAgFYAAECAUwSEgoJAQASFxIXDg0JEQoRBQQACAEICAUUKwEyABAAIAAQABMyNhAmIAYQFhMVFwcnEQHMvgEO/vL+hP7yAQ6+ltLS/tbU1LiWMqoDKv7y/oT+8gEOAXwBDvzM1AEq0tL+1tQCbPSWMqoBEgAB////+QMSAwsATgAjQCAyAQIBAAEAAgJHAAECAW8AAgACbwAAAGZCQCEgJgMFFSslFAYHBgcGIyImLwImJy4BJyYvAS4BLwEmNzQ3Njc+ATMyFxYfAR4BFx4CFRQOAgcUHwEeATUeARcyFh8BFjcyPgIXMh4BHwEWFxYDEgwGCzk0Mw8eERo7NitHmisbEwoICAQHAwEdHxwOMA8IBAoUEAoUBwIQCCAmHgEDBAEOKm5MARIFCwYHCh4eIAwHEBgCYCcDAp4PMA4cIBwEBQgVFBssmEgrNhwXEBIgDg80NDkLBgwCAycfFB4PAhgQCAsgHh4KBQgLAxYBTW4qDAIFAwEgJCIBCBACNhMKBAAAAA8AAP9qA6EDUgADAAcACwAPABMAFwAbAB8AIwAzADcAOwA/AE8AcwCeQJtBJQIdEkktJAMTHQJHIAEeGgESHR4SYCEfAh0TCR1UGwETGRcNAwkIEwlfGBYMAwgVEQcDBQQIBV4UEAYDBA8LAwMBAAQBXg4KAgMAHBwAUg4KAgMAABxYABwAHExycG1qZ2ZjYF1bVlNNTEVEPz49PDs6OTg3NjU0MS8pJyMiISAfHh0cGxoZGBcWFRQTEhERERERERERECIFHSsXMzUjFzM1IyczNSMXMzUjJzM1IwEzNSMnMzUjATM1IyczNSMDNTQmJyMiBgcVFBY3MzI2ATM1IyczNSMXMzUjNzU0JicjIgYXFRQWNzMyNjcRFAYjISImNRE0NjsBNTQ2OwEyFh0BMzU0NjsBMhYHFTMyFkehocWyssWhocWyssWhoQGbs7PWsrIBrKGh1rOzxAwGJAcKAQwGJAcKAZuhodazs9ahoRIKCCMHDAEKCCMICtcsHPzuHSoqHUg0JSQlNNY2JCMlNgFHHSpPoaGhJLKysiSh/cSh+qH9xKEksgEwoQcKAQwGoQcMAQr+JrIkoaGha6EHCgEMBqEHDAEKLP01HSoqHQLLHSo2JTQ0JTY2JTQ0JTYqAAYAAP+SA60DKgAbAB8AKAAsADAANACMQIkHAQUJAAkFAG0ACAsKCwgKbRQBCg0LCg1rAA0PCw0PawMBAQ4MDgEMbQAGEwEJBQYJXgQSAgAACwgAC2ARAQ8QAQ4BDw5eAAwCAgxSAAwMAlYAAgwCSiEgHBwBADQzMjEwLy4tLCsqKSUkICghKBwfHB8eHRoZGBcWFRQSDQsKCQgGABsBGxUFFCsBMhYVERQGKwEXITcjIiY1ETQ2OwE1MzUhFTMVJREhEQEyNjQmIgYUFhMhJyEXIzUzFyM1MwNiHi0tHkwi/U0bUiEtLSFgIgIPIv3yAcn9xhcgISwgIFUCNy/+HNiLi8aLiwI0LiD+kh8umZktIAFuIS11gYF1x/7cAST+eyArICArIP5K8oEjIyMAAAAFAAD/+QPkAwsABgAPADkAPgBIAQdAFUA+OxADAgEHAAQ0AQEAAkdBAQQBRkuwClBYQDAABwMEAwcEbQAABAEBAGUAAwAEAAMEYAgBAQAGBQEGXwAFAgIFVAAFBQJYAAIFAkwbS7ALUFhAKQAABAEBAGUHAQMABAADBGAIAQEABgUBBl8ABQICBVQABQUCWAACBQJMG0uwF1BYQDAABwMEAwcEbQAABAEBAGUAAwAEAAMEYAgBAQAGBQEGXwAFAgIFVAAFBQJYAAIFAkwbQDEABwMEAwcEbQAABAEEAAFtAAMABAADBGAIAQEABgUBBl8ABQICBVQABQUCWAACBQJMWVlZQBYAAERDPTwxLikmHhsWEwAGAAYUCQUVKyU3JwcVMxUBJg8BBhY/ATYTFRQGIyEiJjURNDY3ITIXHgEPAQYnJiMhIgYHERQWFyEyNj0BND8BNhYDFwEjNQEHJzc2Mh8BFhQB8EBVQDUBFQkJxAkSCcQJJF5D/jBDXl5DAdAjHgkDBxsICg0M/jAlNAE2JAHQJTQFJAgYN6H+iaECbzOhMxAsEFUQvUFVQR82AZIJCcQJEgnECf6+akNeXkMB0EJeAQ4EEwYcCAQDNCX+MCU0ATYkRgcFJAgIAY+g/omgAS40oTQPD1UQLAADAAD/sQMTAwsAFAAqAF8ATUBKKSMCAgNRAQECDgEAASwBBgAERwAFBAVvAAQAAwIEA2AAAgABAAIBYAAABgYAVAAAAAZYBwEGAAZMKysrXytZRkVEPygpNyEIBRgrJRYzMjU0Jy4EIyIHFRQHFRQWAxYzMj4CJzQuAiciBxQWBxUUBxQBNz4BNz4DJjc1ECcuBCMnNiQ3MhY3Mh4DFRQOAwceAQcUDgMHIiYHIgcBNikl0hcPJiY0KiAoEAEEAxcmLkQ2HgEgOj4mHC0GAQH+0wEJThQEBgIGBAIMAhQeGhwDAjcBDkkNMg0nSkYyIBIaLiQdVnQBKEBaXDQZYhk7cAESu0AlGCISCgIGWDsdXBU0AZYEDiRALyc6Ig4BBxxwHS0eDhr+AzUCDggHEBYOHAUkAiQYBQYGAgQuAQoBAgEOIixKJx0yHiIQDhRuUzhaNioMAgQBBgAAAAABAAD/sQI7AwsAOgA4QDUQAQABLisMAwMAAkcZAQFFAAMAAgADAm0AAgJuAAEAAAFUAAEBAFgAAAEATDk1NDBiHgQFFisVNz4CNzY/ATYSPQEuAic3Fx4BMzI2PwEGBw4BBwYPAQ4BBwYCDwIGFRcWFwYHIgYjIiYjJiMiBwoMLCQPEAcjIjoNIiwKCkMwSB8bOCg2AggRUBQFAwUCBAIPRAkSCQQBCV4CBwYYBhBCD00mHDNOMAQKDAcTJaKeASIUDggGAgI6BAMCAgMEFhwGFAkKDRcKHglS/tAuUy4WCgoDDxgfAgwBBQAAAAL/+f+uA2MDLgApADIAH0AcDAsCAEQAAgECbwABAAFvAAAAZjAvLCsZFwMFFCslHgEOAg8BBiY/AScHBiY/ATY/AT4COwEXPgQXMhcWFxYOAgcTFjI2NCYiBhQCHwYEFAZADZsgGgoogmocHgwfEwgWDhYkFzRHCiZ0eKpQCAYEAgo4YGQkDhZALCxALOwyPjgYKAZEDCAcboQoDBwgTzEQLR0OGgYOMnhYPgwGBApSrIJqHAEMFi5ALi5AAAAAAAMAAP+uA1oDDgAqAD0AUQBgQF06AQADSzw7AwQASQEHBANHSgEHRAIBAQUDBQEDbQADAAUDAGsAAAQFAARrCQEGAAUBBgVgCAEEBwcEVAgBBAQHWAAHBAdMPz4sK0hGPlE/UTQzKz0sPR8iGigKBRgrATIWFxYVFA4BIyInLgEnJjc1Njc2MzIWMzIWFx4BFRQGBxQXFhcWFxYyNgMyPgI0LgIOAwcUFwc3FhMyHgIOAyciJwc3JjU0PgICJgdeAwESPhogSjdQKikBAicODwQMBQsIBAUcJgEDEyYfNQcOLGtHgl44OF6CjoBgNgFDLIdYaFaccEQCQHSYWGxf6Uw8QnKaATMyBQIGEi4eIxlSPjwwBTImDAIGDQtMAwwqBQMFKSMeGwQ2/tk4XISMhFw6AjZggEhxXIIrOgMDRG6gpqBsSAI1S+JjdlaadD4AAAMAAAAAA5gBzAAIABEAGgA6QDcIBAcCBgUAAQEAVAgEBwIGBQAAAVgFAwIBAAFMExIKCQEAFxYSGhMaDg0JEQoRBQQACAEICQUUKxMyFhQGIiY0NiEyFhQGIiY0NiEyFhQGIiY0Nm4uQEBcQEABjC5AQlhCQAGMLkBAXEBAAcxAWkJCWkBAWkJCWkBAWkJCWkAAAAAD//z/kAOaAywACAATACkAYkBfDAEDAiMiGBcEBQcCRwAHBgUGBwVtAAUEBgUEawgBAAkBAgMAAmAAAwAGBwMGYAoBBAEBBFQKAQQEAVgAAQQBTBUUCgkBACYkIB4bGRQpFSkQDgkTChMFBAAIAQgLBRQrATYAEgAEAAIAFyIGFQYWMzI2NTQDMjY3JwYjIj8BNiMiBgcXNjMyDwEGAca+ARAG/vb+hP7uBgEM8iouAiIgJi60Hmw0EjAYDgoqGjAedjgQNBYMDCQaAyoC/vj+hP7uBgEKAXwBEpYwGhwgLCA6/a40NBgkJqBgOi4aIiKYaAAAAQAA//kD6ALDAB8AJEAhGQgCAAMBRwACAwJvAAMAA28AAAEAbwABAWYVNTUkBAUYKwERFAcGIyIvARUUBiMhIiY1ETQ2MyEyFh0BNzYzMhcWA+gWBwcPCuFeQv53Q15eQwGJQl7hCg8HBxYCjv2gFwkDCuFcQ15eQwGIQ15eQ1zhCgIKAAAAAAIAAAAAA48CrQAKABUALUAqBAEAAwBvBwEDAgNvBgECAQECVAYBAgIBWAUBAQIBTBIRExESERMQCAUcKxMhERQGJzUyNicjASERFAYnNTI2JyMSAU/Ei1yEAd8CLgFPxItchAHfAq3+sozEAW+CXgFO/rKMxAFvgl4AAAAD//j/hAPoA0IADgAeACYAQ0BAJSQjISAIBgQCAUcCAQBFAQEAAgBvBQECBAJvBgEEAwMEUgYBBAQDWAADBANMHx8QDx8mHyYYFQ8eEB0iEAcFFisBIycHIyIGHQEDJjclNhcTMhYVERQGIyEiJjURNDYzATUnDwEnBxUDWGR81rQ0TGwKIAKoJA7QEBYWEP0sEBYWEAKcSKaCilwCBpaWTjSgASgmDvgKIv6MGBD+KBAYGBAB2BAY/jyioDyEqtZWAAAAAv/3/+ID2wMSABcAIAAmQCMAAgECbwMBAQAAAVQDAQEBAFgAAAEATBkYHRwYIBkgLwQFFSsBHgEGBwYmBgcGHgEHDgIjIiY3PgE3JAMyNjQmIgYUFgNZSDoSGhBMVCYeEjICAkS4fLrSCgjAeAEiSB4sLD4sLAJuMHxUBgQcCCouOkgOGkpKypB26iJU/YosQCoqQCwAAAAD//v/aAK/A1IABgAXADIAOkA3Eg0CBAUDAAIBAAJHAAMABQQDBWAABAACAAQCXgAAAQEAUgAAAAFYAAEAAUwyMSYlFxEiEQYFGCsXNSEVBicGNyE0LgI3PgEgFhcWDgMBBhYGFgYfARYfAhYXMzY/ATY/AT4CJyYg0QEaRkhGzv7ySFRABgisAVKqCgQoQEIw/oYECAQOAgkLAgsOH1gYUhhYGRUEEQ0GBgIQ/jpuaGgqAgLOSIhahkh4rKx4PGpWVGwBtAQgCB4GDxMEDxMselpediMdBx0WFiISxAAAAAMAAP/XA48C5QAZAB8AJQAmQCMkIyEgHh0bGggBAAFHDQEBRAMBAAEAbwIBAQFmERoRFQQFGCsBPgQ3ESIOAg8BJy4DJxEyHgIXBREWFxEmAREGBxE2AdAFFEpcol5fol5GDA4NCUpcomBeoGBGDf6/rGtuAfSobmwCdQUOJiAWAf1iGB4mCgoMCCQiFAICnhgeJAsL/j4OOQHBOv5MAcIOOv4/OQAAAAEAAAAAA6UCmAAVAB1AGg8BAAEBRwACAQJvAAEAAW8AAABmFBcUAwUXKwEUBwEGIicBJjQ/ATYyHwEBNjIfARYDpRD+IBAsEP7qDw9MECwQpAFuECwQTBACFhYQ/iAPDwEWECwQTBAQpQFvEBBMDwADAAD/cATiA00AGwAtAD0AnkAKDgEDAUYPCQIBREuwGFBYQDIKAQAHBgYAZQAEAAcABAdgAAYACAUGCGELAQUAAwkFA2AACQEBCVQACQkBWAIBAQkBTBtAMwoBAAcGBwAGbQAEAAcABAdgAAYACAUGCGELAQUAAwkFA2AACQEBCVQACQkBWAIBAQkBTFlAHx0cAQA8OTQxKCUiIBwtHS0ZFhEQDAoIBgAbARsMBRQrATIWFxEUBgcjFSchIiY3BzUiJicRNDYzITIWFQEzNTQ2NyE1NCYnISIGFxEUFgURNCYjISIGFxEUFjchMjYERkFaAVxANZz+YEFcAZ1BWgFcQAJxQVz88tFMNgFTIBX9jxUgAR4D9B4W/akgMAEgFQJxFSACsFpC/pRBWgGcnFxAnJxcQQFrQVxcQf5g6jZMATMWHgEgFf6VFh5pAWwVIDAf/q4VIAEeAAMAAP9pBMIDUQAPAB8ALAAwQC0ABQQCBAUCbQACAm4AAQAAAwEAYAADBAQDVAADAwRYAAQDBEwzNDU1NTMGBRorARUUBgchIiY9ATQ2MyEyFgMRFAYjISImNRE0NjMhMhYFNCYjISIGFBYzITI2BMEYE/uVERoaEQRrEhosGhL77RIaGhIEExIa/tAmHP55GyYmGwGHGygDJoMSGAEaEYMRGhr+vv2fERoaEQJhEhoaqhsmJjYmJgABAAAAAAH0ApIACwAGswoFAS0rARYUBwEGJjURNDYXAeYODv5UGCIiGAF4Ch4K/vYQFB4CAh4UEAAAAAACAAAAAAISArwACAARACNAIAUCBAMAAQBvAwEBAWYKCQEADg0JEQoRBQQACAEIBgUUKwEyFREUIjURNCEyFREUIjURNAG4WrT+/Fq0ArxA/cZCQgI6QED9xkJCAjpAAAABAAD/5wO2AikAFAAZQBYNAQABAUcCAQEAAW8AAABmFBcSAwUXKwkBBiInASY0PwE2MhcJATYyHwEWFAOr/mIKHgr+YgsLXQoeCgEoASgLHAxcCwGP/mMLCwGdCx4KXAsL/tgBKAsLXAscAAABAAAAAAO2AkYAFAAZQBYFAQACAUcAAgACbwEBAABmFxQSAwUXKyUHBiInCQEGIi8BJjQ3ATYyFwEWFAOrXAseCv7Y/tgLHAtdCwsBngscCwGeC2tcCgoBKf7XCgpcCx4KAZ4KCv5iCxwAAAABAAAAAAMSAe0ADwAYQBUAAQAAAVQAAQEAWAAAAQBMNTMCBRYrARUUBichIiYnNTQ2NyEyFgMSIBb9WhceASAWAqYXHgG3axYgAR4XaxceASAAAAACAAAAAAOPAq0ABgANAD9APAsBAwIMBAIBAwMBAAEDRwoBAkUCAQBEAAIEAQMBAgNeAAEAAAFSAAEBAFYAAAEASgcHBw0HDRIUEAUFFyslIRUnNxUhJTUhNRcHNQOP/WLf3wKe/IMCnt/ff2+op3DfcG+mqG8AAAAIAAD/kgOYAyoADwAbACcANwBCAE4AXQBpAIFAfiQgBgMBAlwwJh4YCgQHAwFNLhoSAgUGAFU8NgMEBWhHRT44FAYHBAVHAAMBAAEDAG0IAQAGAQAGawAGBQEGBWsABQQBBQRrAAQHAQQHawAHB24AAgEBAlQAAgIBWAkBAQIBTB0cAQBnZVdWTEs7OjMxIyEcJx0nAA8BDwoFFCsTIgcmJzY3FhcGFRQXBgcmBxQXBgcmNTQ3FhcGASIHJic2MzIXBgcmEyYnNjU0JzY3FjMyNxYXBhc2NzY3Bgc2NTQmJwYHJic2NxYzMjcWARYVFAcGByYnJic2PQE2AxYXFhUUBwYjIic24BYUMCw2Slw8BgQ+NhBuFDwUQjImLggBUBwWOjhUTnhuTFYaaqCCBA4mPBoeDhheKBB2JhA6Mi54BgKWvnJaRAxEBg4eFo4BYJYEQEIYQDBkCmQaDhICDlZsOjZuAfgKNExKLCYsEBAGEDA4BGIiGnJ2aoJuYD4yGAEwDiocHj4OJBr+NBhYFAoYHCwuFAhshA6WDi4EDpJWMDIKJExgsCRKkIICDmIB0ojMFiwSBjgEknYUFgoq/ewKCBIiUEAqDKAAAAAABAAA/70DawL/AAgAEQAiAHUAeUB2YgEIB11UAgAIb0I6NSolBgYBHAEFBgRHHwEFRAAIBwAHCGUNAQQJAQcIBAdeDAILAwADAQEGAAFgDgoCBgUFBlQOCgIGBgVYAAUGBUwjIxQSCgkBACN1I3VkY1dWTk08OxsZEiIUIg4NCREKEQUEAAgBCA8FFCsBIgYUFjI2NCYzIgYUFjI2NCYTISIGFREUFjMhJx8CETQmAyYnNjc2PwEGBwYHBicmJyYvARcWFxYXByYnJicmLwE0NzY3Nj8BNjc2PwEXBgcGDwE3Njc2MzYXFhcnJicmJzcXFhcWHwEWFxYXFhUHBgcGBwYBsxIYGSMZGYYSGBkjGRm5/dEjMjIjAdkWNTJaMsQODhgUDgsHFBwgHTU3Hh8PDxEHCg4SGBwgGxUSDQkHCQgNCQwJGx4WFREEIR0UEAwZMiwDBSspRTgLDxMbIAYRFRYeGwkMCQ0ICQcJDRIVGwGhGyYbGyYbGyYbGyYbAV4zI/3NJDJNMi5QAuwjM/3gERAHDQkMCQ0MDAYJCgUNBQkKCQsJDQciAQoIDQoLCi4xJicbGRMUCwkDAQUKDgoMCQwXAwEFBAkfCQsJDgoHAQMJCxQTGRsnJjEuCgsKDQgKAAAAAAIAAP/5A+gDUgAnAD8ATEBJKAEBBhEBAgE3LgIEAiEBBQQERwAGAQZvAAQCBQIEBW0ABQMCBQNrAAEAAgQBAmAAAwAAA1QAAwMAWAAAAwBMOhslNTYlMwcFGysBFRQGIyEiJjURNDY3ITIWHQEUBiMhIgYHERQWFyEyNj0BNDY7ATIWExEUDgEvAQEGIi8BJjQ3AScmNDYzITIWAxJeQ/4wQ15eQwGJBwoKB/53JTQBNiQB0CU0CggkCArWFhwLYv6UBRAEQAYGAWxiCxYOAR0PFAFMskNeXkMB0EJeAQoIJAgKNCX+MCU0ATYksggKCgHa/uMPFAIMYv6UBgZABQ4GAWxiCxwWFgAAAAAIAAD/xANZAwsAUwBaAF8AZABpAG4AcwB4AGpAZyQeGxUEBAFlDQIDAmoBBwZHAQUHBEcABAECAQQCbQACAwECA2sAAwYBAwZrAAYHAQYHawAHBQEHBWsABQVuCAEAAQEAVAgBAAABWAABAAFMAQBzcnFwRkQ4NzEwLCsdHABTAVMJBRQrATIeARUUBgcGJj0BNCc+BCc0JzYnJgYPASYiBy4CBwYXBhUUHgMXBgcOASImJy4BLwEiBh4BHwEeAR8BHgI2MzcVFBcUBicuATU0PgEDNicmBwYWFzYmBhYXNiYGFhc2JgYWFzYmBhY3NAYUNjcmBhY2Aa10xnKkgQ8OHSAyOCIaAiwVGRA8FRU0bjUIHkAPGRQsGCI4MCEVBgwaJiIOCyAMCwwIAggDBAwYBgYHIigmDA0BEA6BpHTClAIFBgIBChQECwcKFAYKCgocBA0JDSUBEQQRJhMTIAESAhIDC3TEdYzgKwMOCnY2GQMOHixIMEMwMz8FFg4NDw8GEhoGPzMwQy9ILhwQAhQmBQYYFxIWAwEECgYDAwYeDg0VGggCAzIcAgoOAyvgjHXEdP2YBAMBAgQGDwMLBgwVBA4HDhQEDQoMCQYFDAYEBwENAQsHAw4GAAAAAAH/+f+xAxgCwwAUABhAFQ4DAgABAUcAAQABbwAAAGY4JwIFFisBFgcBERQHBiMiLwEmNREBJjYzITIDDwkR/u0WBwcPCo8K/u0SExgCyhcCrRYR/u3+YhcKAwuPCw4BDwETESwAAAAABQAA/2oD6ANSAB8AIgAlADMAPABwQG0jAQAGHQEJACcgAgcFA0cAAwAGAAMGXgwBAAAJBQAJXgAFAAcEBQdgAAQACggECmAACAACCwgCYA0BCwEBC1INAQsLAVgAAQsBTDQ0AQA0PDQ8Ozk2NTAvLiwpKCUkIiEaFw4MCQYAHwEeDgUUKwEyFhcRFAYHISImJzUhIiYnETQ2PwE+ATsBMhYXFTYzDwEzAQczFzc1IxUUBgcjESE1NDYBESMVFAYnIxEDshceASAW/ekXHgH+0RceARYQ5A82FugXHgEmIUenp/6bp6dtsNYeF+kBHhYCJtceF+gCfCAW/VoXHgEgFqAgFgF3FjYP5BAWIBa3F3enAX2nwrDp6RYeAf6bjxY2/k4Cg+gWIAH+mgAABgAA/9QD6QLnAAgAEQAhACoAOgBKAF9AXEQ8OwMKCzQsAggJGxMCBAUDRwALAAoGCwpeAAcABgMHBmAACQAIAgkIYAADAAIBAwJgAAEFAAFUAAUABAAFBF4AAQEAWAAAAQBMSEZAPzg2JRMVFxYTFBMSDAUdKzcUBi4BND4BFjUUBiImNDYyFgEVFAYnISImPQE0NjchMhYBFAYiJjQ2MhYBFRQGIyEiJj0BNDYzITIWAxUUBgchIiY9ATQ2MyEyFtY+Wj4+Wj4+Wj4+Wj4DEgoI/VoICgoIAqYHDPztPlo+Plo+AxIKCP1aCAoKCAKmBwwBCgj9WggKCggCpgcMQCxAAjxcPAJA8i0+Plo+Pv7rawcMAQoIawcKAQwCAC0+Plo+Pv7rbAcKCgdsBwoKARZrBwoBDAZrCAoKAAYAAP9qA+kDTQAfAD0ATQBdAG0AfQIXQDdaWVUDFA93bgIOFG8BDQ4wAQcIZy8qAwoSRxwCAwU/HQ4DCwQGAQECBQEAAQlHXwEKFxMCAwJGS7AMUFhAYwAPFA9vFQEKEhEJCmUABAMLAwRlAAILAQMCZQAUDg0UVBYQAg4TAQ0IDg1eAAgABxIIB2AAEgARCRIRYAAJAAYFCQZfAAMEBQNUDAEFAAsCBQteAAEAAAFUAAEBAFgAAAEATBtLsCVQWEBkAA8UD28VAQoSEQkKZQAEAwsDBGUAAgsBCwIBbQAUDg0UVBYQAg4TAQ0IDg1eAAgABxIIB2AAEgARCRIRYAAJAAYFCQZfAAMEBQNUDAEFAAsCBQteAAEAAAFUAAEBAFgAAAEATBtLsCpQWEBlAA8UD28VAQoSERIKEW0ABAMLAwRlAAILAQsCAW0AFA4NFFQWEAIOEwENCA4NXgAIAAcSCAdgABIAEQkSEWAACQAGBQkGXwADBAUDVAwBBQALAgULXgABAAABVAABAQBYAAABAEwbQGYADxQPbxUBChIREgoRbQAEAwsDBAttAAILAQsCAW0AFA4NFFQWEAIOEwENCA4NXgAIAAcSCAdgABIAEQkSEWAACQAGBQkGXwADBAUDVAwBBQALAgULXgABAAABVAABAQBYAAABAExZWVlALE5OICB7eXNya2ljYU5dTl1cW1JRUE9LSUNCID0gPTw7JBsWERIYEyMiFwUdKxcUBgciJzcWMzI2NTQHJzY/ATY3NSIGJxUjNTMVBx4BExUjJjU0PgM3NCYHIgcnPgEzMhYVFA4CBzM1BRUUBichIiY9ATQ2MyEyFgEVIzUzNTQ3NSMGByc3MxUFFRQGIyEiJj0BNDYzITIWAxUUBgchIiY9ATQ2MyEyFtU+LDwkHxwgEBg7DgQOGAoKCSQJO7o1HCIBygQcIigWAxINGRQvDTYgKDgmLiYBRwNNCgj9WggKCggCpgcM/O27PAEBBRcoTDsDTgoI/VoICgoIAqYHDAEKCP1aCAoKCAKmBww2LTIBJTEZEBAjBB8GEh8NCAECAR5VMUEGKgFCWRQKHS4eGBgNDhABICEcIC4oHC4aHg8ismsHDAEKCGsICgwB8Dg4Qy0XBwoUKkfh2GwHCgoHbAcKCgEWawcKAQwGawgKCgACAAD/sQNZAwsAXABsAVpLsAlQWEAZNBACBQERAQAFLi0CBABmXgIKCQRHOQEBRRtLsApQWEAZNBACBQIRAQAFLi0CBABmXgIKCQRHOQEBRRtAGTQQAgUBEQEABS4tAgQAZl4CCgkERzkBAUVZWUuwCVBYQC4ACQgKCAllAAoKbgAFAAEFVAYCAgEHAwsDAAQBAGAABAgIBFQABAQIWAAIBAhMG0uwClBYQDMACQgKCAllAAoKbgABAgABVAAFAAIFVAYBAgcDCwMABAIAYAAECAgEVAAEBAhYAAgECEwbS7ASUFhALgAJCAoICWUACgpuAAUAAQVUBgICAQcDCwMABAEAYAAECAgEVAAEBAhYAAgECEwbQC8ACQgKCAkKbQAKCm4ABQABBVQGAgIBBwMLAwAEAQBgAAQICARUAAQECFgACAQITFlZWUAdAQBqaGJgU1FAPzg1MzEgHhQSDwcGAwBcAVwMBRQrEyYvATYzMhcWMzI3NjcyNwcXBiMiBwYVHwEWFxYXFjMyNzY3Njc2NzY1NC4BLwEmJyYPASc3MxcWNxcWFRQHBgcGBwYdARQXFhcWBwYHBgcOASMiLgEnJj0BNCcmATU0JiMhIgYdARQWMyEyNhsVBAIHDyIdShMvLkERHxEBASEkIQsHAQgDGRQiMTE7MB8YGwoUCQwECAQCAwoTGDgIAS9yK0MKAwIZFikDCAEFCAMMCA8VKSp5UV2EQw0JCQ4C+goI/MsICgoIAzUICgLWAQExAQMEAgIBAQgpBQ4HQqCdRSshExoQChIUEB8gKVcsOFAxISUMFAEBAjAGAggBFgcEDQcBBgMIDw8LBgvSbT0qGiQhHyU0VEMtV7ppDhT87yQICgoIJAgKCgAC////1QI8AucADgAdACNAIAABAAEBRwADAgNvAAIBAm8AAQABbwAAAGYVNCYUBAUYKyUUDwEGIi8BJjQ2NyEyFicUBiMhIi4BPwE2Mh8BFgI7CvoLHAv6CxYOAfQOFgEUD/4MDxQCDPoKHgr6CvMPCvoLC/oKHhQBFsgOFhYcC/oLC/oKAAAAAwAA/8wDWQL/AAMADgAqAEpARyIBBQEBRwcJAgEIBQgBBW0GBAIABQBwAAMAAggDAmAACAEFCFQACAgFWAAFCAVMAAApJyEgHBsWFBEQDQwJBgADAAMRCgUVKxMRIxE3FAYrASImNDYyFgERIxE0JiMiBgcGFREjNj0BJzMVIz4DNzIWw7jEOi4BLjg6XDgCi7cuMCMuDQa4AQG4AQsYJjwiX3QB9f3XAimrKTY2UjY2/kD+wwEoO0ImHREc/svfiqUbUBIaIBABfgAABf/9/7EDXwMLABMAHAAlADYAQwBCQD8dFAICAwFHAAkABgMJBmAFAQMEAQIBAwJgAAEAAAcBAGAABwgIB1QABwcIWAAIBwhMQUAXFxYTFBMZGRIKBR0rJQ4BLgEnJj4BFhceATI2Nz4BHgElFAYiJj4CFgUUBiIuAT4BFhc0LgIiDgIeAz4DNxQOASIuAj4BMh4BAnkVcI5yFAQOHBoEDkxeSg8EHBoQ/uYqOiwCKD4mASAqPCgCLDgujTpeho6IXDwCOGCEkoJiNklyxujIbgZ6vPS6fvpDVAJQRQ4aCQwQLDg4LA8OChrlHioqPCgCLBweKio8KAIsq0mEYDg4YISShF48BDRmfE11xHR0xOrEdHTEAAAAAA8AAP/5BDACfAALABcAIwAvADsARwBTAF8AawB3AIMAjwCfAKMAswCMQIlIAQIDAUcAHgAbBR4bXhoXFQ8LBQUWFA4KBAQDBQRgGRENCQQDGBAMCAQCAQMCYRMHAgESBgIAHAEAYB8BHB0dHFIfARwcHVgAHRwdTKCgsq+qp6CjoKOioZ+cmpiVko+MiYaDgH16d3RxbmtoZWJfXFlWUlBNSkdEQT47ODMzMzMzMzMzMiAFHSs3FRQrASI9ATQ7ATI3FRQrASI9ATQ7ATInFRQrASI9ATQ7ATIBFRQjISI9ATQzITIlFRQrASI9ATQ7ATInFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATInFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATIBFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATU0OwEyExEhEQERFAYjISImNRE0NjMhMhbWCTUJCTUJSAl9CQl9CUgJNQkJNQkCPAn+HgkJAeIJ/psJNgkJNglICTUJCTUJ1gg2CQk2CEcJNQkJNQnWCTUJCTUJ1wk2CQk2Cf7iCTYJCTYJjwk2CQk2CY8JfQkJPgk2CUf8XwPoKB/8Xx0qKh0DoR4qxjUJCTUJhjUJCTUJhjYJCTYJ/tk1CQk1CYY1CQk1CYY2CQk2CZg1CQk1CYY2CQk2CZg1CQk1CZg1CQk1CQEVNgkJNgkJNgkJNgkJxAkJNQmGCf5TAfT+DAH0/gwdKiodAfQeKioAAAADAAD/uQQWAroAFAAkADkAHkAbLhECAAEBRwMBAQABbwIBAABmNTQoJxcSBAUWKyUHBiInASY0NwE2Mh8BFhQPARcWFAEDDgEvAS4BNxM+AR8BHgEJAQYiLwEmND8BJyY0PwE2MhcBFhQBWBwFDgb+/AYGAQQFEAQcBgbb2wYBRNACDgYiCAYB0QIMByMHCAFs/vwGDgYcBQXb2wUFHAYOBgEEBUUcBQUBBQUOBgEEBgYcBRAE3NsGDgJO/S8HCAMJAwwIAtAIBgEKAg7+j/77BQUcBg4G29wFDgYcBgb+/AUQAAACAAD/sQLLAwsABgAhAChAJQcBAAIDAQEAAkcAAQABcAACAAACVAACAgBWAAACAEo8HhEDBRcrAREjETY3NhMRFA4GIi8BLgU1ETQ2MyEyFgJf+kM0g2skOkpCRh4PEAYYD0ZATjYmFg4Cgw4WAToBZf2GIylnAg/+UzBeSkQuKBAHBAsHKixGSGAvAa0OFhYAAAAABQAA/5YDEgMzAAoAFQApAEIAZAAiQB9WPzwgAAUBRQABAAABVAABAQBYAAABAEw+PTIxAgUUKwEWBicuATY3Nh4BFy4BBw4BFx4BPgETLgEvASYHDgIHHgEfARY/AT4BEw4DBw4BJicuAycmJz8BFiA3HgEGEwYDDgIHBicmJy4CLwIuASc+Az8BNjc2FxYXFhQBxwRAHxUQDhYUKh4+CG43IyoBA1JmRH8LKAwoopoYGiILEDQPMX97Mg8yMQQKBBwTMHRsOxkoLiQLDhEDCnwBPnwMAghlDy8DGBgTjMiLUQgMCAEGHwYOBQIQEiIIG0Zp06ZWIgkBcyMsEwkuLgkLCCAKPEAZD0QmM0gJVgFhDxQCBxobBAYSDxAUAgYQDwcCFP3ODjgmKAwbGgIJBQoUHhM2bQkFU1MDFB4CE17+8BEcEghGFQ8/BhAYByqtImInDhoQEgMKGgoVMRkrCyIAAAAEAAD/agOhAwsAAwAHAAsADwAxQC4PDAcEBAFFCgkCAQQARAMBAQABbwUCBAMAAGYICAAADg0ICwgLBgUAAwADBgUUKwERJREBESERARElEQERIREBff6DAX3+gwOh/gUB+/4FASH+lDUBNwGe/pEBO/6W/klGAXEB6v5FAXUAAAIAAP9qA40DQQAVADYATEBJLQEFBAsBBgU2FwEABAIDA0cABAUEbwACAwEDAgFtAAUABgcFBl4ABwADAgcDYAABAAABVAABAQBYAAABAEwhERYnIiYsIwgFHCslFw4BIyIuATU0NjcXDgEVFBYXMj4BJRcHBiMiJwMhIiYnAyY3PgEXMhYHFAYnFzMVIxczMh8BAjs5IahqV5RWdGAJRFKUZkd2QgEtII8HCRYKhf74DRQCNgEFBzAeJTYBOiYU7OMJ/hcJf7xyZHxWlFdlqCFJHnxLZ5IBSnoPQEcEEwELEg0BswoOHCQBNCUnNgShSEcT/gADAAD/agQvA1IADAAmADAAVUBSDAECAEUCAQABAG8AAQMBbwkHBQMDBANvDAoIBgQEAAsNBAteDwENDg4NVA8BDQ0OVgAODQ5KKCcsKycwKC8mJCEgHRsaGREREREREhIyEhAFHSsBBRUjFAYnISImJyM1FzMRMxEzETMRMxEzETMRMzIWBxUhNTQ2FzMFMhYdASE1NDY3AhgCF0cWEPysEBYBR4+PR49Hj0iPIQ8YAfxfGA8hA3oQFvvRFhEDUtZIDhYBFA9Ij/5TAa3+UwGt/lMBrf5TFA8kJA4WAWsWDkdHDxQBAAAAAf///7EDSAMLACMANkAzEgEDAhMBAAMCRwACAAMAAgNgAAAABQQABV4ABAEBBFQABAQBWAABBAFMFSUjJyUQBgUaKwEhFhUUDgEjIi4DPgIzMhcHJiMiDgEUHgEzMj4DNyMBrQGUB2a8eViedEICRnCiVqd4dURmSHpISHpIMFI0KBAF8wGbJSJ5vmxEcqCuoHJEcXBDSnqWekocJjYsFQAAAAAUAAD/agMSA1IADwAfAC8APwBPAF8AbwB/AI8AnwCvAL8AzwDfAO8A/wEPAR8BLwE/AgtBRgADAAEAAwAAATkBOAExAOkA4QCZAJEAGQARAAkAAgADASkBKAEhANkA0QCJAIEAKQAhAAkABAAFARkBEQDJAMEAeQBxADkAMQAIAAYABwEJAQgBAQC5ALEAaQBhAEkAQQAJAAgACQD5APgA8QBZAFEABQAUAAoAqQChAAIAFQALAAsAAQABABUACABHS7AJUFhAYB8BCxQVFQtlKAEAJhwSAwMCAANgJx0TAwIkGhADBQQCBWAlGxEDBCIYDgMHBgQHYCMZDwMGIBYMAwkIBglgHgEKFAgKVCEXDQMIABQLCBRgABUBARVUABUVAVkAARUBTRtAYR8BCxQVFAsVbSgBACYcEgMDAgADYCcdEwMCJBoQAwUEAgVgJRsRAwQiGA4DBwYEB2AjGQ8DBiAWDAMJCAYJYB4BChQIClQhFw0DCAAUCwgUYAAVAQEVVAAVFQFZAAEVAU1ZQVcAAQAAAT0BOwE1ATMBLQErASUBIwEdARsBFQETAQ0BCwEFAQMA/QD7APUA8wDtAOsA5QDjAN0A2wDVANMAzQDLAMUAwwC9ALsAtQCzAK0AqwClAKMAnQCbAJUAkwCNAIsAhQCDAH0AewB1AHMAbQBrAGUAYwBdAFsAVQBTAE0ASwBFAEMAPQA7ADUAMwAtACsAJQAjAB0AGwAVABMACQAHAAAADwABAA8AKQAFABQrATIWFxEUBgchIiYnETQ2NxcVFBY7ATI2PQE0JisBIgYdARQWOwEyNj0BNCYrASIGHQEUFjsBMjY9ATQmKwEiBh0BFBY7ATI2PQE0JisBIgYHNTQmKwEiBh0BFBY7ATI2PQE0JisBIgYdARQWOwEyNj0BNCYrASIGHQEUFjsBMjY9ATQmKwEiBh0BFBY7ATI2PQE0JisBIgYdARQWOwEyNgE1NCYrASIGHQEUFjsBMjYRNTQmKwEiBh0BFBY7ATI2PQE0JisBIgYdARQWOwEyNj0BNCYrASIGHQEUFjsBMjY9ATQmKwEiBh0BFBY7ATI2EzU0JisBIgYHFRQWOwEyNj0BNCYrASIGBxUUFjsBMjY9ATQmKwEiBgcVFBY7ATI2PQE0JisBIgYHFRQWOwEyNj0BNCYrASIGBxUUFjsBMjYC7g8UARYO/TYPFAEWDvoKCCMICgoIIwgKCggjCAoKCCMICgoIIwgKCggjCAoKCCMICgoIIwgKSAoIIwgKCggjCAoKCCMICgoIIwgKCggjCAoKCCMICgoIIwgKCggjCAoKCCMICgoIIwgKAR4KCLIICgoIsggKCggkBwoKByQICgoIJAcKCgckCAoKCCQHCgoHJAgKCggkBwoKByQICo8KCCQHCgEMBiQICgoIJAcKAQwGJAgKCggkBwoBDAYkCAoKCCQHCgEMBiQICgoIJAcKAQwGJAgKA1IWDvxgDxQBFg4DoA8UAaEjCAoKCCMICgqXIwgKCggjCAoKliQICgoIJAcKCpYkCAoKCCQICgq7JAgKCggkCAoKlyQICgoIJAgKCpckBwoKByQICgqXIwgKCggjCAoKlyMICgoIIwgKCv09awgKCghrCAoKASYkCAoKCCQICgqXJAcKCgckCAoKlyMICgoIIwgKCpcjCAoKCCMICgr9zCQICgoIJAgKCpckCAoKCCQICgqXJAcKCgckCAoKlyMICgoIIwgKCpcjCAoKCCMICgoAAAAEAAD/agNbA1IADgAdACwAPQByQG85DAMDBwYqIQIBABsSAgUEA0cLAQApAQQaAQIDRgsBBgcGbwAHAAdvCAEAAAEEAAFgCgEEAAUCBAVgCQECAwMCVAkBAgIDWAADAgNMLi0fHhAPAQA2NS09Lj0mJR4sHywXFg8dEB0IBwAOAQ4MBRQrATI2NxUUDgEiLgEnNR4BEzI2NxUUDgEiLgEnNR4BNzI2NxUUDgIuASc1HgETMh4BBxUUDgEiLgEnNTQ+AQGthOZCcsjkym4DQuaFhOZCcsjkym4DQuaFhOZCcsjkym4DQuaFdMR2AnLI5MpuA3TEAaUwL18mQiYmQiZfLzD+VDAvXydCJiZCJ18vMNYwL18mQiYCKj4oXy8wAoMmQidHJ0ImJkInRydCJgAABv/+/2oD6gNSABAAGQAhACoAMwA7AHJAbxgTAgMCFxQCBwM5ODUfHhsGBgcoJQIFBikkAgQFBUcIAQAJAQIDAAJgAAMABwYDB2ALAQYABQQGBWAKAQQBAQRUCgEEBAFYAAEEAUwsKyMiEhEBADAvKzMsMycmIiojKhYVERkSGQkIABABEAwFFCsBMh4DDgIiLgI+AxciBxc2Mhc3JgE3JjQ3JwYUATI3JwYiJwcWNzI2LgEOAhYlFzY0JwcWFAH0ZriITARUgMDEwIBUBEyIuGZqX2wuXi5tYP4cbBAQbDMBrWpgbS5eLmxfall+Anq2eAaEAWNsMzNsEANSUIS8yLyEUFCEvMi8hFBHM2wQEGwz/YpsLl4ubWDU/r0zbBAQbDPXfrCABHi4dnVsX9RgbS5eAAABAAD/sQPFAwsAfgBOQEtZVDQDBgUXAQIBCAEAAgNHCAEECQcCBQYEBWAABgABAgYBYAoBAgAAAlQKAQICAFgDAQACAEx6eXBva2VgX1hVT05KRHQWPWALBRgrBSImIgYjIiY3ND4CNzY9ATQnJiMhIg8BFBceATIWFxQGByImIgYjIiY1ND4CNzY1JxE3NiY0LwEuAScuAQYmNzQ2NzIWMjYzMhYVFAYiBgcGFRcWMyEyNzY9ATQnLgI1NDY3MhYyNjMyFhUUBiIGBwYVExQXHgEyFhcUBgOrGWIyYhkNEAESGiAJEgEHFf6IFgcBFQkiHhQBDA8aaDFeGA0OEhYeCRIBAQECAgQCCAUIIhgWAQwOGmgwYBYODhIaHAoUAQcPAYYOBwETCi4cDg4YZC9gGA4OFBgiBxQBEwkgHBIBDE8EBBgNEhACBgYLQ9oMBQMD4E8MBgQQEg4YAQQEGA0REAQEBw1DHwHGDw0OHAoUChACBQQCEBIOGAEEBBoNERAEBQxOxAICBgyyTgwGAgwWDhgBBAQaDREQBAUNTf3yQgwGBBIQDhgABQAA/2oD6ANSABAAFAAlAC8AOQBsQGkzKQIHCCEBBQIdFQ0MBAAFA0cEAQUBRgYMAwsEAQcCBwECbQACBQcCBWsABQAHBQBrBAEAAG4KAQgHBwhUCgEICAdWCQEHCAdKEREAADc1MjEtKygnJCIfHhsZERQRFBMSABAADzcNBRUrAREUBgcRFAYHISImJxETNjMhESMRAREUBgchIiYnESImJxEzMhclFSM1NDY7ATIWBRUjNTQ2OwEyFgGJFg4UEP7jDxQBiwQNAZ+OAjsWDv7jDxQBDxQB7Q0E/j7FCgihCAoBd8UKCKEICgKf/lQPFAH+vw8UARYOAR0B6Az+eAGI/gz+4w8UARYOAUEWDgGsDK19fQgKCgh9fQgKCgAAAgAA/7EEdwMLAAUACwA0QDELCgkDAwEBRwABAwFvAAMCA28EAQIAAAJSBAECAgBWAAACAEoAAAgHAAUABRERBQUWKwUVIREzEQETIRETAQR3+4lHA1qO/GD6AUEHSANa/O4CO/4MAUIBQf6/AAAAAAEAAP+xAsoDUwBKAEVAQiMBBQITAQEDAkccAQFEAAIEBQQCBW0ABQMEBQNrAAAABAIABGAAAwEBA1QAAwMBWAABAwFMRUQ7OTEvKScoJQYFFisRND4DFzIeARUUDgMnIiYnBw4FDwEnJjU0Nj8BJjU0NjcyFhUUDgEWMzI+BDc0JiMiBhUUHgIVFAYjJy4DKkpgbjpYmF4UMEBgOiZKEQ8KCA4QEiISBwUJGBkdEjotIiYwATIkHzQkGhAGAXpjb5YOEA4QDQkdLBgMAgU8alA6HgFKjlk2ZmBGLgIkHz8pGDgWMCgcAwZYETOAYXEkOi9QAS4iJYpHLhwwOkA8GmBskG8ZLhoaBA8yAQksPjoABAAA/7cD6AMFABIAFQAcACgAIUAeJyEgHBYVFBMRDgoAAQFHAAEAAW8AAABmJCMUAgUVKwERFAYHIiclLgE1ETQ2NzIXBRYXASUBERQOAS8BARQABwMTNjMyFwUWAU0ODQoJ/v0MEAwKCBABHgEkASr+1gJ3EBoN9gEr/uIY2rUJFAgGAS4CAmf9cQ4SAQSDBRoNAnwMDgEIjwI5/hyVAUX9sw4QAgh7Ai0C/jAoAWEBJhADlwEAAAX//v+SA+oDKgAFAAgADgAUABoAIUAeFAgBAwBEBAECAQJvAwEBAAFvAAAAZhIXEhMWBQUZKxMJAS4BNyUhAwETIRM2MgEXFgYHCQEhEzYyFzoBuv4cCggEAToBcLj+2W/+/m8EHALlOAQICv4cAbr+/m8EHAUByP3KAV8HGAys/coDjP6qAVYM/p6sDBgH/qECNgFWDAwAAgAA/2gD6ANUABYAJwAiQB8UEAoDAAIBRwACAAJvAAABAG8AAQFmJCMcGxIRAwUUKyUTNiYHBQ4BFh8BJTYXFg8CMj8BFxYBFA4DLgI0PgIeAwKYUgUWEv4eEAwIDnwBHgwGBAfnCQ0MPH0kAVpQhLzIvIRQUIS8yLyEUHkBghkWCLkGEA4EJrQIBQMF0n8NOl0UAQ9muIhMBFSAwMTAgFQETIi4AAAAAQAAAAEAANmIE9FfDzz1AAsD6AAAAADZ7Nf3AAAAANns1/f/4/86BOIDgQAAAAgAAgAAAAAAAAABAAADUv9qAAAE4v/j/+ME4gABAAAAAAAAAAAAAAAAAAAAZQPoAAACygAAA+n//gPo//8DWQAAA1kAAAOgAAADoAAAAxEAAAOgAAACOwAAAjsAAAOgAAADoAAAA6oAAAPoAAAD6AAAAxEAAAI7//8DWQAAAsoAAALKAAADWQAAA6AAAAPoAAADEAAAAy0AAANZ//0EAv/jA4T//gOgAAADoAAAAy4AAAPo//gD5//+AxEAAAPoAAAD6AAAAoIAAAOg//8D6AAABC///wI7AAAD6AAAA1kAAAOYAAADEf//A6AAAAOtAAAD6AAAAxEAAAI7AAADXP/5A1kAAAOYAAADmP/8A+gAAAOgAAAD6P/4A9T/9wK8//sDoAAAA+gAAATiAAAEwQAAAfQAAAISAAAD6AAAA+gAAAMRAAADoAAAA5gAAAP9AAAD6AAAA1kAAAMR//kD6AAAA+gAAAPoAAADWQAAAjv//wNZAAADWf/9BC8AAAQvAAACygAAAxEAAAOgAAADoAAABHYAAANZ//8DWQAAA1kAAAPo//4D6AAAA+gAAAR2AAACygAAA+gAAAPo//4D6AAAAAAAAABEAKwBmgIkAuYDVgO0A/4EZgSOBMgFKgWuBnIG0AcQB1gHfgfkCBgITgimCQ4JWgnACmIKtAsOC1wMPAycDWYN3A4+DvgPyBAuEHYQxhFoEiwSahMIE+IUOBTAFbAWSBc+F+wYYhjCGWoZtBouGnIasBsSG14bzhwiHFodBh1iHYAdsB3mHhweRh6CH2ggWiDgIc4iAiKYIzYk7iY4Jnwm4iduKJApAilMKf4qPiq4Kywrfi4SLqovRDAYMKgw4DFoMcQyEDJjAAEAAABlAUAAFAAAAAAAAgBSAGIAcwAAARILcAAAAAAAAAASAN4AAQAAAAAAAAA1AAAAAQAAAAAAAQAIADUAAQAAAAAAAgAHAD0AAQAAAAAAAwAIAEQAAQAAAAAABAAIAEwAAQAAAAAABQALAFQAAQAAAAAABgAIAF8AAQAAAAAACgArAGcAAQAAAAAACwATAJIAAwABBAkAAABqAKUAAwABBAkAAQAQAQ8AAwABBAkAAgAOAR8AAwABBAkAAwAQAS0AAwABBAkABAAQAT0AAwABBAkABQAWAU0AAwABBAkABgAQAWMAAwABBAkACgBWAXMAAwABBAkACwAmAclDb3B5cmlnaHQgKEMpIDIwMTkgYnkgb3JpZ2luYWwgYXV0aG9ycyBAIGZvbnRlbGxvLmNvbWZvbnRlbGxvUmVndWxhcmZvbnRlbGxvZm9udGVsbG9WZXJzaW9uIDEuMGZvbnRlbGxvR2VuZXJhdGVkIGJ5IHN2ZzJ0dGYgZnJvbSBGb250ZWxsbyBwcm9qZWN0Lmh0dHA6Ly9mb250ZWxsby5jb20AQwBvAHAAeQByAGkAZwBoAHQAIAAoAEMAKQAgADIAMAAxADkAIABiAHkAIABvAHIAaQBnAGkAbgBhAGwAIABhAHUAdABoAG8AcgBzACAAQAAgAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAGYAbwBuAHQAZQBsAGwAbwBSAGUAZwB1AGwAYQByAGYAbwBuAHQAZQBsAGwAbwBmAG8AbgB0AGUAbABsAG8AVgBlAHIAcwBpAG8AbgAgADEALgAwAGYAbwBuAHQAZQBsAGwAbwBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff2f6!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff2f6;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff2f6}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file +.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300;font-size:16px}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,d09GRgABAAAAAFUMAA8AAAAAhAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABWAAAADsAAABUIIslek9TLzIAAAGUAAAAQwAAAFY+UFQCY21hcAAAAdgAAAK1AAAHsvo1dTJjdnQgAAAEkAAAABMAAAAgBzP+pGZwZ20AAASkAAAFkAAAC3CKkZBZZ2FzcAAACjQAAAAIAAAACAAAABBnbHlmAAAKPAAARAUAAGTGVwpzQGhlYWQAAE5EAAAAMwAAADYXvfOOaGhlYQAATngAAAAgAAAAJAgaBJVobXR4AABOmAAAAMIAAAGUYMT/nGxvY2EAAE9cAAAAzAAAAMyPgKeTbWF4cAAAUCgAAAAgAAAAIAJRDRRuYW1lAABQSAAAAXcAAALNzJ0fIXBvc3QAAFHAAAACzwAABBBrTorscHJlcAAAVJAAAAB6AAAAhuVBK7x4nGNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgYYAAkDwymzEnMz2RgQPGA8qxgGkOIGaDiAIAJjsFSAB4nGNgZK5jnMDAysDAVMW0h4GBoQdCMz5gMGRkAooysDIzYAUBaa4pDA4vGD4dYw76n8UQxdzIcAwozAiSAwD7LwzaAHic3dTLblVlAMXx/4FjVUBAUai1AuWiiIK0eK1X7oKAggqoKCp9AaY8BJMmndBBX4CER+ikjSnpG5xJByRr4GB/+wGoa/dbYV6GnJNf07NzdrL7da0FvABstA+sDxtaev6N3n++2lu7vpFNa9f7vXl/nmSvvzeic8295n7zsFloHjXLzaBZKcNltIyViXKn3C3TZbbMlQdlviyXQXlcnrTj7WQ70y6uroJ4eu/Seu99xlfPz/3v0/fSOt7dvRt8Bn2f1BAv8hIv+zw2s4VX2Mo2tvMqr7GD13mDneximDcZ4S1GeZvd7PFpjbGP/RzgIO/wLod4j8O873M9wlE+5BjjTHCcj/iYT/iUz/jcz/oFX/IVX/MN33KCk5ziNGc4yzm+4zwX+J6LXOIyP/AjV7jKT/zML1zjOjf4ld/4nZv8wZ/c4i/+5h9uM+U/ZOiZz+/5eW3pfvTn82mqS2PVpV3h/ziKrh2KriGKrjkKJwOFM4LCaUHh3KDoGqVwllB0T6dwvlA4aSicORROHwrnEIUTicLZROGUonBeUTi5KJxhFE4zCucahROOwllH4dSjcP5RuAko3AkUbgcK9wSFG4PC3UHhFqFwn1C4WSjcMRRuGwr3DoUbiMJdRNGtoML9ROGmonBnUbi9KNxjFG40CncbhVuOwn1H4eaj8Aag8Bqg8C6g8EKg8Fag8Gqg8H6g8JKg8Kag8Lqg8M6g8OKg8Pag8Aqh8B6h8DKh8Eah8Fp56yvvFs39ygtG87DyltEsVF41mqXK+0bzqPLS0SxX3jyaQeX1o1mpvIOU4cqLSBmtvI2UscorSZmovJeUO5WXk3K38oZSpiuvKWW28q5S5iovLOVB5a2lzFdeXcpy5f2lDCovMeVx5U2mPKm8zrTjlXeadrLyYtPOVN5u2sWKqf8BRIOIMAAAAHicY2BAAxIQyNz43wqEARMiA9sAeJytVml300YUHXlJnIQsJQstamHExGmwRiZswYAJQbJjIF2crZWgixQ76b7xid/gX/Nk2nPoN35a7xsvJJC053Cak6N3583VzNtlElqS2AvrkZSbL8XU1iaN7DwJ6YZNy1F8KDt7IWWKyd8FURCtltq3HYdERCJQta6wRBD7HlmaZHzoUUbLtqRXTcotPekuW+NBvVXffho6yrE7oaRmM3RoPbIlVRhVokimPVLSpmWo+itJK7y/wsxXzVDCiE4iabwZxtBI3htntMpoNbbjKIpsstwoUiSa4UEUeZTVEufkigkMygfNkPLKpxHlw/yIrNijnFawS7bT/L4vead3OT+xX29RtuRAH8iO7ODsdCVfhFtbYdy0k+0oVBF213dCbNnsVP9mj/KaRgO3KzK90IxgqXyFECs/ocz+IVktnE/5kkejWrKRE0HrZU7sSz6B1uOIKXHNGFnQ3dEJEdT9kjMM9pg+Hvzx3imWCxMCeBzLekclnAgTKWFzNEnaMHJgJWWLKqn1rpg45XVaxFvCfu3a0ZfOaONQd2I8Ww8dWzlRyfFoUqeZTJ3aSc2jKQ2ilHQmeMyvAyg/oklebWM1iZVH0zhmxoREIgIt3EtTQSw7saQpBM2jGb25G6a5di1apMkD9dyj9/TmVri501PaDvSzRn9Wp2I62AvT6WnkL/Fp2uUiRen66Rl+TOJB1gIykS02w5SDB2/9DtLL15YchdcG2O7t8yuofdZE8KQB+xvQHk/VKQlMhZhViFZAYq1rWZbJ1awWqcjUd0OaVr6s0wSKchwXx76Mcf1fMzOWmBK+34nTsyMuPXPtSwjTHHybdT2a16nFcgFxZnlOp1mW7+s0x/IDneZZntfpCEtbp6MsP9RpgeVHOh1jeUELmnTfwZCLMOQCDpAwhKUDQ1hegiEsFQxhuQhDWBZhCMslGMLyYxjCchmGsLysZdXUU0nj2plYBmxCYGKOHrnMReVqKrlUQrtoVGpDnhJulVQUz6p/ZaBePPKGObAWSJfIml8xzpWPRuX41hUtbxo7V8Cx6m8fjvY58VLWi4U/Bf/V1lQlvWLNw5Or8BuGnmwnqjapeHRNl89VPbr+X1RUWAv0G0iFWCjKsmxwZyKEjzqdhmqglUPMbMw8tOt1y5qfw/03MUIWUP34NxQaC9yDTllJWe3grNXX27LcO4NyOBMsSTE38/pW+CIjs9J+kVnKno98HnAFjEpl2GoDrRW82ScxD5neJM8EcVtRNkja2M4EiQ0c84B5850EJmHqqg3kTuGGDfgFYW7BeSdconqjLIfuRezzKKT8W6fiRPaoaIzAs9kbYa/vQspvcQwkNPmlfgxUFaGpGDUV0DRSbqgGX8bZum1Cxg70Iyp2w7Ks4sPHFveVkm0ZhHykiNWjo5/WXqJOqtx+ZhSX752+BcEgNTF/e990cZDKu1rJMkdtA1O3GpVT15pD41WH6uZR9b3j7BM5a5puuiceel/TqtvBxVwssPZtDtJSJhfU9WGFDaLLxaVQ6mU0Se+4BxgWGNDvUIqN/6v62HyeK1WF0XEk307Ut9HnYAz8D9h/R/UD0Pdj6HINLs/3mhOfbvThbJmuohfrp+g3MGutuVm6BtzQdAPiIUetjrjKDXynBnF6pLkc6SHgY90V4gHAJoDF4BPdtYzmUwCj+Yw5PsDnzGHQZA6DLeYw2GbOGsAOcxjsMofBHnMYfMGcdYAvmcMgZA6DiDkMnjAnAHjKHAZfMYfB18xh8A1z7gN8yxwGMXMYJMxhsK/p1jDMLV7QXaC2QVWgA1NPWNzD4lBTZcj+jheG/b1BzP7BIKb+qOn2kPoTLwz1Z4OY+otBTP1V050h9TdeGOrvBjH1D4OY+ky/GMtlBr+MfJcKB5RdbD7n74n3D9vFQLkAAQAB//8AD3ictb0LYBzVdTd+z73z2tnd2dnd2dnVarXa90qr1UrapyzJ8lqWLSHLxgjh2I6QhbEdY/kFGPOIIcQQAgnFqUscCimxUyAUQgqGppSSRxOSUkJTQlOTNO0/z6YkTdJ+KemXEGv8nTu7EoIkbdr/92l3Zu6duXdm9t7z+J1zz70ilJDzT9AXmIsESJSk6wkigniQAQhwkAhUOEgooQcJIbv9Qa83WJTEcFfakJLxRKZSHmZBs1grRhkzpEQBqlGgL6zrs1J969RQbrj7ghcmciOZiHL86FM3CMc+fuvaoS1bhnqnNw91wPh4Znh6M3x2y003PX4zPUoIPW+d/zL7If0J0fA9dq5/3L1pSz1JmCCwy0UgFCiB/QTgAL4UFaaJINC3ESrQ9a34ykxgB//TQlvrXiBt4aDh1R0S0cAtiUYXFE2ZaYA/Jcsy1VI6GK8NwyAU28EsxYsmeyam0xw1Yuf+vizkqB5je9VzZzQhZjxQTkRjVZg2UvBaKGQNhcJFeC4UOtBxqxFJRFMhbC2inD9//ufsB8xJPKSd9JBV5EKynRwk7yJH6ldff92VF4yvlhTHFZfNdcZjkiBu3XLRppaQV1coW9Hf51BAIiCMecChgSI6lDk3iC4QmCjMOoGpQIHRWRmAEJjGA5DNEhAgEze+85qr98/v2nnp2y+Z3jCZyQQzQfwzdLGtqxYwpGwykalVytVaqWhml+WDzbzczGMjmMCvYy9nefl4I98Fb9Rffj0Yb9Zv5kvNfHJZ/eOqMi+74D/dsy2qsuCTVXBJ9Cey69xDv/ka/Ce5I4uV8MRLyx7xZfuMNK+oqjW5rAy9kZ9qpK0Nv77C37xRhHCe+QXbSp8jIVInm+obXIA9MhbHLlhHmCzJTNpPqAQS5dQoSiDOEyIKIhH2E5lIVJbmCGbEaSKKwhZMCJP5dC7rN5OGIka6wJBBSmRWQrLZeiXcmUEwa95mF2Qzq2AYsNeqWW85g71WzlR7YPGkST/otL7ijBqvewwwtdeNqBN6nM/NrjmDvwn4qyrKmXQVypmnJJXSxTNrZmFWc1ovqYbntKmdxbqnNZM68MSfWNetmVUVp0NyywpUU3A71haoIjTPzCK923KEbUN6V8hesrY+smvr5GqBCIMqBVLuaNUFBmyMt8JBCfA8ihRAdgCGYoZRhmKG7p55+8UXXTDelUvE/D5ZNLvwDRMamMVqGmnJA5JsBk1D1iCb6MEMfnhjVLKZrCwlcJ8pI//WMj1QAN5sq6Baa54sIU9Xa/jhhI3sHaxVi8HmzWQ8gXJrcOq6Kbr58GaIKPIe1envkETPJrcsb2gJO2RBP6q49NbghZIurTMFUelQPcpu/OWquEfRgulGWWVDKOxQmPcoNrMnErxQ9MjjhiA4GoVVmB2cnj4yPX0dv65HA61FSZMCm0AcciuTEV2V3+FwDYlSPSpqkqvoibR6wCXbZVvCsW7ZJRublhV1DorimkizaFhHquQNSs7/b3Y7/TzKmw31iUI+F6OiKLWAIJo+ygQn9rQwRiRROmh3BBGYsNj6gELeFicoPskWfq/JlGkmvYkOWWztwuYOGBrLJrJmqVjD9m0cVmJTFqBci0Iwwwm1GKzWJLnKbk9Xcpuve/iyD93oD920Y3DG5/eEQqumMvl0vmX0s4fEvRMXVlZWA4NleqCaDV7wgdt21ulFdAOsqzLJvWOEBmjLxrncxTvFgLF+D6xwxeopCX8fbufvZ8dZG2HIR06ikxbUFRP1Mf7mDMgsnqciSkbOXRLKStWlMEmWpWk7IclbnA5kPnnS5422RVrNgLfF1+L1efmf7uacF6/El7Zy0Uiki6YGBVoN8gw7fu4WdqP1xMLLtAAX8vS5Ww4dgpCZoNHeGE09e+gQfeyQ9cQh648PWkf7r7wykU9BohCr9V/Z6Jt/pV+lt5EUidZbEy26LGCrjzHg+pVL8t1GxDAEMYTqFWkdSVzmu0x5FWT5roo0XOM7Ey8HTfpVz6Se1x94AHeTOj/qb+Q9ngce8BwyeeLBBz2/WtBT4AWacuwE/QK2ZB8p1LsKmXQo4NHcCjAXCjM6JiB/Mk4YcJDyV8x1JBNxryGKwS7wcn1RSQa4lPI6UDrJXH9kHSAhC2aqNfuNm8qkDd/YYD4UK8e5YIHV+DmaEGUqi9ZN1k2yW0wKVITf9fX6b0cpq6g3SNBh/QyLnj2LPeABxfo5pDpFfJ0R69NYtFPSRNjo8Vy5j4vl7+4W9Ab9oyAagh8jhgjWDf7aMGa/PMcvFYNymdJs3ExDS9FB9XVnxPm6E5/ymmbCX2mYxm/ENBt99gQNsilikFK9F/MS3g/55RAnRVTRcyJyFIUpkcvQzQLKUTqR5NTkj9tcg20jtUFJTnrxU+FivFSkwbf1Jh4w73r0rrsOXzbF1v9eR8feB60t8PCDN+y5qvlMthPlaIW01cOVfDLsVaQ3/ZDOzCAVA10otTygQQ8sKW650fJIMAXgusBufq6r25ByuNxDIcoGw5qW9Ay0fDDXNtaWh7vDA1pK01rvvjuse1Ke/ta7c9GxttwHw/160qO33A2KNhBeiXUuebQtB/nIo5fg2ZVYafPm33SBCPZvOM0KqAu8pBN15Lr6mgrSswOlPKFjxCE5DipchB8kMpNRDiFIm+adixiOkTmO27Zw3Da5cihZSiaK6RUhn4oYJl3OaDSKonzxuAxjBEtRDt7s38tQMzRbJVvBXYN7TPqCETVoKBz6HSPmo2YktC5mnvtSMAox8yeuavJ4our+iRn7pCN03PAcR9o7HvR7X1ej6uu+NtSEvphPCLsWE3c8acZiJu6gvaOjPQpTZlPb5rGK+rqXk6KI7TDAHmHvJh3IXyNkPZkmN9dvbFWpgH2jYq+6VdSJAqBGRMQgqSCp88Thlt0Oeb8HVOJ2qO45FHWKS1bmuIx3ii7nHOPUhu1DXeMaiCKX1sRNLtgwObom13nRpsnpDdPjY2vWj66vrxqolYuF7s6+XF8oWeowvGJLF5gBAxu8UvbVKnbjoM4sFaOAYDAgB8wgbytOKBK2pZ4RJN30Y4s2sOJKKONFOVs0fQhQfFV/sVoAjZrsbRdbP0JG/tG/naGlQIxGgi8FojThL8OHr5JaPaiGtLBoHf7Q2bPWy2fPfmlPIBYLfBh3uRiU3/1J+oz1rPDULfP30pN/f5LeS1uuuftz1k8omJ99ClQ/sFIsh13UkYASMO8+R9gTzXvC4sJ7zkLhLH3Z+vLLcH8U7xQ1P2xGo+YfPG1ZTz8N9OmFz9171r6lLee+xl6l30MbJ8VpMYnoJdVCEVALdCwBsBZ5C/ukoTgQZM9JwFCjTOGB8eZlZJKQeCxo4g0CRroio/xLVxapr+LlsoRLqaQXEpJcHhZLFRHoT3ZGjQWfEY2YEItVXeox2v/QPdNUjwxtum0KJq2nhvqnnjWiSJIZpMWi5rKGYWbqTiUyPTEzUvjw69Y5sigPXkX7LELi9ajXlmmI2VAWMC6RgQQDbieJQERAk0ZMZJH5ma2LozSI9hl2HaJJlG1O6wGPmkuE77oxMT5c8Bv5+rrkjXfdbD2oXqjCJo9arW5Kv/N9EMolAkaqIwx3/uxm6wnVfv4vmA/lUZJ01jMNyIBPPyTaTcS5FpsIlQO2UbKURnblFqJtHCSXBNNyIMvVQTDAmdQXM1+NmfPIQq/aPPhqNDiPCZ75U372ByaeDfygeZaz26sxAufPo4wfhL9CGe+ta0tCMVDk0j1t2yRc+jUYftDwWC6PQV02G6uPooRHNMwZ1El4t/Lftg1xfMNGq9XLHYiVFCQY1H2LtMBBBZpbc2+FR5kKfkq2PbzM9OGmDnuLacSWiyme32ro5/7VFhfM68FX+s25nWN20t6DPs7f32PvQRvTTH4B06RJJ5+l97BR1FWo++DNui8Y5K3joKat/bKo/Rrq2TToXdYr0Kmql6IWtHY4nXA/ttSlKn3E+pr1ip1U4SN4hPudzkvVaPM5hxef43jzcyI++zlNDVtzQAO5BPmD9uLtI85L8REd1tfsm+FNVbjCuqzxdOiEjkYBXpA0bYqGneVG6kMNbCLHcurnZgNh+7GHgIhofnAvwRRhjBtTTJjsLHuThm7TYamcybI4WvmBUrCU9jb7yVuu+dFUwq4I+pFIHqdwxLrmCNDHK0/Cxc32194jRjX4ihYV36PBAFpzELD+BU26+bdb/273CbgTCShrBvg81osJ0qSnI+yUbQMZpMDfOINv3JH1MSpwwkFhz10Vy/0qthEEuyPJ7pBPRPG8qNrSi22Iaj7dMHoynKu51eKBQLBqy+mzTYUGu61bAgPmYCAAR81p+H1367EL95w4sSe2rsXh+MN9NLc+7lGXlNh/WLcYxkpj0ISjtel/NNPrZ+HESx+g2GQ+efbGIdrSbaiLNHUFys3PkwyJ1Fta7b52Axld6u9UImlDEUNDYzVr22RI5Zkq17iIQOgqbouVhylXMOzV275/ezZ34PdaU6qGDUKZS3AbsqHLni07YdOtz+68/fu3wexlD8wJl2UUAVwqoInJPKJmKpGIP1c8MX3BrXP9cw+gQiTn9zIdu5xbAR7iJ0HSihyMkt3vcTNs6rFoa7glaAZ8XgdZi/QiEA4yRGTuWaQdBlP4S9hmiaPbCUKcqkPBW8kI3LhkD3iDLO4tedPxQHwViHK6JsqAG6v5ZT9ukwx+duHCT+B26zpQ4A7FujMIR0PWi3mY6n5k7ffXBadXT5+E02A9ARuty75x8d2XZC7526n5KShf8OIF8PtF6zNFeFaz3qkt0szzrJv+DH9DDDHfqbqq4Wt5kW7o2PrHzU1b6kUuj4DucoKM7EZlwkURQ2h+GRFUECVBnCOSokjTRJKULUSRlMnWeolXQsG1/79Ra2s9noi3hIDku+KVRKUtEoq1xHSP2ymLAiNBCLq41ywhBUpllN9cqCWygVJlGGFmAVhCMtBUL2dY07SWlqxyNLzhgxunjrVp7kTK6TjW25ebKLR3dw8XCu0Hts9U+/urM9v/cXamWqtVZ2bp3ukLByLRZDvcUHKtrfVOdFrzhVWFwnAPjfVXGgV5jdl/3D5T6bflxPkF1JHbke8CJEF6690yInGUSsvcDBTplTJGpxE2sS0cw08GgkHD4CwHZWS0hAfNLNxJBkrFIkrHINJ0okCHAUmX/rVaQtH0vZtwV1LVF1TuUVHvvOqLrz5/QLrh2deeuQme1tWi0/ndm5zOotqOJVQssP6a5w4ffu6HfEfY+e+ePym0swxx2Sikij2EdIkkyX1BDM1WBB0o8Og0HihXMZRMYnvFW8M+rzugBQJF7hJJm1yTZDNcfAcZb+6EFAV/lfeAFGy8e5V9s77nxoXjN5UqdagMn131R4lCYbSX5q8Xy5NVkMZFnU08M/9nl87MU5ifXziOF3tHC3CL258p0/6U13vG4Thjt6uFBPoBejOi+CRJ1eNv8tlQNo0ilwNRRieDK4Ilbrv6MzVuV/HOb9pZYjXgXcJJQRHfLxoTaIhtzPgUXTvzSX3A98kzbNRI6Oe+pScMuNnX76MTaCrGNEWa26GqO+ZmVcP6gB6L6XDIUJ9X1UW+eYbdwy5AXDRIZshD9fAAOMS3jVEi+J0UZDa2uYs61klUpuvWP64iH1WJyByCuIuAjLyxC4U0ExU2RxyEyA5udRAZBPkyQiXJphNpC5GohLzUzysy0bGf10Ta2v/bVt1a17ZuCQYjHUGU0UbDguG0JiOgaQdURghVepokhxJzkRCbNJgtUA4YbI9VO15dslxr2UXPQEOHy0H7yLr1w3pBN9F2pzFT0TTB9OtXe7r1Kd261nM12v9Tun7YU0DxpgrRoEOTnYKi+uC13qnCewtXF/r6et/bc7inZ6rntp6l3KNBz2HdZzJd8uBLC6pgeguewx7PRTp8xNSv1j1TnjzeFO+paQ4EbQifmMPpte4a6bmop/fqnvf29vXhbW4rTBV6Dhdub+Sauv0j7AOsDTVlO9lSv0QGEGFMAYTRlK7jkAsoqngusYR5tAgPyKiOJJFIcwoWBHEaDyJsIZiZNANAWsOBdrNdc7tQmksCMcBwNHz8tmqSA0n8xCvA/VS22ZJFOWaY9PqrH6CnjkSC4qGDKK+nxQcOc3dOSyiWYG0PfP8BEc9f+S2YDrZd/VHrTKwYoYlAiCt7H77/11mBfhf1j0FCSIUx5OoO0o2WXpUMkGGyhoyjxbeRXIRW3776FWiSjayuD68cGljRXy319fZ053Md2UwqmYi1RyOtYdRWhj+Nv2zMCUSVJcSegPhm1qFQkVJxih9FuplgbgLI9MUXbdq4Yf3EurVoyHmdDgVFNPGA5mr8Zu4nRtiT5JihJGaTclAO1rI13OwEfmX8ZuV2qPETuJVW0ay8ChpbsAewSrqW9CNokkv+WpKBr7XVJ73XmrjN6Q+H/TDuP+LbcLhlaGNsw8aN+ycnN3Rv2LBh/4YNk3d1ecMb2zds2Ng+uSIzEMOzT7R4Jw+7K5OT7f5rfBusWzt693jXgz5/yZXqIP1uOBNe2EQfx8O817vxqXcPbcA6k/uad+veODk5mbukdePrmGjfMDAQm9y4MXezd8OT9dLkxj/HGrWOhf916RVX0JU9KK9+fv6T7EdMwd5Ikmv/JGqrgfWPO5H5OwnKpIPYiBJIB7nbBg6iwYfy63Jim3ooyshWLlY2tNY7fn1ZhGtvKbq17m1ra0u2Jb1+b8LvNauqGOlKN/wyXOLZPvmSzN3Pce58zpayYrqE0II97/NJESFlnnvJTAkRNXf/jkfOKEIH5DsU4cwjO3qtc9a5hz79RTXvu9cIh417e0P7jikHDijHzr72GhA0gZgtm19Fs6RBd1yfoBKXEV8SYdb2pbApbpwBGmeYm0yn4/F0RxpJLp6Kp4xsLuRAee3N1NLVoOmBOOqUKopnmaGs5i+OwgYTSDPxWgk3qsKeNpez5bv0xPdanFob7HXSVqXF+ssWqS9bKUph6/lWIesHoesfO4EZcMztesbZGnft2aO3tTqfcbnPkygNfbMl9K0wjXznU/hHUBMu2pbsLUguidZYidTIZ+ufSrUmWYsTHKzFMRsV2xDkIyxkdFYFJQwhtxKaJbLplqeI6SfmVCIYaBfcxA9u/2wEwMdddmQ27o15BMnlkqYaKcm12dA15pJcE+Vyb28qFYtFIqGQoggCIeUaIpZKb6m3VOxL9aR6Ct35rlwntls6lowlE/FIe6Q92hZqDTUgpuH3eXUPyh3FqaDoEWRBRinFCPOmERnXAsmKH7c4blCqcCdgUsSNeeNewHOl5nWUTt4SYinA8/xzdmxsDF4bt1yv4B88dvbsces+esv4K+Pjr4yNnR2z7rPuYz7rvr/BUo+N49/CF87yP34edlnfGePVo2fHzsIuXsK6Fw0E3Jp68/PsVVZHCVYjV5I99V3zAE5E9dCJYkbqQwm+OUuZII4RJzgPEgnhiSSirYX4GQUxssEhFUC2G3bOgTCVCdN4ENgWBSU1mzywf+8Vb98ytWmkvnKoXOrtKQWqIRdSGkhytsAWvUiDUGzoM3uYS+qBgpit1qKC7SLgysz7xlWN++w1ikxFl1UfpjVuYohLNeBwostQouGCeSP3Cd/4fvpl8UnRo/ZGo+GsuxDqCKfc8S6XHg3nQ8dVTT4j2pePt+ZjYZevRQ+lfJ3B6kimUbs1lzJ0bzjiSqUK1XpHowJdV97VqWfCLmo7qRe+oOAtXNI8YiFQVdPMGOWdLdGcYVC8Kp4R4UfNAnoi0ZpYmS6OBnrCIRPs2r5YqiW5cjhc780nXKxRwe4fm6+PoFZpI3mypl5PYJfAmMTHOJCw7KFDKgpzNsil0zL3QG/hCNdWg7mOdCrcEmgz25wqV4KKrRCizNBYosDKw8zfAI2GWTPRBDYkW0UUNYDXZh45tLmjY/OhR55eTMzMHDv29LFjM8pAThiZqdcLmqLTI8WJTcORoamJYnFiaigyvGmiaPluOnMTfs8qLlXLDw9vGy70Ltrv9Bbkbxl5OlfPiox7VtAa2Y8Y6QARAOxBev76Akwm/emq3zbb/fEKmsEQFN8w2KtBu59NmbuOnoS26SPTAC/FzIUf2L4j790vnqQ+TD64b3Cablp52vq07T2CEcQk+3bffffufVHUD+fRbjzN3Ijf4qRY72lHm5xbW3TMpmvuuAaBG0ooNrmnh1sKwCaDSWTyhqWAKNvAdkPsxscgk9xAEKI0iBDMpLeceOkEfiGaHzA+s/Odm07sqdOhfXc9cNe+IVj7mQAce8cJevKFe6Q7rXvbcoHPrB3e+4GP3nVgQBjZfXLDO3d+JmDz5l72HLsYJWOYjJD31F2EhzSMdbQigSGK1VCRFWREPIh6dmH7Arkcf4rAFNtLBSKDuV9Frz1vqkDn/6saW+uu9oSvw/Qm/T4HQlaxzH145QSipVoxHc94ywWKPBnQRY4yOAFx/15lWKiVqzUeFMI9zHIUaSvKYMER7wXfQIfDupOe/WC4PLVvqhymD+XaXscOfL0tFyn0pnz01ivEWD4m7j0GZqK3d07pjTscnQPwRw9DZ2SoP5HoH4pYrzzclhucnh7MtYWK07O3b5g+oavOYBTxmFPVT0xvvG1uqszHCHkfCz2opb2kiJbBKNnM4y7q+y7UsIthzAsOp+MgQVl9UAeFKgc9tmaXoeFL2u9SKY+9kOYJgkipgTy1hqtTs12dbtvVOXvptq2bp6c2rZ+4AHHdquGBFS0BowUBU1z3YZtBw/FZ5n6PWrGGSBOaLkDuHC5G0azkw9PFqBCEBgsWTUwUYJiaInedZrJo0vFRVuTRYnapyPptA+u767BWyI3EM2lGb5laY4VGN4Hg0mOZgbiUKoxvWtfSqSuJ/kxM12Dhi3zEGVnlDjvM5qkbYM1wYf2Kbd0M4cBoh7B2rHl9lo3m818ww+AO6Butt49s3DgS7R/pL2fMUCRMTT2sUjNT7h+J0OONUWzrX7feRG/45HXSrX/bVYBRtnqjHnCHQtC83IgHoEO2LyxEMvUk90YQaHK+3Z5kybkeDPp93HqEhmQqVmsGj8zB5mIZm+vhscZ73uX7kiOVycgv+h7+0cPw48azBldmrU0+0/TB49mVRx5+2OajT6KO40+OISJ/5E/S2OscCfKgokEJ6UAWscf3u7DXZZHMC0AUmSjziCmcTuVyfFGUqvKcG5wOh3MKD07HVoJ0g9hw6D+vLSvO+d9cfWs9GkcjOt4dR0zRmUHo39YaxpcM+VKVhFfjEiYQ96N245oNbE+5GSwVgygPmYwIrQsS/kocbWskpUo2HoDnrX5VmDulB4KaL/L/hQ2XL3dqTlCtgQcikIpokXsiJ+ETkiBNL/i2qfAJWLcTUvvCnd1hlxaKbdpn/cNO2FGthhfet3PLxunph3Y2xqyeYFvtfvOiFJom+8nl9TkfoDkyRlQqy+ou4nZqVBLdjTAW0vCRo9C0XUwIFOkcYmfZ5ZKn+VF2bSUu2bUh1rp31+zWqYtsCwgRVut07GK/gR+fh3tqF2M9ak02qDVCyopmOoE/WwMeqqFRU8KPwSM2UNYXzSp+hoGHfQzTTBU/ZTv6o4CkI4Ed3SElMJfN6LxMNYaVUFAvxnqsv/mTx+hNzxxdFc1HaKwjYX1fyA4aowVvJOeSFIHyP0l15SJ670huUp3I18vuSF5945Iz16YX1mU2wSNMvPnqolU8fLPIMHm4D0jf4ZskthjzMfh2/qCb6LH3BaLRXDS6W5AUJ7/vaGaTtCkzGuqI5JySKvA/haq/9pL10Zv77PtLN11j338xbdP7CXYPy9l9FiQX1NdxXCpQAcZk7khkAt0vcvwgENvNxHGD9AZu8PlUBxBf0BfU3A6v6kWop4DSQA5ERxbSiZ8PBsb4YGAgKGe98OKnQbN+at1q/RS0T598+WXr7Fe/+vTJ4iMst3gWjoJ27sWvQs6+SPe9hlfBx8dvmph/I0nWY0UOB5BoUAM3fHTNYMORejyWYQig04btVUZp2kMzdlfyHkb7hKN0O7QnaDbIgQYMRIo2bVQwb7tNaggTg0XubEFOYj6X5FxRLnmi3vBgtWvs3q5Wv4qYX2bQ1h7Rej2KoBq6ashUV2KZKKJZ0HIHJsEnOiVZjUZjLlkP0bkso/d7erVILCKISsBozd8z3lWNBHVfTPOUyyuckouybLsR9dCQrjhj0agqKk5mwoYDORdFhRtLJQBhVNWvItxAm4fYmGTq19hA3AIatCMHryb31+9bnaZtvgu6U8zfRsdiEA2Dry3qm4u30za/o226FfwtQTdzKH7H9pDpYkrAKzNRUMRZQ5eY4HEiqEHINauplJFIhEzZCRLZgtZyZPKqQ/v3vmP35XOXvn3zxRsm146uGl45NNhg1HJfTycC73isnUfNhFtCTaun+acnUOEhOkvyLbvsCG85MgR1eB8eSmTWSsUqLCtfa14LNq/V3vAZojhciiJZHEC0UeDY6dNfOHPmC4t7uO/JJ8+eOQMfP3367JNPPueSUnbwHt/fZ586e/q0T1WSdnhfUlFfyUfO/aQtl2sbL6dT6fLZaiqZrsJYW+7C06dPp86cOZM6vfDc6df5LnUGek/bdzvNa1sZvHb69PyyU/mFCr8V/VJbrpoul9PVxj5nxyydYI8hb/I+7UBE30vK5M76HahBHMQhonhFs9GpqPsNUN1O1T1P3B6n2zOPBrzm0sC1n0h+cIiSY1bwoVJ1KsQ55wWPjhzm0WaJi1LXFHG5uGfIRSfiaMgCQdzR19s0XNOpWEe8o2G0NvvO5+YjHhJphdZAw18UsCML0cxPLjV5CW3WUiDN7dRFi8Efz8aDaLPyje2IdndHJxMLG1qn4t3d8bkE9SQWfgp/tfDFYCyej8UuobUeK/K197//i+9/Py0XYtaJ9sLv/353DA7Eu69597uv+UvrHyBlvTPWFcOvNfHTdyeTyWbMxC/Y91A+SMgLK8gwGQe5HqgPD+pc8RKhzINExlajwdB06/YS7vSQhf2EGxRkFzISijlhTsGMJIK0nXD/GY+15L5qkU62LnqEGuVl+C0qBP9HD6r3La8i8ODk/6rO1q1b6yYho2tWDvUVOjPRVtOPLSEZDi4La1kk/IDtmzERP/qXBSDU4sUgdzxJ2QyekmSvYQbjxSoay1jQZEFIVkDONgPI4N/ql9QrEHA4nnP4cEvNrrF618zOroGXklEHk1sV1e2yetNlHuz5UrosppRQ7bR1x2l6sHS6pOf1S/RPrb5kdXsVTizewvr03sYNRmZBE/xSRBFYOd28xzoZ76DA8VPWHaegUD5d9ngu0fO23nqC+bGvDZJDlL6hPtGZRFv6ItRPGqqFPCJxYawZqkgYFdD4bYxqzSHQlxCb4GGLjKWkya6uru1dW9eh4OrorMUVHkaH6BkxdEFIJlDicKHDOJ6mWbRfsgnZMPlZowEeWKZW0XnRbDVVK5o8pJ3HO6IVI/NDIiMnZKh2pl8OejKZci7WoaNaDWYKo1U0MgeGM5FuCcD6W3BsNAS0oQRkRSMajjBaA+0Cd9GdnVhXjPnChVTb5sPQUd82U27Z0TJ4CHx/Xk+HEj4Vba/BtplAGU4KWqrekx3ggCdyqK07qoUtVqGaIuumFhFTNBUS0VwTCsCDwLVEfiLbVowmdM04cHH/tipqGAGkxbHbJ+ggtu0A6a9XdGzOQpcLETcda+EBL5jAFm2g8bcENqyolHt3RAXR7ArUGl6Wqm8lYKPVkMJQNq9C64YjK+7llCXqoVIAYaokJ7iWTiKqlVVXPuXR0QQacCfyqrqmd7y9tb+jShXvJkNkIhWoZxSpRgDHLJWlkKSPeDZkIqWNvYLqkv3pj94PCUNTJEoHBD7OJJgRZADVHVSjjinrpcLFBVNVmSfUTjkE5+NUvzj/CXY5K5BOtPna6xGXk6Lh14xpbYxU9/bku1qCDMVdOgrcmSRluKdbWhypHoTgsBC0hy4RRfjNpsyj7ZJgSHX3fbGw2nFsbyTqavcrpmamguUxNXP4ukc2Kdjbav/czpRm1vP5ev5HxeH+UIc06opFDtza4YrELuzTu9u0sKQVr9sy7JIEderjeCNwmYV6oVBfHMv6BNvGNOSCleQiMle/dACtzPVDgwjYLgBZYGMTII8ibMPGAz4oQkRG5lGmIPyed2CHoyQRUaYIsixM40GQtxBZkCdXDee7xtcNX7TqonKpa2V+ZXsi3KFyO4sbFoHGoD2HVLVKtVZFjYpf7GIezWLwhghiKzDkGGQYZAIjKNdMP9qudhywbJv6lGbkWQa+4XBsorYp1wk0q3kEl+hUBDGSAebPtFdkLT8/dmy2v3/22F03z1VhTf69W/Zs/vChUVo/fM+Wfdt/MDk0ctW9SFgilXyFaLJlanioVyxmXFRyOyeZK4c/ujMZbRWq1tf7Z26989aZAVqdu3n8ypljXQOMjR449dCpfeO0sv47lx/ZfO/h4UUf2j3wYtOGGajXEOWhxcJpfLqZJLBFZBx8Tvpt+Bs0fWF/eDkA5uNHfj6Wwo3v+K8kDhTq9Zl6He4s1Ee2jNhHO/9ifdvIyLb68j1/nfPnzn+A3cvy+E5+pNMd9e0uYDSZCAUFUUb4K0uiJNt+VkkU5hUgDkB4RrlpxScUzKlgu8vwsOgvCxj8vTOpWLS1xegMdOqaw6/6G+/u5Hq9Snw8tJIEE1JAws5FKMcQWmWRT5HqORILYq/zUL8vfhp0yfoPRO4/kcD101yBJmKZwlPRfWVfb0hTc+He6JF+vWy6XKkwy1Hr542SKoJ838necCSWjw0sfKJcDqUyp+YGCuFE4p49pBk7xuNH2vnocYuCIgdsVxsfSWFvRL8EKpWUbf97DQ717ZDWNyLrGvGrHOizV01Z9qjfnh2xrrW1zR0js99WPbJs0rsWTgUdTP32jH3+dr6f+bZK1WYcEXbAcfoYUUmAdNdzAvfhHETFT9nBN5lD9mDPpM/r9+Km88kY/jhCo2ylWM0m4Y2kDy587v0zt8I3eSR4M/WYdebO5+DgsVnYuJiy+/3n529lr7IRe15Thvtz06lkPMbFhh3KtJbjGXJQBJSKfGoEY8KUZPvTeazQZHu77mnPtGdCAU9Ub0vo9ryIZFa2I4uZPXrjb+C3pQaDStaDoi3Atuw8evap8uQ+NUYfTmkv6aapL+T5nn54/KFj75uh0smTG8unoCOj/VxNWHeGdKtDD4V0+JoesoY+emro1kfObrbl6/8+/x32DeazY1S4L4eLVtaYfsSjUZuKoyXUCBnpERrhyTwaCLcoN9y5Oww1bYotgkm2dXzAF9YnpzNRX5HS0aePPvOyqnz2OkiMR/P54XyeHug9Oi0JESVXGBjXwhMTL3zgyA8T0wvvy9dzuXrebttfnt9DP4O2k4RvVuR87nNTQWS2o3OMi0mBiXM2DwgUewPfdIrrxi1cLUwW+zLpoDfhlZDygoh2paxUi6Osw/eMcTXAgDsbJD76Ts1gqdrUFNlM7CsQXje+7svWT8en65LycZh6RBU66iO91m2CImjU4aROrX1LaCq0pSUgeN2osHVr4MCePTlKvzx++7bbxq/7+MevG9q7eXofPCXElKjk8Qsef/6GbbNHkm1ym2kmfM819cIrSLf/RFqQg9K85TnpRNtawygfeCgWjDJuPh/kk3h2e8PegM1Fw0LNm+A6jg+4eHkgqOg1g94MeBEXVuEl0ZiY+ejs9o/OrnOhvMP03OypuXVu6zMfnz8Arz18YB+9RtQyMRMWdoSiGVV1KamEQen9oWjK6bSGtRXwFwPWJHxOG7BWrViMu2cP0nuQu9rqYU8jJvBN6tcIGoxPGrCnNmWXYhcaAQzsQd2KIaq0fticqwAH7MkKFEnVink8YDbmLjwIB/nkBbtdDgnfYRvQpupGjXl/I2ZqncdBYXT94yEeM6UCSlQJQbqAZrUgzyGJKKKkXOZExMAcIo/dAHBME4fDHiB1AI+ZsivJRNr/29faWm9vQ4traEW5ryOdiEW627pbTK/uUhv2VXM8PmhPlgjwoNCaXGkMaHDBFrAt2hof7sBrEhYzRW/ZRvA8jaC+KqxbvQ1m6pUPW3OrZ+AP7Ay9cvXMuZ9+ZbIKF8cCC8cDMYiy16Lmwh/FeiEWoFcGYvTxbSPW3Vj4wx+eqeO2GuZXz8ystuZ+WJ2Ekj00Yn3QjF4B+wKx3nbrE/wWdrteIXyOXWTHw+Z5JBVyEDLUGzgRyW3ODrecfiPcslSuVCqlxbBfPl7Dh+jsKZTeN8txsfHTDD6/sir8Rcj/yw96w2GvMO8L58O+X/7YFw77BL8vbL2UiVjXt2YyrfDe1g6WucUXgrD3FixrfXrhI7wKvQzLPoIlqplMg/7gNXqCoNX4pCpCdxfYYc/2g4PwfU2zpkOJRAiuU6Oq9R+6EaU0auhLuoH66LM2VkjWY4hOGWcpLtd2cwW7HBI0po2itE3gneOLCXh621PWuW1P0WfrC18cGaED9cVjQwf+M/sk7UQbp6VuupfFbzf4wsf5wrGMK4KOZlgPe9Tawd93RzNYtoPHx7pmnHDcutzphD9wRtUZ5Mev4WnnDI+YbfDhJ+m6xrPsGbFjZGl+UdCwn5XmPtGlEN1mdC57dAZvZ33N+lozRvd+HpF7v3N+RlWh03pFVfl1uF9Vm8G5jWf54MdIK6F64K02RKVkT7Z5yxxSHvK9sM0esKMPLYZ5N+K7Y2/S0xJxk1X1ISdqaBfqSe65AjaGJg8P5hzlsfo8OmjWfiqP5SSb+VMnZFl2y26fofMJSul4IFsLxNOVeCUoV9jxhR3f/Ca9/9wt9P5vfvNdBx/+2KFvHjr40MO8F5Ql/6kHJUqW1MgI2UguJVeQd9dvSsUkfNZMbyYaUrmrcEMh7KOiRC4ZqjJB3DO2drgfiZ4Pl9svSfYr9tA4H0DiqHweOQj4wLnAI8TmiSwfIDbgIBxvOGy8wQXIO3a9bfPk+sGBUl8yHsm2ZYkHPCoHoAk5k63W0L4KGGhjZWR7XynzM2BfQ2CEZ/yNESMsWSrya0E+31GSq1yySI1b8Av22BzP45mVUGW2HcAxV7b6LdPozVcnZoYkYbiqHzCGjJFipqDApog50D+98boDk5vDe08dE7TMUDiqhWY79CMZfaBYuE6iJz991bZR16ikRc27YO6kUB8J1Xt3qjvDmo9qm/cNVA/Az9Xy5EQ+k9d1Se/tF3Ykwlcd2XvswNxwMQS9Wi4SHdZSYasc2mKooUi+YCj7btVOagVBO7G5t6imJuceT0184BjVdsDLt79o5n1Sv3DiiGGquYUfqYovsamec53i5MPnHn2KzdPzNj8nyDXk+vqRHaDIl05TohwcGajk0pIEER4BO9YO4igfu5GVXW4QHCCjbTDrok4Ep8BHAec0tMxFUZrmR0ncQkRJnEwmDdtgSF6TvGbn5W/bvHHD0GBriy9hJJZLCk8jVLYREltaTPhR+qHQQPmXbaco6BnvGNugxg8Plu0B2/CyOwgzduwsHynEXdCOqeQnSlUswgugRW4G7QmtvB9l+y7wpC/Ukmxpua1x+LOFrySLxSR83awUtxWf07SQoTllIxJrq9Si7R6PV1Y1XygSaw343A7ZobgdLkdrFAGlEG8zdFdLMc/Ers61/U6PvzUmeQNmtBVLuBUs6/YFWuF0a6Z16QuzpeTCX6eKG4qFTfRHydLCt7y6zO/odrkkhyq6RYfqcDrccgJUxa061UJfJtva4jecDgaiqqkuhyuIKcHRjsU0FRG6w2n4W1qzmb4CFncri3ie2xWI+7JkFZmsX9CBveVFTqoVEETHsT6f5QoSD7RHcc6NKh5gO9+c5TP31uHHgdZ0pZouNabsvcmlhpaHnV/uT7Md0H6vwafeLUnRbHM+IfMtudLukFVVtq5dcqKpSkpRz5oR5w7rblEX6kiF+3bweYdtHgMmzyx5z+xyS66zMwoK4L+3vssnsWBFSaqLml3RnqHYkF3P2eN1F5NtZDvZiVLrALmaXEf21t+RirYG0Fzc5UaTay/I0hiIssAnnFEQuE7nQnSeMAkYF1eoMLmAEkHmUks8wDEmt5dhCTEDufqqKw+tG+2v9fXmu9oi5GK4uBFl2fAaSFzzZ4eFLAqibAapNZOQC1SWuPCKsiB3GyX4IE4P8KhlPlKDG62WaijbUFMUgEcPMKwqS2awmvmVXa0sGdUaJqrw2OEvXvXAuz1aW6zYnwjTfKBFHwoEygcqSrTuaTHyoUR/L0J6VziT0Jwxl9OlUIUJrpAkyYmOjMsNuvbuBw5/7m4U5RRUQ3DKqiGpqhoR3A53GryCN+P3x8BHfcx5+Llr7vxWF9PUI9UWpkXz471rekurRFNzezySLyytKvWu6RkvRHRqZEQpFPSZDARVYkyKau5AWKGsGKGqxrq+dec1zx1euEfAdhckD3NKroCgyZohuJHyJdEloZJwg1NmWsOHd/4X559gIbSfDa5jNR49s2yyTX/W1rGmvGQ2I9lChtMh8zi81o9tY/m4av3Y5w/RF4L0MRNPWjuCKnMed/L5an5vfnGe4l6bn9pRYqZJiQyRQ/X9SdRibeAg2RiVRT51BdUyk2ZdSA8OkTj4ZDnUezK3r1RFUOeQFqlToXzcG6Ax7s3pxgmT5TKQ8lB5aHBFtdLbU8h3dqRTiXg4qOGvJkgC2jKUbMOFZszP0ih4oFryQAnkUrBWaUwr8yJmroI3aU8087IzNqiwg4Gsr+DO1L/nqZp8KlkmPvaxj1n3fexj+x8/Gw3+AKImzbwSDb5Kjy5hkVNo6lxrVj3f082Y+afBaz8GN37sc4//gM8/s+47blatjfSWVxGpWPc25qB/lf2A/rOtX+IkRwbIBNlenxkdGmSqs5yniqPVz43QMUSjquRUZ/maD4yv+eAgCnUoyyaUiRwzNYbQZ9/ATuPr6qv6q2l/IGjy0XEXX7yDD4rzyJrKUihIE1pxgWQvz7H8QnI5Bn8LJj87vG146ct8qrKwjQe80Ydk17kf/7qzsDxTz9fp0MwQrf+0276F9S/L19Egiyf3cdnHd2C+sYSG3XZ72Q/QbmtHq20DIqz95EYarNe2bb2EGZ5rD1DNOAhurRcV8Tt6ckz1jUUoE1e1acwpSAiVeByTY2w7qEE/SrR16x93oal3OfEYnoMBUH1eh4r2HnMyYRdSIjbxLmJobmPa1KnmB7eiuWex12SfgjTrI16Hz8v7RBId0na0aUQ2zd3JTio6Z98KZ1vXP57GR+38TY9y8pU+/u89K4fP2vXGs3yqd///q4fVd/+65zj3/99+EB/Xym/cGIu98/qrr5q/4vLLNl668dKZt09dtOnC9ResGYmtjK0cGky1ml5fyJ9MBPmQMp8fka01/JZy1oZBlYSUtaNm5Sj4A0l7CaJamY/OZHkogGmHAJQq4jLmKNlr19iz71F2SHK2VgqI/wWP/N1wfijVHonpoUFN0EKq6kg5Bp+pRBLwghBJdKCWd7cYPe5qrKM/U8jAGNvwZjb68yEAMdgxOcg2/kZOqnYXId3XoutJoV3ytbsVVMrRS/pWSzkY2WqobYVoKOTWdIjFI7FCR6QQjnoSZ5rMpqgu+Lf+/jXdQdRaubFvf+3X8xtdiuWZIftg2/rHHUhXLWUd+cgLRCx0U4HsnqWqQxhbAbC2tTGeahegv7bAf1J569bG7QvEoaiKYxdR1QN8fqY4LVE+GwcxtcB9B4Ki2DGffMqZoEw2n1laXouHPHKxSEXulW1Upb+2qu9/8MB6T6OCuv+3rMEptw3I3j075i6+CCVzpdQXixo+jywxMgMz3MPjR6huO6jRxKrWijU5iOpYlgJNZG6ftT98mhaq6WzGA0iHQbPWML/4B5EmL2tn+MAMH5fhaCqDoMj2mmAB22+CkI7KnkTbhL+nsNrb7gWIp+JOGRTWYiT6+gZ720OtquFwCYpAmeoP9SvQc1XXGpXRFrOTKSAqzKV4Ap256y+69NY1bodDo6+ryrkvccJkFUWlZwH6gAl8ZSClU9TkkVN/sLYr7g/rKlrW7bHOt+X7N/XF0y4DJXKvRBVEIIIbwSNTPB6n5Hx5/8pcOBVvT5en13S/7ZkrNOPcv6b4zVM2TZ4/f/7v6BDqT420cX9Lc5WO5avQNGd0lzNvWg4l01B0WZt1l03xfvMCHm+e8P3vHpUv56FGDTCf10wzYq/uoTZ9qy+yrWgnMsLH3SbqYwk+r2hMdlBQRGym/RJSnUgOcXWtcHXNm26aKAq3AxVxkpDObDwWaTUNr+7mQIbH/KtioMvvTXprjZWabIWMWexBtCHQ9EuiBZEtBZIotorm559+bqAAhf6BmX76/j8t9CYLbulpgKfBGcoMJbYfhp8tvEI7H+2sVqeqVatufR46Bkcybd6I9aVvvu/B1k2+cEyHmxC/Lc1/9JMI4rcqWUNG6qvaDB6XPsYFNHNIcyIPaFqayS5zSpcVRZ4msswpXVYmV9eDNuRoaWmstqHxWLoMog4ea8eDrfhUZIQZjSBV7AN+qRENHGX4i5bPmLw+cOiuqwxBi4QFbXJ2wiNEwrr1/dxAnnYMZyCWG+qg+f7C7wzM3nbX7Ygn+uduPXFsR/WCZVMqX18zTTet1cIOl57v7897NDX8T9GcXTHSPD7KJwTzqrfODgnl3Uc3LJtw2Yyt+oXQS48iEgvac0oGyRjaSdvJPLmW3EKOk4+QPyRP8miccbCbKkpaxWjrbDgY8DhF0TQ0VbDXAGjxuh0CC+kuhXuj6GV+mYJPoiSCrdgOkba2yBQeIm1bSFukbfLUqTN//MjHTv3hqT/86OmPfPjeez544vidd9x2y8033nDt4SsPzO/ZtWP7zNbNU5s2TIyNrh4e7C81/4qxxjptSDnI+Qh8l6ezy9KI8ZAHMI3yIP0bygR/i/PBN9/zvypT4Xk/jwh6i1/3rKPiwO+440YHfscbOTrksKIOB3zHYd3nqDrw27xwVuE5ZayZaxxeaRSxvtM4Hl884B2HMTF2bjt7taP93HYeZcVOR3NftGvd1tg3qn79V07d8yvpxh4C9qnm9zm7kMO6GF6zXHzjz4DXkMaacuLPBJM+gzZYiqzgazcVvLYdxmBpWaRKuSMb9PGICdu5umx5Bb5UkwGM+woKwBcd4EbvovN1aWUn7oGFLXw1L+ucJIEg6kJEkr7xDQlGX6KalFAk+Ap1yUlZgX1YQpMioviNb4hiBJNYei1mQeR+AUHCS7rwD9+QNLpxoUdWmAOFPX0Jb6BSzTpu/bJR6Rv/gKXxEdY5UW+u3Ua/ZMdcxUlHPS3zdXjsOCt7qQ9iz0vma/ds5oUnhqJeezAHBRvqNO4K4b+nIC6SA93++pryLfOpgYmRdVGPLoU86+obqxlTo7eghB6AXQu3JTvfQT3Wxb2zE6OFDl1G8zuXXzc+1wOPaQ2/BrdJTzIfK9ljtp1khOwkiXr75lVDMSLaC7a8CV4Oryz2UW5FmtyNgG8VhWCBxwyj6BoGv611ZcSGdigoNyv9GsOrGT5ClsmuAjNWi4LklxifbIRnCrSHovAbZrbzzZ7QDn8p1NsDumYaueiwcqCWzAGb2j36LmeHq+Oj94bCCade9vS9651FT7FPUIWIv/fwvsGWjkLKqXmZehSGj7qossvTw0Ih/53Pv/8ixaWA1C5pItV9CaV13RV/+9DmhAOuTub9jkLB4VRi6lC9xTOaKY07NsNlqNTkcKsg+Ty6QSXdI1Nj4ctaf6bD1RqmDlE1ov7qfod48cXMiFL/rPVv3ohPWRfwrJL0kJx7LLEjq4V1H1PDaqCvpcuZaPpKeezpG/Pv+uoFj0sWBFirohoUyGiDyO0xEbJbUQjR3HyeW2OGmz0a4k17wRYJzeON1i18Y6ctEX6JW9y6uwI1uN/6XRi0TloXrIMr4YfWWrimQXd72e+w1djDVe7H6wZRcIIkVoOAkI/xtZFEvlIGQ5kLfLkPSRYlbk8zhIW/siBL3GtmE5l8kg/bp4MNDMUHHjAZMMxgcRjSQdvVzeL2zIIan1thymgqBFEjB/ksTTq4Iv7w3rfdvfnwnGN06u7dY0dGoDt2XHaY6nusn7sNWgVR7o2mqzCQMX70XYcVdLzr2at2Ht1899t2PRy/IHp0/TtOwMQNnvqY4Aenzw1PqlokBeV0tiqcHh/zW405Pvb8FBfJkF5ySX3KhYB3rR0G3Zhb75BFxpcJ4WOIgkCcbsE560GzWHNP48GtbcZO0CY6svmubG9HTyYV57MIWuxYXJ+v6OOLfYIYSDaHXpKVIJ9xuuzDw2fj9opZIndw8mSNhmhwzNTPfVw3Yez48TH8jB+Pe0JwbnvIE2c36OYvv2J62dTZ5hI0x1FaPvbGZnhSKbwwb2pjfKka23d1HjHJuL1uULVe8mEP+gH7jY9HIaDC3iP2lMLZt84CC6ST2XRj8ZZ4M0apwPgKIkEZQZQGBo9BQ7CRhMfgbnn3s9dvuf/wCF136KObP3bdNaO7x28Yx2/vVLlDF/8d7ksnrv/0vtGrTn3i1FWjVx5aM3HDyRsmIplqPsBljGHTnw/74q1rtHJk8MfkM+RvyDfJv5Lz4EGx0QOrqHP1Oj5typ7usAL6oY/8gHyb/D75XdJCvAi0eIBLJ3RAnHydfIXcQd6NkiuO5/naIy3gJX9F/oJcT65EPdKHdrSEKMwBPBT0z8gT5ApyGbmArOZeItx+QX5O/hfZSi5CqjdQBv4ROY13DyCXOrlMxpRCxhomFyIQpxEIOHd1AMlEfIzhW8xl2/yMpsI6ohcqzqVbvUxIhFDmSYI8l2zxMClmuphDkRxzUVANRZ2OB91MIYZTMeZIACAwTQIB2EogABta65fZjzCcgf3/r56xdfXbbH5eCYgzoATd0AVpSEIbtOJlP3eLAl9yaoH8kvyM/Dv5MfkX8k/ku+QfyTfI35G/JX9NvkS+QD5PPkX+nPwJYrrHyKPkQUR3f0DuIx8kv0d+h7yfvAcx343kneQacjXZjxhwF7mcXEreTi5BTLiBrCdrETevRIxYISXSTboQSSfRRmnFtvZjj8g2ogTcOnmfvMlhyUcLeOg6X4AOoRKfqGPba/+dvFz5n9X7TXl4y/28/z/v72/Wl9/yO/+nefoTexmlhWpj3Tw7Jv+32I3/tgXf2EFUVfg4SmOX4r6S1H+VOm4n+fyB5tnfMsmmTO3cXGP9rlN8Dd2lN/nQUurk0pNOLhnGf76U+tCy1OJrfejX3GVhZWNJYj5AlPlt67z4337MEk54O8pJzZ6TvJJcVT+4wsWQ03NxVFytPioKjK9b0QlCGC2pdc7m4o5EPmgPHwkEeAAj4aNxcw573YVpPCwuxVPobo/qHiDVSvfKwspMOppvzwdNT5vepshEW1zVgi/3yC1MyFai4H9zttbI0sWLUZCXrpaHAR679fsjVz3/vRcOsJHvv+c3pQ8/d4Q2Moefgwd7e7ZnRjL43d7Ta01jLstzWcydbVyiueEOzNFb8OxY4yI/8DmoFrbXD7G9+Aq1fIyghFIF2yzE3dZBBHJsRX+lPdoqSXJHmopSZwrbRRx7U9CnLDF5zsljewVJ/DXRn/muZMLnBdLb01XKl7KZRC6Za6xo61CIDrqrOfFbo9wmZ8EEXyUmWMtAzV5AxkDrMou2imzWmos4poPVMmYNeG3307dPCtM3f/a5z948LUze/vTuvdv3FWYL++esyD5d31eCx/bO7ccT+7bvXZwECpfvK5X26Wxq063PPv/srZuah7GSXWHhfY36X7U+1Tjxyk2P3yxc9/SRa/Zt/yq/1eI6h19AvHAT2Vhfv3W6jPAyyFem5rYINo3gkGlz1SoCVOL0ZJslqr1cEuNBlJM3XH/o4Pyuue1bLrlw48ToYXPlnFMMdYmJjB2aXivzaHbbp4bGqwcMewqh7WZuFKjYBSpZb+2NiYRSpmYvu1asNpa8st04Qe6Ia9zKXqPnrdf9S7dmj7bsKO5ocevgC8ccPqRK63ZThoAjETXA5Qnv6ZsNuTWfGcVrfC1ZgSqikgiZ4NLCe3rnTE3zhSOqAbIHbtNk8KuFiKaFdvbMhTTNCCVkA/yOWMQHrgsFIeT26VSSnGv+3oUA8lsXuiRB92kh4Fe8uiDI7jXt8EWPW8MbqjqyLG1eDvPLomvjc5RKrjMbXRJ1mcsuuDcs/HQEb+bTtdCysUIdcUkaUdMKvrpNqZPKShxE2hZwu5DP2ZiA6nqd5GJOYXHRJCpiD86TpUmz5IAKiiwr2IWKIm/m4RfyhNdLSK1S7Ovu6simEsgjLV7Da/h9+DhPzc3jSrnOXdK7fjQ40QyFpRN8Q6yYDiSbU8XEpRTcYWqGzofS4f2CGz5yFx00NTuL3x+7BWv4C6pyGtXFtY0j/Yg1jVeszzSW+2uDV13WdXC75bLr4JnVuH3c9diNjRUjbrSFpW1LC9ciHYuI1Mr1PqfqYMwetl1c6lywCXdKgCWDmvAgFJGIXq8oml1igK8+B/641w/Ctb+8Y4xtu+vc3OuwWh5n2879hA5aLhiB1dZn3pjn8QK7GO+ytj6SxC7wA4LtsQgAD5Ti0IzHPwg8/oFwRzqfrYslePwDFyUMJteODq7gc/w60hI+3sv/rYM9oM8D/TNZWRP52mj2iuqNVb5tWM7n0gg127EZMPjkSymJxnRuYu7AwJZ7Zo3e+txAZsLrURUNzVufLDpCLW2+ge5EpheKqfYywkYJbrj84ElN13S3oy0fclFxaO+mgShM3LW1untuXYGm2ld1hvrN3o4Ik7Z4SzdfdmVqoGcTFBLp940VIr0D9aHw3L4PHGwphMOCpwiO/PCArav+FOlTJD7EbRHSwVdN5X5aPmfRq6lvGkFPJQ26SFKJbBrNRa+9irloBhF8NkM8DCIzP/fuiyZs0Nyqw1pw8fhOHaKQgpx1ll6rh93/AV3Wd0J//ycOQ5GgQOk7Fq7UfCDcIobd9KhLA+U4XWFFPghrF57UdKq8k3ZTq7cDLoOMzj4E3IdrnT+BOiOHdKCgnjVImL+5oSDmHbVXlj7IlqIGfUGf3+QLUvgd3K2UjjOkFn+1CEFTkh3Ak8EBeMaKqIoAA3DoaevrBy3roBCh/9QvKKoVwWs8K8LzCy/Adjnk+vjCC+xO6xHY7LLu/7grJFun0dTd7Gr8r4M92J7TxCRZ7oExdJUtxRUuRfCnkpFWn9eeXuOvZmRR40uW2SsL0eIqfC1AYipQlK9RRu+ZEk2fFdVdinYUojzo4Z8dbtfQjSnY9mbtcT0cazGVP5N0Tcg8pYhMfPld7oFLkV3fqqD+D/hze2UAAAB4nGNgZGBgAOKbHcIX4/ltvjJwM78AijDcfHP9O4z+//i/Fcsj5kYgl4OBCSQKAL0zEJIAeJxjYGRgYA76n8XAwPLo/+P/j1keMQBFUEAqALFVB7Z4nFVQwQ3CMAwMSQYg7AEdgEkqMUcHQAzRZ99IbMCHL28mgAfmjwQIijknTlMeJ0e+850dR8bYozHuxl9HzK7GW9ApQqp2mTD0twApgnBpVryiX/YQfgrMpce9t3xxG2Rln4Vo+Omu6IXiadfCwxNvXzHHbFLfVjLByfxuvAPqil+DpuVP5DrNOPHD7vmd9/Jn4GDM5I7Z2f89USMe/Sg3wJtGurrcHW+rZFe9P3sAvol8+VuSv9YdGtVT6f8AoCZmXQAAAAAAAABEAKwBmgIkAuYDVgO0A/4EZgSOBMgFKgWuBnIG0AcQB1gHfgfkCBgITgimCQ4JWgnACmIKtAsOC1wMPAycDWYN3A4+DvgPyBAuEHYQxhFoEiwSahMIE+IUOBTAFbAWSBc+F+wYYhjCGWoZtBouGnIasBsSG14bzhwiHFodBh1iHYAdsB3mHhweRh6CH2ggWiDgIc4iAiKYIzYk7iY4Jnwm4iduKJApAilMKf4qPiq4Kywrfi4SLqovRDAYMKgw4DFoMcQyEDJjAAEAAABlAUAAFAAAAAAAAgBSAGIAcwAAARILcAAAAAB4nHWQy07CQBSG/5GLCokaTdw6KwMxlkviAhISEgxsdEMMW1NKaUtKh0wHEl7Dd/BhfAmfxZ92MAZim+l855szZ04HwDW+IZA/Txw5C5wxyvkEp+hZLtA/Wy6SXyyXUMWb5TL9u+UKHhBYruIGH6wgiueMFvi0LHAlLi2f4ELcWS7QP1ouknuWS7gVr5bL9J7lCiYitVzFvfgaqNVWR0FoZG1Ql+1mqyOnW6moosSNpbs2odKp7Mu5Sowfx8rx1HLPYz9Yx67eh/t54us0UolsOc29GvmJr13jz3bV003QNmYu51ot5dBmyJVWC98zTmjMqtto/D0PAyissIVGxKsKYSBRo61zbqOJFjqkKTMkM/OsCAlcxDQu1twRZisp4z7HnFFC6zMjJjvw+F0e+TEp4P6YVfTR6mE8Ie3OiDIv2ZfD7g6zRqQky3QzO/vtPcWGp7VpDXftutRZVxLDgxqS97FbW9B49E52K4a2iwbff/7vB+x4hFUAeJxtkleT3DYQhLfvGPd0ki3nnLPpJOdsS84554AwJFELAjyE492/93BVejOeUKhBzzfdsznYXD/bzf8fwgEOUaBEhRoNWmxxhAs4xkVcwk24GZdxC27Fbbgdd+BO3IW7cQ/uxX24Hw/gQTyEh/EIHsVjeBxP4Ek8hafxDJ5Fh+fwPF7Ai3gJV/AyXsGreA2v4w28ibfwNt7Bu3gP7+MDfIiruIaP8DE+waf4DJ/jC3yJr/A1vsG3+A7f4wf8iJ/wM37Br/gNv+MP/Im/8Df+wb8QkFDQIPSbIkcKVe+tplBYE1Np/WDcofJDnRaTEoUjEZJRljphU6WEU2SL0U/UaL+4TpvQ9EKR9H7XiMj1Ju6qPFsvdBuTnxeR1FjR2exDKkdisWK2OXLJ+reYyOXWUp86P5PbBjOM16+lcdKfVUsgp8Za+Ykr03FMQu38KYXe+qU5yRST8W7rd50ygSF1vYjgjBuKSRjLE7ldvaPzzrjTMgURxz31ClcPVsRIsToJymuq45j73tIhnVNhvdpVkVnVWEiytlxdig0/i7VdK4OhXolIrXFMNAQxlWr9VM6jd9QoYclpEco5GJcK0iYVkj2uTBLWqCpwKaVmGUWKYp5L7VN35YJxvb8xRnNqNHG76egk+0Td3pd6NirlQPXM+hxNYcU0t6vze8cOOAHFkmtQ9cpuTom9FuflLHiAdp/XWliz93uLJ+NybOiMf7mBakdp8WF3WZuofNAdr4LvltEkalYjOzpLFweTxixvYFa9sRx5ob2KR+v6dDJbZjve312eJAXSbXa8XixBReQt2IuxJ66Mk7HUcD7Si6CLNYcqjoasbqVJMq8u1YtxTB63y0hkmZSXRgq3qwbvB0uXZDaWtYaOUVbjtEhCcjTcpSeZ/XnFS8ftt9I4r7IVIW5ZJbBNgUQ7c0DMGFM1MVKeKh7QCtkksrTmutn8B/H9OFEAeJxj8N7BcCIoYiMjY1/kBsadHAwcDMkFGxlYnTYxMDJogRibuZgYOSAsPgYwi81pF9MBoDQnkM3utIvBAcJmZnDZqMLYERixwaEjYiNzistGNRBvF0cDAyOLQ0dySARISSQQbOZhYuTR2sH4v3UDS+9GJgYXAAx2I/QAAA==) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff2f6!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff2f6;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff2f6}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file diff --git a/public/dist/styles/default-rtl.css b/public/dist/styles/default-rtl.css index 79f72e289e..d931ecbbcc 100644 --- a/public/dist/styles/default-rtl.css +++ b/public/dist/styles/default-rtl.css @@ -1 +1 @@ -.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300;font-size:16px}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmctZmlsbGVkCGRhdGFiYXNlCGxpZmVidW95BmhlYWRlcgpiaW5vY3VsYXJzCmNoYXJ0LWFyZWEJcGludGVyZXN0Bm1lZGl1bQZnaXRsYWIIdGVsZWdyYW0AAAABAAH//wAPAAAAAAAAAAAAAAAAAAAAAAAYABgAGAAYA4H/OgOB/zqwACwgsABVWEVZICBLuAAOUUuwBlNaWLA0G7AoWWBmIIpVWLACJWG5CAAIAGNjI2IbISGwAFmwAEMjRLIAAQBDYEItsAEssCBgZi2wAiwgZCCwwFCwBCZasigBCkNFY0VSW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCxAQpDRWNFYWSwKFBYIbEBCkNFY0UgsDBQWCGwMFkbILDAUFggZiCKimEgsApQWGAbILAgUFghsApgGyCwNlBYIbA2YBtgWVlZG7ABK1lZI7AAUFhlWVktsAMsIEUgsAQlYWQgsAVDUFiwBSNCsAYjQhshIVmwAWAtsAQsIyEjISBksQViQiCwBiNCsQEKQ0VjsQEKQ7ABYEVjsAMqISCwBkMgiiCKsAErsTAFJbAEJlFYYFAbYVJZWCNZISCwQFNYsAErGyGwQFkjsABQWGVZLbAFLLAHQyuyAAIAQ2BCLbAGLLAHI0IjILAAI0JhsAJiZrABY7ABYLAFKi2wBywgIEUgsAtDY7gEAGIgsABQWLBAYFlmsAFjYESwAWAtsAgssgcLAENFQiohsgABAENgQi2wCSywAEMjRLIAAQBDYEItsAosICBFILABKyOwAEOwBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsAssICBFILABKyOwAEOwBCVgIEWKI2EgZLAkUFiwABuwQFkjsABQWGVZsAMlI2FERLABYC2wDCwgsAAjQrILCgNFWCEbIyFZKiEtsA0ssQICRbBkYUQtsA4ssAFgICCwDENKsABQWCCwDCNCWbANQ0qwAFJYILANI0JZLbAPLCCwEGJmsAFjILgEAGOKI2GwDkNgIIpgILAOI0IjLbAQLEtUWLEEZERZJLANZSN4LbARLEtRWEtTWLEEZERZGyFZJLATZSN4LbASLLEAD0NVWLEPD0OwAWFCsA8rWbAAQ7ACJUKxDAIlQrENAiVCsAEWIyCwAyVQWLEBAENgsAQlQoqKIIojYbAOKiEjsAFhIIojYbAOKiEbsQEAQ2CwAiVCsAIlYbAOKiFZsAxDR7ANQ0dgsAJiILAAUFiwQGBZZrABYyCwC0NjuAQAYiCwAFBYsEBgWWawAWNgsQAAEyNEsAFDsAA+sgEBAUNgQi2wEywAsQACRVRYsA8jQiBFsAsjQrAKI7ABYEIgYLABYbUQEAEADgBCQopgsRIGK7ByKxsiWS2wFCyxABMrLbAVLLEBEystsBYssQITKy2wFyyxAxMrLbAYLLEEEystsBkssQUTKy2wGiyxBhMrLbAbLLEHEystsBwssQgTKy2wHSyxCRMrLbAeLACwDSuxAAJFVFiwDyNCIEWwCyNCsAojsAFgQiBgsAFhtRAQAQAOAEJCimCxEgYrsHIrGyJZLbAfLLEAHistsCAssQEeKy2wISyxAh4rLbAiLLEDHistsCMssQQeKy2wJCyxBR4rLbAlLLEGHistsCYssQceKy2wJyyxCB4rLbAoLLEJHistsCksIDywAWAtsCosIGCwEGAgQyOwAWBDsAIlYbABYLApKiEtsCsssCorsCoqLbAsLCAgRyAgsAtDY7gEAGIgsABQWLBAYFlmsAFjYCNhOCMgilVYIEcgILALQ2O4BABiILAAUFiwQGBZZrABY2AjYTgbIVktsC0sALEAAkVUWLABFrAsKrABFTAbIlktsC4sALANK7EAAkVUWLABFrAsKrABFTAbIlktsC8sIDWwAWAtsDAsALABRWO4BABiILAAUFiwQGBZZrABY7ABK7ALQ2O4BABiILAAUFiwQGBZZrABY7ABK7AAFrQAAAAAAEQ+IzixLwEVKi2wMSwgPCBHILALQ2O4BABiILAAUFiwQGBZZrABY2CwAENhOC2wMiwuFzwtsDMsIDwgRyCwC0NjuAQAYiCwAFBYsEBgWWawAWNgsABDYbABQ2M4LbA0LLECABYlIC4gR7AAI0KwAiVJiopHI0cjYSBYYhshWbABI0KyMwEBFRQqLbA1LLAAFrAEJbAEJUcjRyNhsAlDK2WKLiMgIDyKOC2wNiywABawBCWwBCUgLkcjRyNhILAEI0KwCUMrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyCwCEMgiiNHI0cjYSNGYLAEQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwAmIgsABQWLBAYFlmsAFjYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsAJiILAAUFiwQGBZZrABY2AjILABKyOwBENgsAErsAUlYbAFJbACYiCwAFBYsEBgWWawAWOwBCZhILAEJWBkI7ADJWBkUFghGyMhWSMgILAEJiNGYThZLbA3LLAAFiAgILAFJiAuRyNHI2EjPDgtsDgssAAWILAII0IgICBGI0ewASsjYTgtsDkssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbkIAAgAY2MjIFhiGyFZY7gEAGIgsABQWLBAYFlmsAFjYCMuIyAgPIo4IyFZLbA6LLAAFiCwCEMgLkcjRyNhIGCwIGBmsAJiILAAUFiwQGBZZrABYyMgIDyKOC2wOywjIC5GsAIlRlJYIDxZLrErARQrLbA8LCMgLkawAiVGUFggPFkusSsBFCstsD0sIyAuRrACJUZSWCA8WSMgLkawAiVGUFggPFkusSsBFCstsD4ssDUrIyAuRrACJUZSWCA8WS6xKwEUKy2wPyywNiuKICA8sAQjQoo4IyAuRrACJUZSWCA8WS6xKwEUK7AEQy6wKystsEAssAAWsAQlsAQmIC5HI0cjYbAJQysjIDwgLiM4sSsBFCstsEEssQgEJUKwABawBCWwBCUgLkcjRyNhILAEI0KwCUMrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyBHsARDsAJiILAAUFiwQGBZZrABY2AgsAErIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbACYiCwAFBYsEBgWWawAWNhsAIlRmE4IyA8IzgbISAgRiNHsAErI2E4IVmxKwEUKy2wQiywNSsusSsBFCstsEMssDYrISMgIDywBCNCIzixKwEUK7AEQy6wKystsEQssAAVIEewACNCsgABARUUEy6wMSotsEUssAAVIEewACNCsgABARUUEy6wMSotsEYssQABFBOwMiotsEcssDQqLbBILLAAFkUjIC4gRoojYTixKwEUKy2wSSywCCNCsEgrLbBKLLIAAEErLbBLLLIAAUErLbBMLLIBAEErLbBNLLIBAUErLbBOLLIAAEIrLbBPLLIAAUIrLbBQLLIBAEIrLbBRLLIBAUIrLbBSLLIAAD4rLbBTLLIAAT4rLbBULLIBAD4rLbBVLLIBAT4rLbBWLLIAAEArLbBXLLIAAUArLbBYLLIBAEArLbBZLLIBAUArLbBaLLIAAEMrLbBbLLIAAUMrLbBcLLIBAEMrLbBdLLIBAUMrLbBeLLIAAD8rLbBfLLIAAT8rLbBgLLIBAD8rLbBhLLIBAT8rLbBiLLA3Ky6xKwEUKy2wYyywNyuwOystsGQssDcrsDwrLbBlLLAAFrA3K7A9Ky2wZiywOCsusSsBFCstsGcssDgrsDsrLbBoLLA4K7A8Ky2waSywOCuwPSstsGossDkrLrErARQrLbBrLLA5K7A7Ky2wbCywOSuwPCstsG0ssDkrsD0rLbBuLLA6Ky6xKwEUKy2wbyywOiuwOystsHAssDorsDwrLbBxLLA6K7A9Ky2wciyzCQQCA0VYIRsjIVlCK7AIZbADJFB4sAEVMC0AS7gAyFJYsQEBjlmwAbkIAAgAY3CxAAVCsgABACqxAAVCswoCAQgqsQAFQrMOAAEIKrEABkK6AsAAAQAJKrEAB0K6AEAAAQAJKrEDAESxJAGIUViwQIhYsQNkRLEmAYhRWLoIgAABBECIY1RYsQMARFlZWVmzDAIBDCq4Af+FsASNsQIARAAA) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff2f6!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff2f6;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff2f6}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file +.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300;font-size:16px}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff2f6!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff2f6;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff2f6}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file diff --git a/public/styles/scopes/console.less b/public/styles/scopes/console.less index 3313340e42..4a69d07eb4 100644 --- a/public/styles/scopes/console.less +++ b/public/styles/scopes/console.less @@ -315,6 +315,7 @@ color: #87a5b9; font-weight: 400; .func-border-start(5px, transparent); + font-size: 13px; i { .func-margin-end(8px); From e7064657232ff383c5d3bfb7b2acbd459fed66a0 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 17 Dec 2019 06:02:56 +0200 Subject: [PATCH 014/237] Removed old storage directories --- README.md | 5 +++-- storage/backups/db/.gitignore | 4 ---- storage/backups/files/.gitignore | 4 ---- storage/cache/.gitignore | 4 ---- storage/chronograf/.gitignore | 4 ---- storage/db/.gitignore | 4 ---- storage/files/.gitignore | 4 ---- storage/influxdb/.gitignore | 4 ---- 8 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 storage/backups/db/.gitignore delete mode 100644 storage/backups/files/.gitignore delete mode 100644 storage/cache/.gitignore delete mode 100644 storage/chronograf/.gitignore delete mode 100644 storage/db/.gitignore delete mode 100644 storage/files/.gitignore delete mode 100644 storage/influxdb/.gitignore diff --git a/README.md b/README.md index 6b13c6a357..bdd7e0e966 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ Appwrite API services aim to make developer's life a lot easier by hiding the co Using Appwrite, you can easily manage user authentication with multiple sign-in methods, a database for storing and querying user and team data, storage and file management, image manipulation and cropping, schedule cron tasks and many other features to help you get more results in faster times and with a lot less code. +Appwrite can also integrate really well with your backend. Appwrite can word behind your own proxy facing your internal network, or alongside your own custom backend. You can use Appwrite server SDK to integrate your backend with Appwrite's APIs and webhooks. + [https://appwrite.io](https://appwrite.io) ![Appwrite](public/images/github.png) @@ -72,8 +74,7 @@ Getting started with Appwrite is as easy as creating a new project, choosing you ### Services -* [**Auth**](https://appwrite.io/docs/auth) - Manage user authentication using multiple sign-in methods and account recovery. -* [**Account**](https://appwrite.io/docs/account) - Manage current user account. Track and manage the user sessions, devices, and security audit log. +* [**Account**](https://appwrite.io/docs/account) - Manage current user authentication and account. Track and manage the user sessions, devices, sigin methods, and security audit log. * [**Users**](https://appwrite.io/docs/users) - Manage and list all project users when in admin mode. * [**Teams**](https://appwrite.io/docs/teams) - Manage and group users in teams. Manage memberships, invites and user roles within a team. * [**Database**](https://appwrite.io/docs/database) - Manage database collections and documents. Read, create, update and delete documents and filter lists of documents collections using an advanced filter with graph-like capabilities. diff --git a/storage/backups/db/.gitignore b/storage/backups/db/.gitignore deleted file mode 100644 index 86d0cb2726..0000000000 --- a/storage/backups/db/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/storage/backups/files/.gitignore b/storage/backups/files/.gitignore deleted file mode 100644 index 86d0cb2726..0000000000 --- a/storage/backups/files/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/storage/cache/.gitignore b/storage/cache/.gitignore deleted file mode 100644 index 86d0cb2726..0000000000 --- a/storage/cache/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/storage/chronograf/.gitignore b/storage/chronograf/.gitignore deleted file mode 100644 index 86d0cb2726..0000000000 --- a/storage/chronograf/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/storage/db/.gitignore b/storage/db/.gitignore deleted file mode 100644 index 86d0cb2726..0000000000 --- a/storage/db/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/storage/files/.gitignore b/storage/files/.gitignore deleted file mode 100644 index 86d0cb2726..0000000000 --- a/storage/files/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file diff --git a/storage/influxdb/.gitignore b/storage/influxdb/.gitignore deleted file mode 100644 index 86d0cb2726..0000000000 --- a/storage/influxdb/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file From 066f08fcf518db662b970721de95fbf716c6e5e5 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 17 Dec 2019 06:16:50 +0200 Subject: [PATCH 015/237] Better locction for missing project error --- app/app.php | 5 +++++ app/controllers/shared/api.php | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/app.php b/app/app.php index f48a33fb0a..1197cb9be6 100644 --- a/app/app.php +++ b/app/app.php @@ -55,6 +55,7 @@ $clients = array_unique(array_merge($clientsConsole, array_map(function ($node) })))); $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $roles, $webhook, $audit, $usage, $domain, $clients) { + $route = $utopia->match($request); $referrer = $request->getServer('HTTP_REFERER', ''); @@ -158,6 +159,10 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $ // TDOO Check if user is god if (!in_array($scope, $scopes)) { + if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { // Check if permission is denied because project is missing + throw new Exception('Project not found', 404); + } + throw new Exception($user->getAttribute('email', 'Guest').' (role: '.strtolower($roles[$role]['label']).') missing scope ('.$scope.')', 401); } diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 8fc2fcc7ef..cfe9f89415 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -8,11 +8,6 @@ use Database\Database; global $utopia, $request, $response, $register, $user, $project; $utopia->init(function () use ($utopia, $request, $response, $register, $user, $project) { - - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { - throw new Exception('Project not found', 404); - } - $route = $utopia->match($request); /* From c5a6dabbb64c2953dd2afe35f853e5d5580e4739 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 17 Dec 2019 06:18:49 +0200 Subject: [PATCH 016/237] Updated changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 75c1cea240..e21424a8f0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ * Fixed bug where user status was saved as a string instead of an integer * Fixed gravatar icons not showing up correctly on the console +* Fixed code location of project not found error # Version 0.4.0 (PRE-RELEASE) From 77a57e381f8abee80b60d03e57f0923bbd901052 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 18 Dec 2019 12:24:54 +0200 Subject: [PATCH 017/237] Fixed broken paths --- app/config/services.php | 29 ++ app/controllers/api/account.php | 4 +- app/controllers/api/projects.php | 803 +++++++++++++++++++++++++++++ app/controllers/api/users.php | 4 +- docker-compose.yml | 2 + public/dist/styles/default-ltr.css | 2 +- public/dist/styles/default-rtl.css | 2 +- public/styles/comps/footer.less | 2 + 8 files changed, 842 insertions(+), 6 deletions(-) diff --git a/app/config/services.php b/app/config/services.php index b3bbd14799..99790bd45f 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -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, + ], ]; diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index b7b06638ab..1d84fab4fa 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -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) { diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 8c1c003b62..242264b90b 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -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') @@ -383,6 +399,793 @@ $utopia->delete('/v1/projects/:projectId') // Delete all storage files // Delete all storage cache + $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(); } ); \ No newline at end of file diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index ec9452b3ac..ad4ee60bb5 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -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) { diff --git a/docker-compose.yml b/docker-compose.yml index 041b21db13..e247b3594a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -54,6 +54,8 @@ services: - appwrite volumes: - appwrite-db:/var/lib/mysql:rw + ports: + - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=rootsecretpassword - MYSQL_DATABASE=appwrite diff --git a/public/dist/styles/default-ltr.css b/public/dist/styles/default-ltr.css index 1c91c333d4..42a2b87aa4 100644 --- a/public/dist/styles/default-ltr.css +++ b/public/dist/styles/default-ltr.css @@ -1 +1 @@ -.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300;font-size:16px}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,AAEAAAAPAIAAAwBwR1NVQiCLJXoAAAD8AAAAVE9TLzI+UFQCAAABUAAAAFZjbWFw+jV1MgAAAagAAAeyY3Z0IAcz/qQAAHfoAAAAIGZwZ22KkZBZAAB4CAAAC3BnYXNwAAAAEAAAd+AAAAAIZ2x5ZlcKc0AAAAlcAABkxmhlYWQXvfOOAABuJAAAADZoaGVhCBoElQAAblwAAAAkaG10eGDE/5wAAG6AAAABlGxvY2GPgKeTAABwFAAAAMxtYXhwAlENFAAAcOAAAAAgbmFtZcydHyEAAHEAAAACzXBvc3RrTorsAABz0AAABBBwcmVw5UErvAAAg3gAAACGAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAEDfgGQAAUAAAJ6ArwAAACMAnoCvAAAAeAAMQECAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAQOgA8sYDUv9qAFoDgQDGAAAAAQAAAAAAAAAAAAUAAAADAAAALAAAAAQAAALyAAEAAAAAAewAAwABAAAALAADAAoAAALyAAQBwAAAADoAIAAEABroR/CO8JvwsPDF8MvwzfDc8OHxGPEc8SHxMvFx8Xrxk/Gc8aDxrfHA8c3x3PHl8f7yMfI68pbyxv//AADoAPCO8JvwsPDF8MrwzfDc8OHxGPEc8SHxMvFx8Xrxk/Gc8aDxrfHA8c3x3PHl8f7yMfI68pbyxv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQA6AMgAyADIAMgAyADKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAEwAAAAAAAAABkAADoAAAA6AAAAAABAADoAQAA6AEAAAACAADoAgAA6AIAAAADAADoAwAA6AMAAAAEAADoBAAA6AQAAAAFAADoBQAA6AUAAAAGAADoBgAA6AYAAAAHAADoBwAA6AcAAAAIAADoCAAA6AgAAAAJAADoCQAA6AkAAAAKAADoCgAA6AoAAAALAADoCwAA6AsAAAAMAADoDAAA6AwAAAANAADoDQAA6A0AAAAOAADoDgAA6A4AAAAPAADoDwAA6A8AAAAQAADoEAAA6BAAAAARAADoEQAA6BEAAAASAADoEgAA6BIAAAATAADoEwAA6BMAAAAUAADoFAAA6BQAAAAVAADoFQAA6BUAAAAWAADoFgAA6BYAAAAXAADoFwAA6BcAAAAYAADoGAAA6BgAAAAZAADoGQAA6BkAAAAaAADoGgAA6BoAAAAbAADoGwAA6BsAAAAcAADoHAAA6BwAAAAdAADoHQAA6B0AAAAeAADoHgAA6B4AAAAfAADoHwAA6B8AAAAgAADoIAAA6CAAAAAhAADoIQAA6CEAAAAiAADoIgAA6CIAAAAjAADoIwAA6CMAAAAkAADoJAAA6CQAAAAlAADoJQAA6CUAAAAmAADoJgAA6CYAAAAnAADoJwAA6CcAAAAoAADoKAAA6CgAAAApAADoKQAA6CkAAAAqAADoKgAA6CoAAAArAADoKwAA6CsAAAAsAADoLAAA6CwAAAAtAADoLQAA6C0AAAAuAADoLgAA6C4AAAAvAADoLwAA6C8AAAAwAADoMAAA6DAAAAAxAADoMQAA6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff2f6!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff2f6;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff2f6}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file +.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300;font-size:16px}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,AAEAAAAPAIAAAwBwR1NVQiCLJXoAAAD8AAAAVE9TLzI+UFQCAAABUAAAAFZjbWFw+jV1MgAAAagAAAeyY3Z0IAcz/qQAAHfoAAAAIGZwZ22KkZBZAAB4CAAAC3BnYXNwAAAAEAAAd+AAAAAIZ2x5ZlcKc0AAAAlcAABkxmhlYWQXvfOOAABuJAAAADZoaGVhCBoElQAAblwAAAAkaG10eGDE/5wAAG6AAAABlGxvY2GPgKeTAABwFAAAAMxtYXhwAlENFAAAcOAAAAAgbmFtZcydHyEAAHEAAAACzXBvc3RrTorsAABz0AAABBBwcmVw5UErvAAAg3gAAACGAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAEDfgGQAAUAAAJ6ArwAAACMAnoCvAAAAeAAMQECAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAQOgA8sYDUv9qAFoDgQDGAAAAAQAAAAAAAAAAAAUAAAADAAAALAAAAAQAAALyAAEAAAAAAewAAwABAAAALAADAAoAAALyAAQBwAAAADoAIAAEABroR/CO8JvwsPDF8MvwzfDc8OHxGPEc8SHxMvFx8Xrxk/Gc8aDxrfHA8c3x3PHl8f7yMfI68pbyxv//AADoAPCO8JvwsPDF8MrwzfDc8OHxGPEc8SHxMvFx8Xrxk/Gc8aDxrfHA8c3x3PHl8f7yMfI68pbyxv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQA6AMgAyADIAMgAyADKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAMoAygDKAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAEwAAAAAAAAABkAADoAAAA6AAAAAABAADoAQAA6AEAAAACAADoAgAA6AIAAAADAADoAwAA6AMAAAAEAADoBAAA6AQAAAAFAADoBQAA6AUAAAAGAADoBgAA6AYAAAAHAADoBwAA6AcAAAAIAADoCAAA6AgAAAAJAADoCQAA6AkAAAAKAADoCgAA6AoAAAALAADoCwAA6AsAAAAMAADoDAAA6AwAAAANAADoDQAA6A0AAAAOAADoDgAA6A4AAAAPAADoDwAA6A8AAAAQAADoEAAA6BAAAAARAADoEQAA6BEAAAASAADoEgAA6BIAAAATAADoEwAA6BMAAAAUAADoFAAA6BQAAAAVAADoFQAA6BUAAAAWAADoFgAA6BYAAAAXAADoFwAA6BcAAAAYAADoGAAA6BgAAAAZAADoGQAA6BkAAAAaAADoGgAA6BoAAAAbAADoGwAA6BsAAAAcAADoHAAA6BwAAAAdAADoHQAA6B0AAAAeAADoHgAA6B4AAAAfAADoHwAA6B8AAAAgAADoIAAA6CAAAAAhAADoIQAA6CEAAAAiAADoIgAA6CIAAAAjAADoIwAA6CMAAAAkAADoJAAA6CQAAAAlAADoJQAA6CUAAAAmAADoJgAA6CYAAAAnAADoJwAA6CcAAAAoAADoKAAA6CgAAAApAADoKQAA6CkAAAAqAADoKgAA6CoAAAArAADoKwAA6CsAAAAsAADoLAAA6CwAAAAtAADoLQAA6C0AAAAuAADoLgAA6C4AAAAvAADoLwAA6C8AAAAwAADoMAAA6DAAAAAxAADoMQAA6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff2f6!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff2f6;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff2f6}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file diff --git a/public/dist/styles/default-rtl.css b/public/dist/styles/default-rtl.css index d931ecbbcc..48b225a55b 100644 --- a/public/dist/styles/default-rtl.css +++ b/public/dist/styles/default-rtl.css @@ -1 +1 @@ -.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300;font-size:16px}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff2f6!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff2f6;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff2f6}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file +.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300;font-size:16px}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,d09GRgABAAAAAFUMAA8AAAAAhAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABWAAAADsAAABUIIslek9TLzIAAAGUAAAAQwAAAFY+UFQCY21hcAAAAdgAAAK1AAAHsvo1dTJjdnQgAAAEkAAAABMAAAAgBzP+pGZwZ20AAASkAAAFkAAAC3CKkZBZZ2FzcAAACjQAAAAIAAAACAAAABBnbHlmAAAKPAAARAUAAGTGVwpzQGhlYWQAAE5EAAAAMwAAADYXvfOOaGhlYQAATngAAAAgAAAAJAgaBJVobXR4AABOmAAAAMIAAAGUYMT/nGxvY2EAAE9cAAAAzAAAAMyPgKeTbWF4cAAAUCgAAAAgAAAAIAJRDRRuYW1lAABQSAAAAXcAAALNzJ0fIXBvc3QAAFHAAAACzwAABBBrTorscHJlcAAAVJAAAAB6AAAAhuVBK7x4nGNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgYYAAkDwymzEnMz2RgQPGA8qxgGkOIGaDiAIAJjsFSAB4nGNgZK5jnMDAysDAVMW0h4GBoQdCMz5gMGRkAooysDIzYAUBaa4pDA4vGD4dYw76n8UQxdzIcAwozAiSAwD7LwzaAHic3dTLblVlAMXx/4FjVUBAUai1AuWiiIK0eK1X7oKAggqoKCp9AaY8BJMmndBBX4CER+ikjSnpG5xJByRr4GB/+wGoa/dbYV6GnJNf07NzdrL7da0FvABstA+sDxtaev6N3n++2lu7vpFNa9f7vXl/nmSvvzeic8295n7zsFloHjXLzaBZKcNltIyViXKn3C3TZbbMlQdlviyXQXlcnrTj7WQ70y6uroJ4eu/Seu99xlfPz/3v0/fSOt7dvRt8Bn2f1BAv8hIv+zw2s4VX2Mo2tvMqr7GD13mDneximDcZ4S1GeZvd7PFpjbGP/RzgIO/wLod4j8O873M9wlE+5BjjTHCcj/iYT/iUz/jcz/oFX/IVX/MN33KCk5ziNGc4yzm+4zwX+J6LXOIyP/AjV7jKT/zML1zjOjf4ld/4nZv8wZ/c4i/+5h9uM+U/ZOiZz+/5eW3pfvTn82mqS2PVpV3h/ziKrh2KriGKrjkKJwOFM4LCaUHh3KDoGqVwllB0T6dwvlA4aSicORROHwrnEIUTicLZROGUonBeUTi5KJxhFE4zCucahROOwllH4dSjcP5RuAko3AkUbgcK9wSFG4PC3UHhFqFwn1C4WSjcMRRuGwr3DoUbiMJdRNGtoML9ROGmonBnUbi9KNxjFG40CncbhVuOwn1H4eaj8Aag8Bqg8C6g8EKg8Fag8Gqg8H6g8JKg8Kag8Lqg8M6g8OKg8Pag8Aqh8B6h8DKh8Eah8Fp56yvvFs39ygtG87DyltEsVF41mqXK+0bzqPLS0SxX3jyaQeX1o1mpvIOU4cqLSBmtvI2UscorSZmovJeUO5WXk3K38oZSpiuvKWW28q5S5iovLOVB5a2lzFdeXcpy5f2lDCovMeVx5U2mPKm8zrTjlXeadrLyYtPOVN5u2sWKqf8BRIOIMAAAAHicY2BAAxIQyNz43wqEARMiA9sAeJytVml300YUHXlJnIQsJQstamHExGmwRiZswYAJQbJjIF2crZWgixQ76b7xid/gX/Nk2nPoN35a7xsvJJC053Cak6N3583VzNtlElqS2AvrkZSbL8XU1iaN7DwJ6YZNy1F8KDt7IWWKyd8FURCtltq3HYdERCJQta6wRBD7HlmaZHzoUUbLtqRXTcotPekuW+NBvVXffho6yrE7oaRmM3RoPbIlVRhVokimPVLSpmWo+itJK7y/wsxXzVDCiE4iabwZxtBI3htntMpoNbbjKIpsstwoUiSa4UEUeZTVEufkigkMygfNkPLKpxHlw/yIrNijnFawS7bT/L4vead3OT+xX29RtuRAH8iO7ODsdCVfhFtbYdy0k+0oVBF213dCbNnsVP9mj/KaRgO3KzK90IxgqXyFECs/ocz+IVktnE/5kkejWrKRE0HrZU7sSz6B1uOIKXHNGFnQ3dEJEdT9kjMM9pg+Hvzx3imWCxMCeBzLekclnAgTKWFzNEnaMHJgJWWLKqn1rpg45XVaxFvCfu3a0ZfOaONQd2I8Ww8dWzlRyfFoUqeZTJ3aSc2jKQ2ilHQmeMyvAyg/oklebWM1iZVH0zhmxoREIgIt3EtTQSw7saQpBM2jGb25G6a5di1apMkD9dyj9/TmVri501PaDvSzRn9Wp2I62AvT6WnkL/Fp2uUiRen66Rl+TOJB1gIykS02w5SDB2/9DtLL15YchdcG2O7t8yuofdZE8KQB+xvQHk/VKQlMhZhViFZAYq1rWZbJ1awWqcjUd0OaVr6s0wSKchwXx76Mcf1fMzOWmBK+34nTsyMuPXPtSwjTHHybdT2a16nFcgFxZnlOp1mW7+s0x/IDneZZntfpCEtbp6MsP9RpgeVHOh1jeUELmnTfwZCLMOQCDpAwhKUDQ1hegiEsFQxhuQhDWBZhCMslGMLyYxjCchmGsLysZdXUU0nj2plYBmxCYGKOHrnMReVqKrlUQrtoVGpDnhJulVQUz6p/ZaBePPKGObAWSJfIml8xzpWPRuX41hUtbxo7V8Cx6m8fjvY58VLWi4U/Bf/V1lQlvWLNw5Or8BuGnmwnqjapeHRNl89VPbr+X1RUWAv0G0iFWCjKsmxwZyKEjzqdhmqglUPMbMw8tOt1y5qfw/03MUIWUP34NxQaC9yDTllJWe3grNXX27LcO4NyOBMsSTE38/pW+CIjs9J+kVnKno98HnAFjEpl2GoDrRW82ScxD5neJM8EcVtRNkja2M4EiQ0c84B5850EJmHqqg3kTuGGDfgFYW7BeSdconqjLIfuRezzKKT8W6fiRPaoaIzAs9kbYa/vQspvcQwkNPmlfgxUFaGpGDUV0DRSbqgGX8bZum1Cxg70Iyp2w7Ks4sPHFveVkm0ZhHykiNWjo5/WXqJOqtx+ZhSX752+BcEgNTF/e990cZDKu1rJMkdtA1O3GpVT15pD41WH6uZR9b3j7BM5a5puuiceel/TqtvBxVwssPZtDtJSJhfU9WGFDaLLxaVQ6mU0Se+4BxgWGNDvUIqN/6v62HyeK1WF0XEk307Ut9HnYAz8D9h/R/UD0Pdj6HINLs/3mhOfbvThbJmuohfrp+g3MGutuVm6BtzQdAPiIUetjrjKDXynBnF6pLkc6SHgY90V4gHAJoDF4BPdtYzmUwCj+Yw5PsDnzGHQZA6DLeYw2GbOGsAOcxjsMofBHnMYfMGcdYAvmcMgZA6DiDkMnjAnAHjKHAZfMYfB18xh8A1z7gN8yxwGMXMYJMxhsK/p1jDMLV7QXaC2QVWgA1NPWNzD4lBTZcj+jheG/b1BzP7BIKb+qOn2kPoTLwz1Z4OY+otBTP1V050h9TdeGOrvBjH1D4OY+ky/GMtlBr+MfJcKB5RdbD7n74n3D9vFQLkAAQAB//8AD3ictb0LYBzVdTd+z73z2tnd2dnd2dnVarXa90qr1UrapyzJ8lqWLSHLxgjh2I6QhbEdY/kFGPOIIcQQAgnFqUscCimxUyAUQgqGppSSRxOSUkJTQlOTNO0/z6YkTdJ+KemXEGv8nTu7EoIkbdr/92l3Zu6duXdm9t7z+J1zz70ilJDzT9AXmIsESJSk6wkigniQAQhwkAhUOEgooQcJIbv9Qa83WJTEcFfakJLxRKZSHmZBs1grRhkzpEQBqlGgL6zrs1J969RQbrj7ghcmciOZiHL86FM3CMc+fuvaoS1bhnqnNw91wPh4Znh6M3x2y003PX4zPUoIPW+d/zL7If0J0fA9dq5/3L1pSz1JmCCwy0UgFCiB/QTgAL4UFaaJINC3ESrQ9a34ykxgB//TQlvrXiBt4aDh1R0S0cAtiUYXFE2ZaYA/Jcsy1VI6GK8NwyAU28EsxYsmeyam0xw1Yuf+vizkqB5je9VzZzQhZjxQTkRjVZg2UvBaKGQNhcJFeC4UOtBxqxFJRFMhbC2inD9//ufsB8xJPKSd9JBV5EKynRwk7yJH6ldff92VF4yvlhTHFZfNdcZjkiBu3XLRppaQV1coW9Hf51BAIiCMecChgSI6lDk3iC4QmCjMOoGpQIHRWRmAEJjGA5DNEhAgEze+85qr98/v2nnp2y+Z3jCZyQQzQfwzdLGtqxYwpGwykalVytVaqWhml+WDzbzczGMjmMCvYy9nefl4I98Fb9Rffj0Yb9Zv5kvNfHJZ/eOqMi+74D/dsy2qsuCTVXBJ9Cey69xDv/ka/Ce5I4uV8MRLyx7xZfuMNK+oqjW5rAy9kZ9qpK0Nv77C37xRhHCe+QXbSp8jIVInm+obXIA9MhbHLlhHmCzJTNpPqAQS5dQoSiDOEyIKIhH2E5lIVJbmCGbEaSKKwhZMCJP5dC7rN5OGIka6wJBBSmRWQrLZeiXcmUEwa95mF2Qzq2AYsNeqWW85g71WzlR7YPGkST/otL7ijBqvewwwtdeNqBN6nM/NrjmDvwn4qyrKmXQVypmnJJXSxTNrZmFWc1ovqYbntKmdxbqnNZM68MSfWNetmVUVp0NyywpUU3A71haoIjTPzCK923KEbUN6V8hesrY+smvr5GqBCIMqBVLuaNUFBmyMt8JBCfA8ihRAdgCGYoZRhmKG7p55+8UXXTDelUvE/D5ZNLvwDRMamMVqGmnJA5JsBk1D1iCb6MEMfnhjVLKZrCwlcJ8pI//WMj1QAN5sq6Baa54sIU9Xa/jhhI3sHaxVi8HmzWQ8gXJrcOq6Kbr58GaIKPIe1envkETPJrcsb2gJO2RBP6q49NbghZIurTMFUelQPcpu/OWquEfRgulGWWVDKOxQmPcoNrMnErxQ9MjjhiA4GoVVmB2cnj4yPX0dv65HA61FSZMCm0AcciuTEV2V3+FwDYlSPSpqkqvoibR6wCXbZVvCsW7ZJRublhV1DorimkizaFhHquQNSs7/b3Y7/TzKmw31iUI+F6OiKLWAIJo+ygQn9rQwRiRROmh3BBGYsNj6gELeFicoPskWfq/JlGkmvYkOWWztwuYOGBrLJrJmqVjD9m0cVmJTFqBci0Iwwwm1GKzWJLnKbk9Xcpuve/iyD93oD920Y3DG5/eEQqumMvl0vmX0s4fEvRMXVlZWA4NleqCaDV7wgdt21ulFdAOsqzLJvWOEBmjLxrncxTvFgLF+D6xwxeopCX8fbufvZ8dZG2HIR06ikxbUFRP1Mf7mDMgsnqciSkbOXRLKStWlMEmWpWk7IclbnA5kPnnS5422RVrNgLfF1+L1efmf7uacF6/El7Zy0Uiki6YGBVoN8gw7fu4WdqP1xMLLtAAX8vS5Ww4dgpCZoNHeGE09e+gQfeyQ9cQh648PWkf7r7wykU9BohCr9V/Z6Jt/pV+lt5EUidZbEy26LGCrjzHg+pVL8t1GxDAEMYTqFWkdSVzmu0x5FWT5roo0XOM7Ey8HTfpVz6Se1x94AHeTOj/qb+Q9ngce8BwyeeLBBz2/WtBT4AWacuwE/QK2ZB8p1LsKmXQo4NHcCjAXCjM6JiB/Mk4YcJDyV8x1JBNxryGKwS7wcn1RSQa4lPI6UDrJXH9kHSAhC2aqNfuNm8qkDd/YYD4UK8e5YIHV+DmaEGUqi9ZN1k2yW0wKVITf9fX6b0cpq6g3SNBh/QyLnj2LPeABxfo5pDpFfJ0R69NYtFPSRNjo8Vy5j4vl7+4W9Ab9oyAagh8jhgjWDf7aMGa/PMcvFYNymdJs3ExDS9FB9XVnxPm6E5/ymmbCX2mYxm/ENBt99gQNsilikFK9F/MS3g/55RAnRVTRcyJyFIUpkcvQzQLKUTqR5NTkj9tcg20jtUFJTnrxU+FivFSkwbf1Jh4w73r0rrsOXzbF1v9eR8feB60t8PCDN+y5qvlMthPlaIW01cOVfDLsVaQ3/ZDOzCAVA10otTygQQ8sKW650fJIMAXgusBufq6r25ByuNxDIcoGw5qW9Ay0fDDXNtaWh7vDA1pK01rvvjuse1Ke/ta7c9GxttwHw/160qO33A2KNhBeiXUuebQtB/nIo5fg2ZVYafPm33SBCPZvOM0KqAu8pBN15Lr6mgrSswOlPKFjxCE5DipchB8kMpNRDiFIm+adixiOkTmO27Zw3Da5cihZSiaK6RUhn4oYJl3OaDSKonzxuAxjBEtRDt7s38tQMzRbJVvBXYN7TPqCETVoKBz6HSPmo2YktC5mnvtSMAox8yeuavJ4our+iRn7pCN03PAcR9o7HvR7X1ej6uu+NtSEvphPCLsWE3c8acZiJu6gvaOjPQpTZlPb5rGK+rqXk6KI7TDAHmHvJh3IXyNkPZkmN9dvbFWpgH2jYq+6VdSJAqBGRMQgqSCp88Thlt0Oeb8HVOJ2qO45FHWKS1bmuIx3ii7nHOPUhu1DXeMaiCKX1sRNLtgwObom13nRpsnpDdPjY2vWj66vrxqolYuF7s6+XF8oWeowvGJLF5gBAxu8UvbVKnbjoM4sFaOAYDAgB8wgbytOKBK2pZ4RJN30Y4s2sOJKKONFOVs0fQhQfFV/sVoAjZrsbRdbP0JG/tG/naGlQIxGgi8FojThL8OHr5JaPaiGtLBoHf7Q2bPWy2fPfmlPIBYLfBh3uRiU3/1J+oz1rPDULfP30pN/f5LeS1uuuftz1k8omJ99ClQ/sFIsh13UkYASMO8+R9gTzXvC4sJ7zkLhLH3Z+vLLcH8U7xQ1P2xGo+YfPG1ZTz8N9OmFz9171r6lLee+xl6l30MbJ8VpMYnoJdVCEVALdCwBsBZ5C/ukoTgQZM9JwFCjTOGB8eZlZJKQeCxo4g0CRroio/xLVxapr+LlsoRLqaQXEpJcHhZLFRHoT3ZGjQWfEY2YEItVXeox2v/QPdNUjwxtum0KJq2nhvqnnjWiSJIZpMWi5rKGYWbqTiUyPTEzUvjw69Y5sigPXkX7LELi9ajXlmmI2VAWMC6RgQQDbieJQERAk0ZMZJH5ma2LozSI9hl2HaJJlG1O6wGPmkuE77oxMT5c8Bv5+rrkjXfdbD2oXqjCJo9arW5Kv/N9EMolAkaqIwx3/uxm6wnVfv4vmA/lUZJ01jMNyIBPPyTaTcS5FpsIlQO2UbKURnblFqJtHCSXBNNyIMvVQTDAmdQXM1+NmfPIQq/aPPhqNDiPCZ75U372ByaeDfygeZaz26sxAufPo4wfhL9CGe+ta0tCMVDk0j1t2yRc+jUYftDwWC6PQV02G6uPooRHNMwZ1El4t/Lftg1xfMNGq9XLHYiVFCQY1H2LtMBBBZpbc2+FR5kKfkq2PbzM9OGmDnuLacSWiyme32ro5/7VFhfM68FX+s25nWN20t6DPs7f32PvQRvTTH4B06RJJ5+l97BR1FWo++DNui8Y5K3joKat/bKo/Rrq2TToXdYr0Kmql6IWtHY4nXA/ttSlKn3E+pr1ip1U4SN4hPudzkvVaPM5hxef43jzcyI++zlNDVtzQAO5BPmD9uLtI85L8REd1tfsm+FNVbjCuqzxdOiEjkYBXpA0bYqGneVG6kMNbCLHcurnZgNh+7GHgIhofnAvwRRhjBtTTJjsLHuThm7TYamcybI4WvmBUrCU9jb7yVuu+dFUwq4I+pFIHqdwxLrmCNDHK0/Cxc32194jRjX4ihYV36PBAFpzELD+BU26+bdb/273CbgTCShrBvg81osJ0qSnI+yUbQMZpMDfOINv3JH1MSpwwkFhz10Vy/0qthEEuyPJ7pBPRPG8qNrSi22Iaj7dMHoynKu51eKBQLBqy+mzTYUGu61bAgPmYCAAR81p+H1367EL95w4sSe2rsXh+MN9NLc+7lGXlNh/WLcYxkpj0ISjtel/NNPrZ+HESx+g2GQ+efbGIdrSbaiLNHUFys3PkwyJ1Fta7b52Axld6u9UImlDEUNDYzVr22RI5Zkq17iIQOgqbouVhylXMOzV275/ezZ34PdaU6qGDUKZS3AbsqHLni07YdOtz+68/fu3wexlD8wJl2UUAVwqoInJPKJmKpGIP1c8MX3BrXP9cw+gQiTn9zIdu5xbAR7iJ0HSihyMkt3vcTNs6rFoa7glaAZ8XgdZi/QiEA4yRGTuWaQdBlP4S9hmiaPbCUKcqkPBW8kI3LhkD3iDLO4tedPxQHwViHK6JsqAG6v5ZT9ukwx+duHCT+B26zpQ4A7FujMIR0PWi3mY6n5k7ffXBadXT5+E02A9ARuty75x8d2XZC7526n5KShf8OIF8PtF6zNFeFaz3qkt0szzrJv+DH9DDDHfqbqq4Wt5kW7o2PrHzU1b6kUuj4DucoKM7EZlwkURQ2h+GRFUECVBnCOSokjTRJKULUSRlMnWeolXQsG1/79Ra2s9noi3hIDku+KVRKUtEoq1xHSP2ymLAiNBCLq41ywhBUpllN9cqCWygVJlGGFmAVhCMtBUL2dY07SWlqxyNLzhgxunjrVp7kTK6TjW25ebKLR3dw8XCu0Hts9U+/urM9v/cXamWqtVZ2bp3ukLByLRZDvcUHKtrfVOdFrzhVWFwnAPjfVXGgV5jdl/3D5T6bflxPkF1JHbke8CJEF6690yInGUSsvcDBTplTJGpxE2sS0cw08GgkHD4CwHZWS0hAfNLNxJBkrFIkrHINJ0okCHAUmX/rVaQtH0vZtwV1LVF1TuUVHvvOqLrz5/QLrh2deeuQme1tWi0/ndm5zOotqOJVQssP6a5w4ffu6HfEfY+e+ePym0swxx2Sikij2EdIkkyX1BDM1WBB0o8Og0HihXMZRMYnvFW8M+rzugBQJF7hJJm1yTZDNcfAcZb+6EFAV/lfeAFGy8e5V9s77nxoXjN5UqdagMn131R4lCYbSX5q8Xy5NVkMZFnU08M/9nl87MU5ifXziOF3tHC3CL258p0/6U13vG4Thjt6uFBPoBejOi+CRJ1eNv8tlQNo0ilwNRRieDK4Ilbrv6MzVuV/HOb9pZYjXgXcJJQRHfLxoTaIhtzPgUXTvzSX3A98kzbNRI6Oe+pScMuNnX76MTaCrGNEWa26GqO+ZmVcP6gB6L6XDIUJ9X1UW+eYbdwy5AXDRIZshD9fAAOMS3jVEi+J0UZDa2uYs61klUpuvWP64iH1WJyByCuIuAjLyxC4U0ExU2RxyEyA5udRAZBPkyQiXJphNpC5GohLzUzysy0bGf10Ta2v/bVt1a17ZuCQYjHUGU0UbDguG0JiOgaQdURghVepokhxJzkRCbNJgtUA4YbI9VO15dslxr2UXPQEOHy0H7yLr1w3pBN9F2pzFT0TTB9OtXe7r1Kd261nM12v9Tun7YU0DxpgrRoEOTnYKi+uC13qnCewtXF/r6et/bc7inZ6rntp6l3KNBz2HdZzJd8uBLC6pgeguewx7PRTp8xNSv1j1TnjzeFO+paQ4EbQifmMPpte4a6bmop/fqnvf29vXhbW4rTBV6Dhdub+Sauv0j7AOsDTVlO9lSv0QGEGFMAYTRlK7jkAsoqngusYR5tAgPyKiOJJFIcwoWBHEaDyJsIZiZNANAWsOBdrNdc7tQmksCMcBwNHz8tmqSA0n8xCvA/VS22ZJFOWaY9PqrH6CnjkSC4qGDKK+nxQcOc3dOSyiWYG0PfP8BEc9f+S2YDrZd/VHrTKwYoYlAiCt7H77/11mBfhf1j0FCSIUx5OoO0o2WXpUMkGGyhoyjxbeRXIRW3776FWiSjayuD68cGljRXy319fZ053Md2UwqmYi1RyOtYdRWhj+Nv2zMCUSVJcSegPhm1qFQkVJxih9FuplgbgLI9MUXbdq4Yf3EurVoyHmdDgVFNPGA5mr8Zu4nRtiT5JihJGaTclAO1rI13OwEfmX8ZuV2qPETuJVW0ay8ChpbsAewSrqW9CNokkv+WpKBr7XVJ73XmrjN6Q+H/TDuP+LbcLhlaGNsw8aN+ycnN3Rv2LBh/4YNk3d1ecMb2zds2Ng+uSIzEMOzT7R4Jw+7K5OT7f5rfBusWzt693jXgz5/yZXqIP1uOBNe2EQfx8O817vxqXcPbcA6k/uad+veODk5mbukdePrmGjfMDAQm9y4MXezd8OT9dLkxj/HGrWOhf916RVX0JU9KK9+fv6T7EdMwd5Ikmv/JGqrgfWPO5H5OwnKpIPYiBJIB7nbBg6iwYfy63Jim3ooyshWLlY2tNY7fn1ZhGtvKbq17m1ra0u2Jb1+b8LvNauqGOlKN/wyXOLZPvmSzN3Pce58zpayYrqE0II97/NJESFlnnvJTAkRNXf/jkfOKEIH5DsU4cwjO3qtc9a5hz79RTXvu9cIh417e0P7jikHDijHzr72GhA0gZgtm19Fs6RBd1yfoBKXEV8SYdb2pbApbpwBGmeYm0yn4/F0RxpJLp6Kp4xsLuRAee3N1NLVoOmBOOqUKopnmaGs5i+OwgYTSDPxWgk3qsKeNpez5bv0xPdanFob7HXSVqXF+ssWqS9bKUph6/lWIesHoesfO4EZcMztesbZGnft2aO3tTqfcbnPkygNfbMl9K0wjXznU/hHUBMu2pbsLUguidZYidTIZ+ufSrUmWYsTHKzFMRsV2xDkIyxkdFYFJQwhtxKaJbLplqeI6SfmVCIYaBfcxA9u/2wEwMdddmQ27o15BMnlkqYaKcm12dA15pJcE+Vyb28qFYtFIqGQoggCIeUaIpZKb6m3VOxL9aR6Ct35rlwntls6lowlE/FIe6Q92hZqDTUgpuH3eXUPyh3FqaDoEWRBRinFCPOmERnXAsmKH7c4blCqcCdgUsSNeeNewHOl5nWUTt4SYinA8/xzdmxsDF4bt1yv4B88dvbsces+esv4K+Pjr4yNnR2z7rPuYz7rvr/BUo+N49/CF87yP34edlnfGePVo2fHzsIuXsK6Fw0E3Jp68/PsVVZHCVYjV5I99V3zAE5E9dCJYkbqQwm+OUuZII4RJzgPEgnhiSSirYX4GQUxssEhFUC2G3bOgTCVCdN4ENgWBSU1mzywf+8Vb98ytWmkvnKoXOrtKQWqIRdSGkhytsAWvUiDUGzoM3uYS+qBgpit1qKC7SLgysz7xlWN++w1ikxFl1UfpjVuYohLNeBwostQouGCeSP3Cd/4fvpl8UnRo/ZGo+GsuxDqCKfc8S6XHg3nQ8dVTT4j2pePt+ZjYZevRQ+lfJ3B6kimUbs1lzJ0bzjiSqUK1XpHowJdV97VqWfCLmo7qRe+oOAtXNI8YiFQVdPMGOWdLdGcYVC8Kp4R4UfNAnoi0ZpYmS6OBnrCIRPs2r5YqiW5cjhc780nXKxRwe4fm6+PoFZpI3mypl5PYJfAmMTHOJCw7KFDKgpzNsil0zL3QG/hCNdWg7mOdCrcEmgz25wqV4KKrRCizNBYosDKw8zfAI2GWTPRBDYkW0UUNYDXZh45tLmjY/OhR55eTMzMHDv29LFjM8pAThiZqdcLmqLTI8WJTcORoamJYnFiaigyvGmiaPluOnMTfs8qLlXLDw9vGy70Ltrv9Bbkbxl5OlfPiox7VtAa2Y8Y6QARAOxBev76Akwm/emq3zbb/fEKmsEQFN8w2KtBu59NmbuOnoS26SPTAC/FzIUf2L4j790vnqQ+TD64b3Cablp52vq07T2CEcQk+3bffffufVHUD+fRbjzN3Ijf4qRY72lHm5xbW3TMpmvuuAaBG0ooNrmnh1sKwCaDSWTyhqWAKNvAdkPsxscgk9xAEKI0iBDMpLeceOkEfiGaHzA+s/Odm07sqdOhfXc9cNe+IVj7mQAce8cJevKFe6Q7rXvbcoHPrB3e+4GP3nVgQBjZfXLDO3d+JmDz5l72HLsYJWOYjJD31F2EhzSMdbQigSGK1VCRFWREPIh6dmH7Arkcf4rAFNtLBSKDuV9Frz1vqkDn/6saW+uu9oSvw/Qm/T4HQlaxzH145QSipVoxHc94ywWKPBnQRY4yOAFx/15lWKiVqzUeFMI9zHIUaSvKYMER7wXfQIfDupOe/WC4PLVvqhymD+XaXscOfL0tFyn0pnz01ivEWD4m7j0GZqK3d07pjTscnQPwRw9DZ2SoP5HoH4pYrzzclhucnh7MtYWK07O3b5g+oavOYBTxmFPVT0xvvG1uqszHCHkfCz2opb2kiJbBKNnM4y7q+y7UsIthzAsOp+MgQVl9UAeFKgc9tmaXoeFL2u9SKY+9kOYJgkipgTy1hqtTs12dbtvVOXvptq2bp6c2rZ+4AHHdquGBFS0BowUBU1z3YZtBw/FZ5n6PWrGGSBOaLkDuHC5G0azkw9PFqBCEBgsWTUwUYJiaInedZrJo0vFRVuTRYnapyPptA+u767BWyI3EM2lGb5laY4VGN4Hg0mOZgbiUKoxvWtfSqSuJ/kxM12Dhi3zEGVnlDjvM5qkbYM1wYf2Kbd0M4cBoh7B2rHl9lo3m818ww+AO6Butt49s3DgS7R/pL2fMUCRMTT2sUjNT7h+J0OONUWzrX7feRG/45HXSrX/bVYBRtnqjHnCHQtC83IgHoEO2LyxEMvUk90YQaHK+3Z5kybkeDPp93HqEhmQqVmsGj8zB5mIZm+vhscZ73uX7kiOVycgv+h7+0cPw48azBldmrU0+0/TB49mVRx5+2OajT6KO40+OISJ/5E/S2OscCfKgokEJ6UAWscf3u7DXZZHMC0AUmSjziCmcTuVyfFGUqvKcG5wOh3MKD07HVoJ0g9hw6D+vLSvO+d9cfWs9GkcjOt4dR0zRmUHo39YaxpcM+VKVhFfjEiYQ96N245oNbE+5GSwVgygPmYwIrQsS/kocbWskpUo2HoDnrX5VmDulB4KaL/L/hQ2XL3dqTlCtgQcikIpokXsiJ+ETkiBNL/i2qfAJWLcTUvvCnd1hlxaKbdpn/cNO2FGthhfet3PLxunph3Y2xqyeYFvtfvOiFJom+8nl9TkfoDkyRlQqy+ou4nZqVBLdjTAW0vCRo9C0XUwIFOkcYmfZ5ZKn+VF2bSUu2bUh1rp31+zWqYtsCwgRVut07GK/gR+fh3tqF2M9ak02qDVCyopmOoE/WwMeqqFRU8KPwSM2UNYXzSp+hoGHfQzTTBU/ZTv6o4CkI4Ed3SElMJfN6LxMNYaVUFAvxnqsv/mTx+hNzxxdFc1HaKwjYX1fyA4aowVvJOeSFIHyP0l15SJ670huUp3I18vuSF5945Iz16YX1mU2wSNMvPnqolU8fLPIMHm4D0jf4ZskthjzMfh2/qCb6LH3BaLRXDS6W5AUJ7/vaGaTtCkzGuqI5JySKvA/haq/9pL10Zv77PtLN11j338xbdP7CXYPy9l9FiQX1NdxXCpQAcZk7khkAt0vcvwgENvNxHGD9AZu8PlUBxBf0BfU3A6v6kWop4DSQA5ERxbSiZ8PBsb4YGAgKGe98OKnQbN+at1q/RS0T598+WXr7Fe/+vTJ4iMst3gWjoJ27sWvQs6+SPe9hlfBx8dvmph/I0nWY0UOB5BoUAM3fHTNYMORejyWYQig04btVUZp2kMzdlfyHkb7hKN0O7QnaDbIgQYMRIo2bVQwb7tNaggTg0XubEFOYj6X5FxRLnmi3vBgtWvs3q5Wv4qYX2bQ1h7Rej2KoBq6ashUV2KZKKJZ0HIHJsEnOiVZjUZjLlkP0bkso/d7erVILCKISsBozd8z3lWNBHVfTPOUyyuckouybLsR9dCQrjhj0agqKk5mwoYDORdFhRtLJQBhVNWvItxAm4fYmGTq19hA3AIatCMHryb31+9bnaZtvgu6U8zfRsdiEA2Dry3qm4u30za/o226FfwtQTdzKH7H9pDpYkrAKzNRUMRZQ5eY4HEiqEHINauplJFIhEzZCRLZgtZyZPKqQ/v3vmP35XOXvn3zxRsm146uGl45NNhg1HJfTycC73isnUfNhFtCTaun+acnUOEhOkvyLbvsCG85MgR1eB8eSmTWSsUqLCtfa14LNq/V3vAZojhciiJZHEC0UeDY6dNfOHPmC4t7uO/JJ8+eOQMfP3367JNPPueSUnbwHt/fZ586e/q0T1WSdnhfUlFfyUfO/aQtl2sbL6dT6fLZaiqZrsJYW+7C06dPp86cOZM6vfDc6df5LnUGek/bdzvNa1sZvHb69PyyU/mFCr8V/VJbrpoul9PVxj5nxyydYI8hb/I+7UBE30vK5M76HahBHMQhonhFs9GpqPsNUN1O1T1P3B6n2zOPBrzm0sC1n0h+cIiSY1bwoVJ1KsQ55wWPjhzm0WaJi1LXFHG5uGfIRSfiaMgCQdzR19s0XNOpWEe8o2G0NvvO5+YjHhJphdZAw18UsCML0cxPLjV5CW3WUiDN7dRFi8Efz8aDaLPyje2IdndHJxMLG1qn4t3d8bkE9SQWfgp/tfDFYCyej8UuobUeK/K197//i+9/Py0XYtaJ9sLv/353DA7Eu69597uv+UvrHyBlvTPWFcOvNfHTdyeTyWbMxC/Y91A+SMgLK8gwGQe5HqgPD+pc8RKhzINExlajwdB06/YS7vSQhf2EGxRkFzISijlhTsGMJIK0nXD/GY+15L5qkU62LnqEGuVl+C0qBP9HD6r3La8i8ODk/6rO1q1b6yYho2tWDvUVOjPRVtOPLSEZDi4La1kk/IDtmzERP/qXBSDU4sUgdzxJ2QyekmSvYQbjxSoay1jQZEFIVkDONgPI4N/ql9QrEHA4nnP4cEvNrrF618zOroGXklEHk1sV1e2yetNlHuz5UrosppRQ7bR1x2l6sHS6pOf1S/RPrb5kdXsVTizewvr03sYNRmZBE/xSRBFYOd28xzoZ76DA8VPWHaegUD5d9ngu0fO23nqC+bGvDZJDlL6hPtGZRFv6ItRPGqqFPCJxYawZqkgYFdD4bYxqzSHQlxCb4GGLjKWkya6uru1dW9eh4OrorMUVHkaH6BkxdEFIJlDicKHDOJ6mWbRfsgnZMPlZowEeWKZW0XnRbDVVK5o8pJ3HO6IVI/NDIiMnZKh2pl8OejKZci7WoaNaDWYKo1U0MgeGM5FuCcD6W3BsNAS0oQRkRSMajjBaA+0Cd9GdnVhXjPnChVTb5sPQUd82U27Z0TJ4CHx/Xk+HEj4Vba/BtplAGU4KWqrekx3ggCdyqK07qoUtVqGaIuumFhFTNBUS0VwTCsCDwLVEfiLbVowmdM04cHH/tipqGAGkxbHbJ+ggtu0A6a9XdGzOQpcLETcda+EBL5jAFm2g8bcENqyolHt3RAXR7ArUGl6Wqm8lYKPVkMJQNq9C64YjK+7llCXqoVIAYaokJ7iWTiKqlVVXPuXR0QQacCfyqrqmd7y9tb+jShXvJkNkIhWoZxSpRgDHLJWlkKSPeDZkIqWNvYLqkv3pj94PCUNTJEoHBD7OJJgRZADVHVSjjinrpcLFBVNVmSfUTjkE5+NUvzj/CXY5K5BOtPna6xGXk6Lh14xpbYxU9/bku1qCDMVdOgrcmSRluKdbWhypHoTgsBC0hy4RRfjNpsyj7ZJgSHX3fbGw2nFsbyTqavcrpmamguUxNXP4ukc2Kdjbav/czpRm1vP5ev5HxeH+UIc06opFDtza4YrELuzTu9u0sKQVr9sy7JIEderjeCNwmYV6oVBfHMv6BNvGNOSCleQiMle/dACtzPVDgwjYLgBZYGMTII8ibMPGAz4oQkRG5lGmIPyed2CHoyQRUaYIsixM40GQtxBZkCdXDee7xtcNX7TqonKpa2V+ZXsi3KFyO4sbFoHGoD2HVLVKtVZFjYpf7GIezWLwhghiKzDkGGQYZAIjKNdMP9qudhywbJv6lGbkWQa+4XBsorYp1wk0q3kEl+hUBDGSAebPtFdkLT8/dmy2v3/22F03z1VhTf69W/Zs/vChUVo/fM+Wfdt/MDk0ctW9SFgilXyFaLJlanioVyxmXFRyOyeZK4c/ujMZbRWq1tf7Z26989aZAVqdu3n8ypljXQOMjR449dCpfeO0sv47lx/ZfO/h4UUf2j3wYtOGGajXEOWhxcJpfLqZJLBFZBx8Tvpt+Bs0fWF/eDkA5uNHfj6Wwo3v+K8kDhTq9Zl6He4s1Ee2jNhHO/9ifdvIyLb68j1/nfPnzn+A3cvy+E5+pNMd9e0uYDSZCAUFUUb4K0uiJNt+VkkU5hUgDkB4RrlpxScUzKlgu8vwsOgvCxj8vTOpWLS1xegMdOqaw6/6G+/u5Hq9Snw8tJIEE1JAws5FKMcQWmWRT5HqORILYq/zUL8vfhp0yfoPRO4/kcD101yBJmKZwlPRfWVfb0hTc+He6JF+vWy6XKkwy1Hr542SKoJ838necCSWjw0sfKJcDqUyp+YGCuFE4p49pBk7xuNH2vnocYuCIgdsVxsfSWFvRL8EKpWUbf97DQ717ZDWNyLrGvGrHOizV01Z9qjfnh2xrrW1zR0js99WPbJs0rsWTgUdTP32jH3+dr6f+bZK1WYcEXbAcfoYUUmAdNdzAvfhHETFT9nBN5lD9mDPpM/r9+Km88kY/jhCo2ylWM0m4Y2kDy587v0zt8I3eSR4M/WYdebO5+DgsVnYuJiy+/3n529lr7IRe15Thvtz06lkPMbFhh3KtJbjGXJQBJSKfGoEY8KUZPvTeazQZHu77mnPtGdCAU9Ub0vo9ryIZFa2I4uZPXrjb+C3pQaDStaDoi3Atuw8evap8uQ+NUYfTmkv6aapL+T5nn54/KFj75uh0smTG8unoCOj/VxNWHeGdKtDD4V0+JoesoY+emro1kfObrbl6/8+/x32DeazY1S4L4eLVtaYfsSjUZuKoyXUCBnpERrhyTwaCLcoN9y5Oww1bYotgkm2dXzAF9YnpzNRX5HS0aePPvOyqnz2OkiMR/P54XyeHug9Oi0JESVXGBjXwhMTL3zgyA8T0wvvy9dzuXrebttfnt9DP4O2k4RvVuR87nNTQWS2o3OMi0mBiXM2DwgUewPfdIrrxi1cLUwW+zLpoDfhlZDygoh2paxUi6Osw/eMcTXAgDsbJD76Ts1gqdrUFNlM7CsQXje+7svWT8en65LycZh6RBU66iO91m2CImjU4aROrX1LaCq0pSUgeN2osHVr4MCePTlKvzx++7bbxq/7+MevG9q7eXofPCXElKjk8Qsef/6GbbNHkm1ym2kmfM819cIrSLf/RFqQg9K85TnpRNtawygfeCgWjDJuPh/kk3h2e8PegM1Fw0LNm+A6jg+4eHkgqOg1g94MeBEXVuEl0ZiY+ejs9o/OrnOhvMP03OypuXVu6zMfnz8Arz18YB+9RtQyMRMWdoSiGVV1KamEQen9oWjK6bSGtRXwFwPWJHxOG7BWrViMu2cP0nuQu9rqYU8jJvBN6tcIGoxPGrCnNmWXYhcaAQzsQd2KIaq0fticqwAH7MkKFEnVink8YDbmLjwIB/nkBbtdDgnfYRvQpupGjXl/I2ZqncdBYXT94yEeM6UCSlQJQbqAZrUgzyGJKKKkXOZExMAcIo/dAHBME4fDHiB1AI+ZsivJRNr/29faWm9vQ4traEW5ryOdiEW627pbTK/uUhv2VXM8PmhPlgjwoNCaXGkMaHDBFrAt2hof7sBrEhYzRW/ZRvA8jaC+KqxbvQ1m6pUPW3OrZ+AP7Ay9cvXMuZ9+ZbIKF8cCC8cDMYiy16Lmwh/FeiEWoFcGYvTxbSPW3Vj4wx+eqeO2GuZXz8ystuZ+WJ2Ekj00Yn3QjF4B+wKx3nbrE/wWdrteIXyOXWTHw+Z5JBVyEDLUGzgRyW3ODrecfiPcslSuVCqlxbBfPl7Dh+jsKZTeN8txsfHTDD6/sir8Rcj/yw96w2GvMO8L58O+X/7YFw77BL8vbL2UiVjXt2YyrfDe1g6WucUXgrD3FixrfXrhI7wKvQzLPoIlqplMg/7gNXqCoNX4pCpCdxfYYc/2g4PwfU2zpkOJRAiuU6Oq9R+6EaU0auhLuoH66LM2VkjWY4hOGWcpLtd2cwW7HBI0po2itE3gneOLCXh621PWuW1P0WfrC18cGaED9cVjQwf+M/sk7UQbp6VuupfFbzf4wsf5wrGMK4KOZlgPe9Tawd93RzNYtoPHx7pmnHDcutzphD9wRtUZ5Mev4WnnDI+YbfDhJ+m6xrPsGbFjZGl+UdCwn5XmPtGlEN1mdC57dAZvZ33N+lozRvd+HpF7v3N+RlWh03pFVfl1uF9Vm8G5jWf54MdIK6F64K02RKVkT7Z5yxxSHvK9sM0esKMPLYZ5N+K7Y2/S0xJxk1X1ISdqaBfqSe65AjaGJg8P5hzlsfo8OmjWfiqP5SSb+VMnZFl2y26fofMJSul4IFsLxNOVeCUoV9jxhR3f/Ca9/9wt9P5vfvNdBx/+2KFvHjr40MO8F5Ql/6kHJUqW1MgI2UguJVeQd9dvSsUkfNZMbyYaUrmrcEMh7KOiRC4ZqjJB3DO2drgfiZ4Pl9svSfYr9tA4H0DiqHweOQj4wLnAI8TmiSwfIDbgIBxvOGy8wQXIO3a9bfPk+sGBUl8yHsm2ZYkHPCoHoAk5k63W0L4KGGhjZWR7XynzM2BfQ2CEZ/yNESMsWSrya0E+31GSq1yySI1b8Av22BzP45mVUGW2HcAxV7b6LdPozVcnZoYkYbiqHzCGjJFipqDApog50D+98boDk5vDe08dE7TMUDiqhWY79CMZfaBYuE6iJz991bZR16ikRc27YO6kUB8J1Xt3qjvDmo9qm/cNVA/Az9Xy5EQ+k9d1Se/tF3Ykwlcd2XvswNxwMQS9Wi4SHdZSYasc2mKooUi+YCj7btVOagVBO7G5t6imJuceT0184BjVdsDLt79o5n1Sv3DiiGGquYUfqYovsamec53i5MPnHn2KzdPzNj8nyDXk+vqRHaDIl05TohwcGajk0pIEER4BO9YO4igfu5GVXW4QHCCjbTDrok4Ep8BHAec0tMxFUZrmR0ncQkRJnEwmDdtgSF6TvGbn5W/bvHHD0GBriy9hJJZLCk8jVLYREltaTPhR+qHQQPmXbaco6BnvGNugxg8Plu0B2/CyOwgzduwsHynEXdCOqeQnSlUswgugRW4G7QmtvB9l+y7wpC/Ukmxpua1x+LOFrySLxSR83awUtxWf07SQoTllIxJrq9Si7R6PV1Y1XygSaw343A7ZobgdLkdrFAGlEG8zdFdLMc/Ers61/U6PvzUmeQNmtBVLuBUs6/YFWuF0a6Z16QuzpeTCX6eKG4qFTfRHydLCt7y6zO/odrkkhyq6RYfqcDrccgJUxa061UJfJtva4jecDgaiqqkuhyuIKcHRjsU0FRG6w2n4W1qzmb4CFncri3ie2xWI+7JkFZmsX9CBveVFTqoVEETHsT6f5QoSD7RHcc6NKh5gO9+c5TP31uHHgdZ0pZouNabsvcmlhpaHnV/uT7Md0H6vwafeLUnRbHM+IfMtudLukFVVtq5dcqKpSkpRz5oR5w7rblEX6kiF+3bweYdtHgMmzyx5z+xyS66zMwoK4L+3vssnsWBFSaqLml3RnqHYkF3P2eN1F5NtZDvZiVLrALmaXEf21t+RirYG0Fzc5UaTay/I0hiIssAnnFEQuE7nQnSeMAkYF1eoMLmAEkHmUks8wDEmt5dhCTEDufqqKw+tG+2v9fXmu9oi5GK4uBFl2fAaSFzzZ4eFLAqibAapNZOQC1SWuPCKsiB3GyX4IE4P8KhlPlKDG62WaijbUFMUgEcPMKwqS2awmvmVXa0sGdUaJqrw2OEvXvXAuz1aW6zYnwjTfKBFHwoEygcqSrTuaTHyoUR/L0J6VziT0Jwxl9OlUIUJrpAkyYmOjMsNuvbuBw5/7m4U5RRUQ3DKqiGpqhoR3A53GryCN+P3x8BHfcx5+Llr7vxWF9PUI9UWpkXz471rekurRFNzezySLyytKvWu6RkvRHRqZEQpFPSZDARVYkyKau5AWKGsGKGqxrq+dec1zx1euEfAdhckD3NKroCgyZohuJHyJdEloZJwg1NmWsOHd/4X559gIbSfDa5jNR49s2yyTX/W1rGmvGQ2I9lChtMh8zi81o9tY/m4av3Y5w/RF4L0MRNPWjuCKnMed/L5an5vfnGe4l6bn9pRYqZJiQyRQ/X9SdRibeAg2RiVRT51BdUyk2ZdSA8OkTj4ZDnUezK3r1RFUOeQFqlToXzcG6Ax7s3pxgmT5TKQ8lB5aHBFtdLbU8h3dqRTiXg4qOGvJkgC2jKUbMOFZszP0ih4oFryQAnkUrBWaUwr8yJmroI3aU8087IzNqiwg4Gsr+DO1L/nqZp8KlkmPvaxj1n3fexj+x8/Gw3+AKImzbwSDb5Kjy5hkVNo6lxrVj3f082Y+afBaz8GN37sc4//gM8/s+47blatjfSWVxGpWPc25qB/lf2A/rOtX+IkRwbIBNlenxkdGmSqs5yniqPVz43QMUSjquRUZ/maD4yv+eAgCnUoyyaUiRwzNYbQZ9/ATuPr6qv6q2l/IGjy0XEXX7yDD4rzyJrKUihIE1pxgWQvz7H8QnI5Bn8LJj87vG146ct8qrKwjQe80Ydk17kf/7qzsDxTz9fp0MwQrf+0276F9S/L19Egiyf3cdnHd2C+sYSG3XZ72Q/QbmtHq20DIqz95EYarNe2bb2EGZ5rD1DNOAhurRcV8Tt6ckz1jUUoE1e1acwpSAiVeByTY2w7qEE/SrR16x93oal3OfEYnoMBUH1eh4r2HnMyYRdSIjbxLmJobmPa1KnmB7eiuWex12SfgjTrI16Hz8v7RBId0na0aUQ2zd3JTio6Z98KZ1vXP57GR+38TY9y8pU+/u89K4fP2vXGs3yqd///q4fVd/+65zj3/99+EB/Xym/cGIu98/qrr5q/4vLLNl668dKZt09dtOnC9ResGYmtjK0cGky1ml5fyJ9MBPmQMp8fka01/JZy1oZBlYSUtaNm5Sj4A0l7CaJamY/OZHkogGmHAJQq4jLmKNlr19iz71F2SHK2VgqI/wWP/N1wfijVHonpoUFN0EKq6kg5Bp+pRBLwghBJdKCWd7cYPe5qrKM/U8jAGNvwZjb68yEAMdgxOcg2/kZOqnYXId3XoutJoV3ytbsVVMrRS/pWSzkY2WqobYVoKOTWdIjFI7FCR6QQjnoSZ5rMpqgu+Lf+/jXdQdRaubFvf+3X8xtdiuWZIftg2/rHHUhXLWUd+cgLRCx0U4HsnqWqQxhbAbC2tTGeahegv7bAf1J569bG7QvEoaiKYxdR1QN8fqY4LVE+GwcxtcB9B4Ki2DGffMqZoEw2n1laXouHPHKxSEXulW1Upb+2qu9/8MB6T6OCuv+3rMEptw3I3j075i6+CCVzpdQXixo+jywxMgMz3MPjR6huO6jRxKrWijU5iOpYlgJNZG6ftT98mhaq6WzGA0iHQbPWML/4B5EmL2tn+MAMH5fhaCqDoMj2mmAB22+CkI7KnkTbhL+nsNrb7gWIp+JOGRTWYiT6+gZ720OtquFwCYpAmeoP9SvQc1XXGpXRFrOTKSAqzKV4Ap256y+69NY1bodDo6+ryrkvccJkFUWlZwH6gAl8ZSClU9TkkVN/sLYr7g/rKlrW7bHOt+X7N/XF0y4DJXKvRBVEIIIbwSNTPB6n5Hx5/8pcOBVvT5en13S/7ZkrNOPcv6b4zVM2TZ4/f/7v6BDqT420cX9Lc5WO5avQNGd0lzNvWg4l01B0WZt1l03xfvMCHm+e8P3vHpUv56FGDTCf10wzYq/uoTZ9qy+yrWgnMsLH3SbqYwk+r2hMdlBQRGym/RJSnUgOcXWtcHXNm26aKAq3AxVxkpDObDwWaTUNr+7mQIbH/KtioMvvTXprjZWabIWMWexBtCHQ9EuiBZEtBZIotorm559+bqAAhf6BmX76/j8t9CYLbulpgKfBGcoMJbYfhp8tvEI7H+2sVqeqVatufR46Bkcybd6I9aVvvu/B1k2+cEyHmxC/Lc1/9JMI4rcqWUNG6qvaDB6XPsYFNHNIcyIPaFqayS5zSpcVRZ4msswpXVYmV9eDNuRoaWmstqHxWLoMog4ea8eDrfhUZIQZjSBV7AN+qRENHGX4i5bPmLw+cOiuqwxBi4QFbXJ2wiNEwrr1/dxAnnYMZyCWG+qg+f7C7wzM3nbX7Ygn+uduPXFsR/WCZVMqX18zTTet1cIOl57v7897NDX8T9GcXTHSPD7KJwTzqrfODgnl3Uc3LJtw2Yyt+oXQS48iEgvac0oGyRjaSdvJPLmW3EKOk4+QPyRP8miccbCbKkpaxWjrbDgY8DhF0TQ0VbDXAGjxuh0CC+kuhXuj6GV+mYJPoiSCrdgOkba2yBQeIm1bSFukbfLUqTN//MjHTv3hqT/86OmPfPjeez544vidd9x2y8033nDt4SsPzO/ZtWP7zNbNU5s2TIyNrh4e7C81/4qxxjptSDnI+Qh8l6ezy9KI8ZAHMI3yIP0bygR/i/PBN9/zvypT4Xk/jwh6i1/3rKPiwO+440YHfscbOTrksKIOB3zHYd3nqDrw27xwVuE5ZayZaxxeaRSxvtM4Hl884B2HMTF2bjt7taP93HYeZcVOR3NftGvd1tg3qn79V07d8yvpxh4C9qnm9zm7kMO6GF6zXHzjz4DXkMaacuLPBJM+gzZYiqzgazcVvLYdxmBpWaRKuSMb9PGICdu5umx5Bb5UkwGM+woKwBcd4EbvovN1aWUn7oGFLXw1L+ucJIEg6kJEkr7xDQlGX6KalFAk+Ap1yUlZgX1YQpMioviNb4hiBJNYei1mQeR+AUHCS7rwD9+QNLpxoUdWmAOFPX0Jb6BSzTpu/bJR6Rv/gKXxEdY5UW+u3Ua/ZMdcxUlHPS3zdXjsOCt7qQ9iz0vma/ds5oUnhqJeezAHBRvqNO4K4b+nIC6SA93++pryLfOpgYmRdVGPLoU86+obqxlTo7eghB6AXQu3JTvfQT3Wxb2zE6OFDl1G8zuXXzc+1wOPaQ2/BrdJTzIfK9ljtp1khOwkiXr75lVDMSLaC7a8CV4Oryz2UW5FmtyNgG8VhWCBxwyj6BoGv611ZcSGdigoNyv9GsOrGT5ClsmuAjNWi4LklxifbIRnCrSHovAbZrbzzZ7QDn8p1NsDumYaueiwcqCWzAGb2j36LmeHq+Oj94bCCade9vS9651FT7FPUIWIv/fwvsGWjkLKqXmZehSGj7qossvTw0Ih/53Pv/8ixaWA1C5pItV9CaV13RV/+9DmhAOuTub9jkLB4VRi6lC9xTOaKY07NsNlqNTkcKsg+Ty6QSXdI1Nj4ctaf6bD1RqmDlE1ov7qfod48cXMiFL/rPVv3ohPWRfwrJL0kJx7LLEjq4V1H1PDaqCvpcuZaPpKeezpG/Pv+uoFj0sWBFirohoUyGiDyO0xEbJbUQjR3HyeW2OGmz0a4k17wRYJzeON1i18Y6ctEX6JW9y6uwI1uN/6XRi0TloXrIMr4YfWWrimQXd72e+w1djDVe7H6wZRcIIkVoOAkI/xtZFEvlIGQ5kLfLkPSRYlbk8zhIW/siBL3GtmE5l8kg/bp4MNDMUHHjAZMMxgcRjSQdvVzeL2zIIan1thymgqBFEjB/ksTTq4Iv7w3rfdvfnwnGN06u7dY0dGoDt2XHaY6nusn7sNWgVR7o2mqzCQMX70XYcVdLzr2at2Ht1899t2PRy/IHp0/TtOwMQNnvqY4Aenzw1PqlokBeV0tiqcHh/zW405Pvb8FBfJkF5ySX3KhYB3rR0G3Zhb75BFxpcJ4WOIgkCcbsE560GzWHNP48GtbcZO0CY6svmubG9HTyYV57MIWuxYXJ+v6OOLfYIYSDaHXpKVIJ9xuuzDw2fj9opZIndw8mSNhmhwzNTPfVw3Yez48TH8jB+Pe0JwbnvIE2c36OYvv2J62dTZ5hI0x1FaPvbGZnhSKbwwb2pjfKka23d1HjHJuL1uULVe8mEP+gH7jY9HIaDC3iP2lMLZt84CC6ST2XRj8ZZ4M0apwPgKIkEZQZQGBo9BQ7CRhMfgbnn3s9dvuf/wCF136KObP3bdNaO7x28Yx2/vVLlDF/8d7ksnrv/0vtGrTn3i1FWjVx5aM3HDyRsmIplqPsBljGHTnw/74q1rtHJk8MfkM+RvyDfJv5Lz4EGx0QOrqHP1Oj5typ7usAL6oY/8gHyb/D75XdJCvAi0eIBLJ3RAnHydfIXcQd6NkiuO5/naIy3gJX9F/oJcT65EPdKHdrSEKMwBPBT0z8gT5ApyGbmArOZeItx+QX5O/hfZSi5CqjdQBv4ROY13DyCXOrlMxpRCxhomFyIQpxEIOHd1AMlEfIzhW8xl2/yMpsI6ohcqzqVbvUxIhFDmSYI8l2zxMClmuphDkRxzUVANRZ2OB91MIYZTMeZIACAwTQIB2EogABta65fZjzCcgf3/r56xdfXbbH5eCYgzoATd0AVpSEIbtOJlP3eLAl9yaoH8kvyM/Dv5MfkX8k/ku+QfyTfI35G/JX9NvkS+QD5PPkX+nPwJYrrHyKPkQUR3f0DuIx8kv0d+h7yfvAcx343kneQacjXZjxhwF7mcXEreTi5BTLiBrCdrETevRIxYISXSTboQSSfRRmnFtvZjj8g2ogTcOnmfvMlhyUcLeOg6X4AOoRKfqGPba/+dvFz5n9X7TXl4y/28/z/v72/Wl9/yO/+nefoTexmlhWpj3Tw7Jv+32I3/tgXf2EFUVfg4SmOX4r6S1H+VOm4n+fyB5tnfMsmmTO3cXGP9rlN8Dd2lN/nQUurk0pNOLhnGf76U+tCy1OJrfejX3GVhZWNJYj5AlPlt67z4337MEk54O8pJzZ6TvJJcVT+4wsWQ03NxVFytPioKjK9b0QlCGC2pdc7m4o5EPmgPHwkEeAAj4aNxcw573YVpPCwuxVPobo/qHiDVSvfKwspMOppvzwdNT5vepshEW1zVgi/3yC1MyFai4H9zttbI0sWLUZCXrpaHAR679fsjVz3/vRcOsJHvv+c3pQ8/d4Q2Moefgwd7e7ZnRjL43d7Ta01jLstzWcydbVyiueEOzNFb8OxY4yI/8DmoFrbXD7G9+Aq1fIyghFIF2yzE3dZBBHJsRX+lPdoqSXJHmopSZwrbRRx7U9CnLDF5zsljewVJ/DXRn/muZMLnBdLb01XKl7KZRC6Za6xo61CIDrqrOfFbo9wmZ8EEXyUmWMtAzV5AxkDrMou2imzWmos4poPVMmYNeG3307dPCtM3f/a5z948LUze/vTuvdv3FWYL++esyD5d31eCx/bO7ccT+7bvXZwECpfvK5X26Wxq063PPv/srZuah7GSXWHhfY36X7U+1Tjxyk2P3yxc9/SRa/Zt/yq/1eI6h19AvHAT2Vhfv3W6jPAyyFem5rYINo3gkGlz1SoCVOL0ZJslqr1cEuNBlJM3XH/o4Pyuue1bLrlw48ToYXPlnFMMdYmJjB2aXivzaHbbp4bGqwcMewqh7WZuFKjYBSpZb+2NiYRSpmYvu1asNpa8st04Qe6Ia9zKXqPnrdf9S7dmj7bsKO5ocevgC8ccPqRK63ZThoAjETXA5Qnv6ZsNuTWfGcVrfC1ZgSqikgiZ4NLCe3rnTE3zhSOqAbIHbtNk8KuFiKaFdvbMhTTNCCVkA/yOWMQHrgsFIeT26VSSnGv+3oUA8lsXuiRB92kh4Fe8uiDI7jXt8EWPW8MbqjqyLG1eDvPLomvjc5RKrjMbXRJ1mcsuuDcs/HQEb+bTtdCysUIdcUkaUdMKvrpNqZPKShxE2hZwu5DP2ZiA6nqd5GJOYXHRJCpiD86TpUmz5IAKiiwr2IWKIm/m4RfyhNdLSK1S7Ovu6simEsgjLV7Da/h9+DhPzc3jSrnOXdK7fjQ40QyFpRN8Q6yYDiSbU8XEpRTcYWqGzofS4f2CGz5yFx00NTuL3x+7BWv4C6pyGtXFtY0j/Yg1jVeszzSW+2uDV13WdXC75bLr4JnVuH3c9diNjRUjbrSFpW1LC9ciHYuI1Mr1PqfqYMwetl1c6lywCXdKgCWDmvAgFJGIXq8oml1igK8+B/641w/Ctb+8Y4xtu+vc3OuwWh5n2879hA5aLhiB1dZn3pjn8QK7GO+ytj6SxC7wA4LtsQgAD5Ti0IzHPwg8/oFwRzqfrYslePwDFyUMJteODq7gc/w60hI+3sv/rYM9oM8D/TNZWRP52mj2iuqNVb5tWM7n0gg127EZMPjkSymJxnRuYu7AwJZ7Zo3e+txAZsLrURUNzVufLDpCLW2+ge5EpheKqfYywkYJbrj84ElN13S3oy0fclFxaO+mgShM3LW1untuXYGm2ld1hvrN3o4Ik7Z4SzdfdmVqoGcTFBLp940VIr0D9aHw3L4PHGwphMOCpwiO/PCArav+FOlTJD7EbRHSwVdN5X5aPmfRq6lvGkFPJQ26SFKJbBrNRa+9irloBhF8NkM8DCIzP/fuiyZs0Nyqw1pw8fhOHaKQgpx1ll6rh93/AV3Wd0J//ycOQ5GgQOk7Fq7UfCDcIobd9KhLA+U4XWFFPghrF57UdKq8k3ZTq7cDLoOMzj4E3IdrnT+BOiOHdKCgnjVImL+5oSDmHbVXlj7IlqIGfUGf3+QLUvgd3K2UjjOkFn+1CEFTkh3Ak8EBeMaKqIoAA3DoaevrBy3roBCh/9QvKKoVwWs8K8LzCy/Adjnk+vjCC+xO6xHY7LLu/7grJFun0dTd7Gr8r4M92J7TxCRZ7oExdJUtxRUuRfCnkpFWn9eeXuOvZmRR40uW2SsL0eIqfC1AYipQlK9RRu+ZEk2fFdVdinYUojzo4Z8dbtfQjSnY9mbtcT0cazGVP5N0Tcg8pYhMfPld7oFLkV3fqqD+D/hze2UAAAB4nGNgZGBgAOKbHcIX4/ltvjJwM78AijDcfHP9O4z+//i/Fcsj5kYgl4OBCSQKAL0zEJIAeJxjYGRgYA76n8XAwPLo/+P/j1keMQBFUEAqALFVB7Z4nFVQwQ3CMAwMSQYg7AEdgEkqMUcHQAzRZ99IbMCHL28mgAfmjwQIijknTlMeJ0e+850dR8bYozHuxl9HzK7GW9ApQqp2mTD0twApgnBpVryiX/YQfgrMpce9t3xxG2Rln4Vo+Omu6IXiadfCwxNvXzHHbFLfVjLByfxuvAPqil+DpuVP5DrNOPHD7vmd9/Jn4GDM5I7Z2f89USMe/Sg3wJtGurrcHW+rZFe9P3sAvol8+VuSv9YdGtVT6f8AoCZmXQAAAAAAAABEAKwBmgIkAuYDVgO0A/4EZgSOBMgFKgWuBnIG0AcQB1gHfgfkCBgITgimCQ4JWgnACmIKtAsOC1wMPAycDWYN3A4+DvgPyBAuEHYQxhFoEiwSahMIE+IUOBTAFbAWSBc+F+wYYhjCGWoZtBouGnIasBsSG14bzhwiHFodBh1iHYAdsB3mHhweRh6CH2ggWiDgIc4iAiKYIzYk7iY4Jnwm4iduKJApAilMKf4qPiq4Kywrfi4SLqovRDAYMKgw4DFoMcQyEDJjAAEAAABlAUAAFAAAAAAAAgBSAGIAcwAAARILcAAAAAB4nHWQy07CQBSG/5GLCokaTdw6KwMxlkviAhISEgxsdEMMW1NKaUtKh0wHEl7Dd/BhfAmfxZ92MAZim+l855szZ04HwDW+IZA/Txw5C5wxyvkEp+hZLtA/Wy6SXyyXUMWb5TL9u+UKHhBYruIGH6wgiueMFvi0LHAlLi2f4ELcWS7QP1ouknuWS7gVr5bL9J7lCiYitVzFvfgaqNVWR0FoZG1Ql+1mqyOnW6moosSNpbs2odKp7Mu5Sowfx8rx1HLPYz9Yx67eh/t54us0UolsOc29GvmJr13jz3bV003QNmYu51ot5dBmyJVWC98zTmjMqtto/D0PAyissIVGxKsKYSBRo61zbqOJFjqkKTMkM/OsCAlcxDQu1twRZisp4z7HnFFC6zMjJjvw+F0e+TEp4P6YVfTR6mE8Ie3OiDIv2ZfD7g6zRqQky3QzO/vtPcWGp7VpDXftutRZVxLDgxqS97FbW9B49E52K4a2iwbff/7vB+x4hFUAeJxtkleT3DYQhLfvGPd0ki3nnLPpJOdsS84554AwJFELAjyE492/93BVejOeUKhBzzfdsznYXD/bzf8fwgEOUaBEhRoNWmxxhAs4xkVcwk24GZdxC27Fbbgdd+BO3IW7cQ/uxX24Hw/gQTyEh/EIHsVjeBxP4Ek8hafxDJ5Fh+fwPF7Ai3gJV/AyXsGreA2v4w28ibfwNt7Bu3gP7+MDfIiruIaP8DE+waf4DJ/jC3yJr/A1vsG3+A7f4wf8iJ/wM37Br/gNv+MP/Im/8Df+wb8QkFDQIPSbIkcKVe+tplBYE1Np/WDcofJDnRaTEoUjEZJRljphU6WEU2SL0U/UaL+4TpvQ9EKR9H7XiMj1Ju6qPFsvdBuTnxeR1FjR2exDKkdisWK2OXLJ+reYyOXWUp86P5PbBjOM16+lcdKfVUsgp8Za+Ykr03FMQu38KYXe+qU5yRST8W7rd50ygSF1vYjgjBuKSRjLE7ldvaPzzrjTMgURxz31ClcPVsRIsToJymuq45j73tIhnVNhvdpVkVnVWEiytlxdig0/i7VdK4OhXolIrXFMNAQxlWr9VM6jd9QoYclpEco5GJcK0iYVkj2uTBLWqCpwKaVmGUWKYp5L7VN35YJxvb8xRnNqNHG76egk+0Td3pd6NirlQPXM+hxNYcU0t6vze8cOOAHFkmtQ9cpuTom9FuflLHiAdp/XWliz93uLJ+NybOiMf7mBakdp8WF3WZuofNAdr4LvltEkalYjOzpLFweTxixvYFa9sRx5ob2KR+v6dDJbZjve312eJAXSbXa8XixBReQt2IuxJ66Mk7HUcD7Si6CLNYcqjoasbqVJMq8u1YtxTB63y0hkmZSXRgq3qwbvB0uXZDaWtYaOUVbjtEhCcjTcpSeZ/XnFS8ftt9I4r7IVIW5ZJbBNgUQ7c0DMGFM1MVKeKh7QCtkksrTmutn8B/H9OFEAeJxj8N7BcCIoYiMjY1/kBsadHAwcDMkFGxlYnTYxMDJogRibuZgYOSAsPgYwi81pF9MBoDQnkM3utIvBAcJmZnDZqMLYERixwaEjYiNzistGNRBvF0cDAyOLQ0dySARISSQQbOZhYuTR2sH4v3UDS+9GJgYXAAx2I/QAAA==) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff2f6!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff2f6;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff2f6}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file diff --git a/public/styles/comps/footer.less b/public/styles/comps/footer.less index 1d6b2e5f47..06dff219a2 100644 --- a/public/styles/comps/footer.less +++ b/public/styles/comps/footer.less @@ -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; } From bdc32f321e26065ccfed74b8655f8ed68450bd34 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 3 Jan 2020 23:00:53 +0200 Subject: [PATCH 018/237] Added create account method --- app/controllers/api/account.php | 171 +++++++++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index aa6d2c2b09..401344a821 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1,19 +1,26 @@ get('/v1/account') ->desc('Get Account') ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'get') + ->label('sdk.method', 'getAccount') ->label('sdk.description', '/docs/references/account/get.md') ->action( function () use ($response, &$user, $providers) { @@ -53,7 +60,7 @@ $utopia->get('/v1/account/prefs') ->desc('Get Account Preferences') ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'getPrefs') + ->label('sdk.method', 'getAccountPrefs') ->label('sdk.description', '/docs/references/account/get-prefs.md') ->action( function () use ($response, $user) { @@ -77,7 +84,7 @@ $utopia->get('/v1/account/sessions') ->desc('Get Account Active Sessions') ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'getSessions') + ->label('sdk.method', 'getAccountSessions') ->label('sdk.description', '/docs/references/account/get-sessions.md') ->action( function () use ($response, $user) { @@ -134,7 +141,7 @@ $utopia->get('/v1/account/security') ->desc('Get Account Security Log') ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'getSecurity') + ->label('sdk.method', 'getAccountSecurity') ->label('sdk.description', '/docs/references/account/get-security.md') ->action( function () use ($response, $register, $project, $user) { @@ -199,6 +206,160 @@ $utopia->get('/v1/account/security') } ); +$utopia->post('/v1/account') + ->desc('Create a new account') + ->label('webhook', 'account.create') + ->label('scope', 'auth') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'createAccount') + ->label('sdk.description', '/docs/references/auth/register.md') + ->label('abuse-limit', 10) + ->param('email', '', function () { return new Email(); }, 'Account email') + ->param('password', '', function () { return new Password(); }, 'User password') + ->param('confirm', '', function () use ($clients) { return new Host($clients); }, 'Confirmation URL to redirect user after confirm token has been sent to user email') // TODO add our own built-in confirm page + ->param('name', '', function () { return new Text(100); }, 'User name', true) + ->action( + function ($email, $password, $confirm, $name) use ($request, $response, $register, $audit, $projectDB, $project, $webhook) { + if ('console' === $project->getUid()) { + $whitlistEmails = $project->getAttribute('authWhitelistEmails'); + $whitlistIPs = $project->getAttribute('authWhitelistIPs'); + $whitlistDomains = $project->getAttribute('authWhitelistDomains'); + + if (!empty($whitlistEmails) && !in_array($email, $whitlistEmails)) { + throw new Exception('Console registration is restricted to specific emails. Contact your administrator for more information.', 401); + } + + if (!empty($whitlistIPs) && !in_array($request->getIP(), $whitlistIPs)) { + throw new Exception('Console registration is restricted to specific IPs. Contact your administrator for more information.', 401); + } + + if (!empty($whitlistDomains) && !in_array(substr(strrchr($email, '@'), 1), $whitlistDomains)) { + throw new Exception('Console registration is restricted to specific domains. Contact your administrator for more information.', 401); + } + } + + $profile = $projectDB->getCollection([ // Get user by email address + 'limit' => 1, + 'first' => true, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + 'email='.$email, + ], + ]); + + if (!empty($profile)) { + throw new Exception('Account already exists', 409); + } + + $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; + $confirmSecret = Auth::tokenGenerator(); + $loginSecret = Auth::tokenGenerator(); + + Authorization::disable(); + + $user = $projectDB->createDocument([ + '$collection' => Database::SYSTEM_COLLECTION_USERS, + '$permissions' => [ + 'read' => ['*'], + 'write' => ['user:{self}'], + ], + 'email' => $email, + 'status' => Auth::USER_STATUS_UNACTIVATED, + 'password' => Auth::passwordHash($password), + 'password-update' => time(), + 'registration' => time(), + 'confirm' => false, + 'reset' => false, + 'name' => $name, + ]); + + Authorization::enable(); + + if (false === $user) { + throw new Exception('Failed saving user to DB', 500); + } + + Authorization::setRole('user:'.$user->getUid()); + + $user + ->setAttribute('tokens', new Document([ + '$collection' => Database::SYSTEM_COLLECTION_TOKENS, + '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], + 'type' => Auth::TOKEN_TYPE_CONFIRM, + 'secret' => Auth::hash($confirmSecret), // On way hash encryption to protect DB leak + 'expire' => time() + Auth::TOKEN_EXPIRATION_CONFIRM, + 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), + 'ip' => $request->getIP(), + ]), Document::SET_TYPE_APPEND) + ->setAttribute('tokens', new Document([ + '$collection' => Database::SYSTEM_COLLECTION_TOKENS, + '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], + 'type' => Auth::TOKEN_TYPE_LOGIN, + 'secret' => Auth::hash($loginSecret), // On way hash encryption to protect DB leak + 'expire' => $expiry, + 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), + 'ip' => $request->getIP(), + ]), Document::SET_TYPE_APPEND) + ; + + $user = $projectDB->createDocument($user->getArrayCopy()); + + if (false === $user) { + throw new Exception('Failed saving tokens to DB', 500); + } + + // Send email address confirmation email + + $confirm = Template::parseURL($confirm); + $confirm['query'] = Template::mergeQuery(((isset($confirm['query'])) ? $confirm['query'] : ''), ['userId' => $user->getUid(), 'token' => $confirmSecret]); + $confirm = Template::unParseURL($confirm); + + $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.confirm.body')); + $body + ->setParam('{{direction}}', Locale::getText('settings.direction')) + ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) + ->setParam('{{name}}', $name) + ->setParam('{{redirect}}', $confirm) + ; + + $mail = $register->get('smtp'); /* @var $mail \PHPMailer\PHPMailer\PHPMailer */ + + $mail->addAddress($email, $name); + + $mail->Subject = Locale::getText('auth.emails.confirm.title'); + $mail->Body = $body->render(); + $mail->AltBody = strip_tags($body->render()); + + try { + $mail->send(); + } catch (\Exception $error) { + // if($failure) { + // $response->redirect($failure); + // return; + // } + + // throw new Exception('Problem sending mail: ' . $error->getMessage(), 500); + } + + $webhook + ->setParam('payload', [ + 'name' => $name, + 'email' => $email, + ]) + ; + + $audit + ->setParam('userId', $user->getUid()) + ->setParam('event', 'account.create') + ; + + $response + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $loginSecret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + + $response->json(array('result' => 'success')); + } + ); + $utopia->patch('/v1/account/name') ->desc('Update Account Name') ->label('webhook', 'account.update-name') From d28bd96167fca6c434cc2732b68edc4b855f04b2 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 3 Jan 2020 23:01:09 +0200 Subject: [PATCH 019/237] New public error code --- app/app.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/app.php b/app/app.php index 1197cb9be6..7d1116fa27 100644 --- a/app/app.php +++ b/app/app.php @@ -241,6 +241,7 @@ $utopia->error(function ($error /* @var $error Exception */) use ($request, $res case 402: // Error allowed publicly case 403: // Error allowed publicly case 404: // Error allowed publicly + case 409: // Error allowed publicly case 412: // Error allowed publicly case 429: // Error allowed publicly $code = $error->getCode(); From 3fefd2e7647feb00b7e0419eabdc7ef85cac79bc Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 3 Jan 2020 23:01:23 +0200 Subject: [PATCH 020/237] Removed unused namespace --- app/controllers/shared/api.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index cfe9f89415..f9a966b4a4 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -3,7 +3,6 @@ use Utopia\Exception; use Utopia\Abuse\Abuse; use Utopia\Abuse\Adapters\TimeLimit; -use Database\Database; global $utopia, $request, $response, $register, $user, $project; From eff4c940668670b302ca4d7339a43f2ec5be4277 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 3 Jan 2020 23:16:26 +0200 Subject: [PATCH 021/237] Added empty graphql controller --- app/config/services.php | 7 +++++++ app/controllers/api/graphql.php | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 app/controllers/api/graphql.php diff --git a/app/config/services.php b/app/config/services.php index 99790bd45f..01de0c0985 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -117,4 +117,11 @@ return [ 'sdk' => true, 'tests' => false, ], + 'v1/graphql' => [ + 'name' => 'GraphQL', + 'description' => 'GraphQL Endpoint', + 'controller' => 'controllers/api/graphql.php', + 'sdk' => false, + 'tests' => false, + ], ]; diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php new file mode 100644 index 0000000000..c550a3219b --- /dev/null +++ b/app/controllers/api/graphql.php @@ -0,0 +1,22 @@ +post('/v1/graphql') + ->desc('GraphQL Endpoint') + ->label('scope', 'public') + ->action( + function () { + throw new Exception('Method not supported yet', 500); + } + ); From 128ae4239c00d963f840a5fa956c641f0a401097 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 4 Jan 2020 09:44:03 +0200 Subject: [PATCH 022/237] Updated docs --- app/controllers/api/account.php | 26 +++++++++++++------------- app/controllers/api/graphql.php | 2 +- docs/services/account.md | 6 +++--- docs/services/auth.md | 3 --- docs/services/avatars.md | 4 ++-- docs/services/storage.md | 6 +++--- docs/services/teams.md | 2 +- docs/services/users.md | 2 +- 8 files changed, 24 insertions(+), 27 deletions(-) delete mode 100644 docs/services/auth.md diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 401344a821..60f483c3ae 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -29,7 +29,7 @@ $utopia->get('/v1/account') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccount') - ->label('sdk.description', '/docs/references/account/get.md') + ->label('sdk.description', '/docs/references/account/get-account.md') ->action( function () use ($response, &$user, $providers) { $oauthKeys = []; @@ -61,7 +61,7 @@ $utopia->get('/v1/account/prefs') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountPrefs') - ->label('sdk.description', '/docs/references/account/get-prefs.md') + ->label('sdk.description', '/docs/references/account/get-account-prefs.md') ->action( function () use ($response, $user) { $prefs = $user->getAttribute('prefs', '{}'); @@ -85,7 +85,7 @@ $utopia->get('/v1/account/sessions') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountSessions') - ->label('sdk.description', '/docs/references/account/get-sessions.md') + ->label('sdk.description', '/docs/references/account/get-account-sessions.md') ->action( function () use ($response, $user) { $tokens = $user->getAttribute('tokens', []); @@ -137,12 +137,12 @@ $utopia->get('/v1/account/sessions') } ); -$utopia->get('/v1/account/security') +$utopia->get('/v1/account/logs') ->desc('Get Account Security Log') ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'getAccountSecurity') - ->label('sdk.description', '/docs/references/account/get-security.md') + ->label('sdk.method', 'getAccountLogs') + ->label('sdk.description', '/docs/references/account/get-account-logs.md') ->action( function () use ($response, $register, $project, $user) { $adapter = new AuditAdapter($register->get('db')); @@ -212,7 +212,7 @@ $utopia->post('/v1/account') ->label('scope', 'auth') ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccount') - ->label('sdk.description', '/docs/references/auth/register.md') + ->label('sdk.description', '/docs/references/account/create-account.md') ->label('abuse-limit', 10) ->param('email', '', function () { return new Email(); }, 'Account email') ->param('password', '', function () { return new Password(); }, 'User password') @@ -362,11 +362,11 @@ $utopia->post('/v1/account') $utopia->patch('/v1/account/name') ->desc('Update Account Name') - ->label('webhook', 'account.update-name') + ->label('webhook', 'account.update-account-name') ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'updateName') - ->label('sdk.description', '/docs/references/account/update-name.md') + ->label('sdk.method', 'updateAccountName') + ->label('sdk.description', '/docs/references/account/update-account-name.md') ->param('name', '', function () { return new Text(100); }, 'User name') ->action( function ($name) use ($response, $user, $projectDB, $audit) { @@ -386,11 +386,11 @@ $utopia->patch('/v1/account/name') $utopia->patch('/v1/account/password') ->desc('Update Account Password') - ->label('webhook', 'account.update-password') + ->label('webhook', 'account.update-account-password') ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'updatePassword') - ->label('sdk.description', '/docs/references/account/update-password.md') + ->label('sdk.method', 'updateAccountPassword') + ->label('sdk.description', '/docs/references/account/update-account-password.md') ->param('password', '', function () { return new Password(); }, 'New password') ->param('old-password', '', function () { return new Password(); }, 'Old password') ->action( diff --git a/app/controllers/api/graphql.php b/app/controllers/api/graphql.php index c550a3219b..ce39d8e799 100644 --- a/app/controllers/api/graphql.php +++ b/app/controllers/api/graphql.php @@ -17,6 +17,6 @@ $utopia->post('/v1/graphql') ->label('scope', 'public') ->action( function () { - throw new Exception('Method not supported yet', 500); + throw new Exception('GraphQL support is coming soon!', 502); } ); diff --git a/docs/services/account.md b/docs/services/account.md index 54985c7de0..366591e35f 100644 --- a/docs/services/account.md +++ b/docs/services/account.md @@ -1,5 +1,5 @@ -The account service allows you to fetch and update information related to the currently logged-in user. You can use the service to retrieve a list of all the user sessions across different devices and a security log with the recent account activity. +The account service allows you to authenticate and manage a user account. You can use the account service to update user information, retrieve the user sessions across different devices, and fetch the user security logs with his or her recent activity. -Using the account service, you can also allow the logged-in user to update his account name, email, or passwords. +You can authenticate the user account by using multiple sign-in methods available. Once the user is authenticated, a new session object will be created to allow the user to access his or her private data and settings. -This service also exposes an endpoint to save and read [user preferences](/docs/account#updatePrefs) as a key-value object. This feature is handy if you want to allow extra customization in your app. Common usage for this feature may include saving the user preferred locale, timezone, or custom app theme. The usage of this feature is only limited only by your imagination. \ No newline at end of file +This service also exposes an endpoint to save and read the [user preferences](/docs/account#updatePrefs) as a key-value object. This feature is handy if you want to allow extra customization in your app. Common usage for this feature may include saving the user preferred locale, timezone, or custom app theme. The usage of this feature is only limited only by your imagination. \ No newline at end of file diff --git a/docs/services/auth.md b/docs/services/auth.md deleted file mode 100644 index 8e18022b27..0000000000 --- a/docs/services/auth.md +++ /dev/null @@ -1,3 +0,0 @@ -The authentication service allows you to verify users' accounts using basic email and password login or with a supported OAuth provider. The auth service also exposes methods to confirm users' email account and recover users forgotten passwords. - -You can review and enable our currently available OAuth providers from your project console under the **'users -> providers'** menu. \ No newline at end of file diff --git a/docs/services/avatars.md b/docs/services/avatars.md index e0ed2ebbca..81966f1574 100644 --- a/docs/services/avatars.md +++ b/docs/services/avatars.md @@ -1,5 +1,5 @@ -The avatars service aims to help you complete everyday tasks related to your app images, icons, and avatars. Using this service, we hope to save you some precious time and help you focus on solving your real app challenges. +The avatars service aims to help you complete everyday tasks related to your app image, icons, and avatars. Using this service, we hope to save you some precious time and help you focus on solving your real app challenges. -The Avatars service allows you to fetch countries' flags, browser icons, payment methods logos, websites favicons, generate QR codes, and manipulate remote images URLs. +The Avatars service allows you to fetch countries' flags, browser icons, payment methods logos, remote websites favicons, generate QR codes, and manipulate remote images URLs. All endpoints in this service allow you to resize, crop, and change the output image quality to best fit in your app both in terms of look and performance. \ No newline at end of file diff --git a/docs/services/storage.md b/docs/services/storage.md index 8227154638..0de9eb8914 100644 --- a/docs/services/storage.md +++ b/docs/services/storage.md @@ -1,5 +1,5 @@ -The storage service allows you to manage your project files. You can upload, view, download, and query your files and media. +The Storage service allows you to manage your project files. Using the Storage service, you can upload, view, download, and query all your project files. -Each file is granted read and write permissions to manage who has access to view or manage it. You can also learn more about how to manage your [resources permissions](/docs/permissions). +Each file in the service is granted with read and write permissions to manage who has access to view or edit it. You can also learn more about how to manage your [resources permissions](/docs/permissions). - You can also use the storage service file preview endpoint to show the app users' preview images of your files. The preview endpoint also allows you to manipulate the resulting image so that it will fit perfectly inside your app in terms of size and style. \ No newline at end of file +The preview endpoint allows you to generate preview images for your files. Using the preview endpoint, you can also manipulate the resulting image so that it will fit perfectly inside your app in terms of dimensions, file size, and style. The preview endpoint also allows you to change the resulting image file format for better compression or image quality for better delivery over the network. \ No newline at end of file diff --git a/docs/services/teams.md b/docs/services/teams.md index 729975a027..90e670eb5e 100644 --- a/docs/services/teams.md +++ b/docs/services/teams.md @@ -1,3 +1,3 @@ -The teams' service allows you to group users of your project and will enable them to share read and write access to your project resources, such as database documents or storage files. +The Teams service allows you to group users of your project and to enable them to share read and write access to your project resources, such as database documents or storage files. Each user who creates a team becomes the team owner and can delegate the ownership role by inviting a new team member. Only team owners can invite new users to their team. \ No newline at end of file diff --git a/docs/services/users.md b/docs/services/users.md index c3dba6dbec..2d38476e1a 100644 --- a/docs/services/users.md +++ b/docs/services/users.md @@ -1 +1 @@ -The users' service allows you to manage your users in admin mode (AKA server-side integration). Use this service to search, block, and view your Users info, current sessions, and latest activities. You can also use the Users service to edit your users' preferences and personal info. \ No newline at end of file +The users' service allows you to manage your project users. Use this service to search, block, and view your users' info, current sessions, and latest activity logs. You can also use the Users service to edit your users' preferences and personal info. \ No newline at end of file From a9abf52da9eb04310262fdd01a05c2fee0aa0655 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 4 Jan 2020 17:45:28 +0200 Subject: [PATCH 023/237] Added webhooks event and audit logs for resources --- app/controllers/api/account.php | 127 +++++++++++++++++++------------ app/controllers/api/database.php | 47 +++++++++--- app/controllers/api/storage.php | 34 +++++++-- 3 files changed, 141 insertions(+), 67 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 60f483c3ae..6404b41188 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -48,7 +48,6 @@ $utopia->get('/v1/account') '$uid', 'email', 'registration', - 'confirm', 'name', ], $oauthKeys @@ -216,10 +215,9 @@ $utopia->post('/v1/account') ->label('abuse-limit', 10) ->param('email', '', function () { return new Email(); }, 'Account email') ->param('password', '', function () { return new Password(); }, 'User password') - ->param('confirm', '', function () use ($clients) { return new Host($clients); }, 'Confirmation URL to redirect user after confirm token has been sent to user email') // TODO add our own built-in confirm page ->param('name', '', function () { return new Text(100); }, 'User name', true) ->action( - function ($email, $password, $confirm, $name) use ($request, $response, $register, $audit, $projectDB, $project, $webhook) { + function ($email, $password, $name) use ($request, $response, $audit, $projectDB, $project, $webhook) { if ('console' === $project->getUid()) { $whitlistEmails = $project->getAttribute('authWhitelistEmails'); $whitlistIPs = $project->getAttribute('authWhitelistIPs'); @@ -252,7 +250,6 @@ $utopia->post('/v1/account') } $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; - $confirmSecret = Auth::tokenGenerator(); $loginSecret = Auth::tokenGenerator(); Authorization::disable(); @@ -282,15 +279,6 @@ $utopia->post('/v1/account') Authorization::setRole('user:'.$user->getUid()); $user - ->setAttribute('tokens', new Document([ - '$collection' => Database::SYSTEM_COLLECTION_TOKENS, - '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], - 'type' => Auth::TOKEN_TYPE_CONFIRM, - 'secret' => Auth::hash($confirmSecret), // On way hash encryption to protect DB leak - 'expire' => time() + Auth::TOKEN_EXPIRATION_CONFIRM, - 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), - 'ip' => $request->getIP(), - ]), Document::SET_TYPE_APPEND) ->setAttribute('tokens', new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], @@ -308,39 +296,6 @@ $utopia->post('/v1/account') throw new Exception('Failed saving tokens to DB', 500); } - // Send email address confirmation email - - $confirm = Template::parseURL($confirm); - $confirm['query'] = Template::mergeQuery(((isset($confirm['query'])) ? $confirm['query'] : ''), ['userId' => $user->getUid(), 'token' => $confirmSecret]); - $confirm = Template::unParseURL($confirm); - - $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.confirm.body')); - $body - ->setParam('{{direction}}', Locale::getText('settings.direction')) - ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) - ->setParam('{{name}}', $name) - ->setParam('{{redirect}}', $confirm) - ; - - $mail = $register->get('smtp'); /* @var $mail \PHPMailer\PHPMailer\PHPMailer */ - - $mail->addAddress($email, $name); - - $mail->Subject = Locale::getText('auth.emails.confirm.title'); - $mail->Body = $body->render(); - $mail->AltBody = strip_tags($body->render()); - - try { - $mail->send(); - } catch (\Exception $error) { - // if($failure) { - // $response->redirect($failure); - // return; - // } - - // throw new Exception('Problem sending mail: ' . $error->getMessage(), 500); - } - $webhook ->setParam('payload', [ 'name' => $name, @@ -360,9 +315,81 @@ $utopia->post('/v1/account') } ); +$utopia->post('/v1/account/sessions') + ->desc('Login') + ->label('webhook', 'account.sessions.create') + ->label('scope', 'account') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'createAccountSession') + ->label('sdk.description', '/docs/references/account/create-account-session.md') + ->label('abuse-limit', 10) + ->label('abuse-key', 'url:{url},email:{param-email}') + ->param('email', '', function () { return new Email(); }, 'User account email address') + ->param('password', '', function () { return new Password(); }, 'User account password') + ->action( + function ($email, $password) use ($response, $request, $projectDB, $audit, $webhook) { + $profile = $projectDB->getCollection([ // Get user by email address + 'limit' => 1, + 'first' => true, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + 'email='.$email, + ], + ]); + + if (!$profile || !Auth::passwordVerify($password, $profile->getAttribute('password'))) { + $audit + //->setParam('userId', $profile->getUid()) + ->setParam('event', 'auth.failure') + ; + + throw new Exception('Invalid credentials', 401); // Wrong password or username + } + + $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; + $secret = Auth::tokenGenerator(); + + $profile->setAttribute('tokens', new Document([ + '$collection' => Database::SYSTEM_COLLECTION_TOKENS, + '$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]], + 'type' => Auth::TOKEN_TYPE_LOGIN, + 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak + 'expire' => $expiry, + 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), + 'ip' => $request->getIP(), + ]), Document::SET_TYPE_APPEND); + + Authorization::setRole('user:'.$profile->getUid()); + + $profile = $projectDB->updateDocument($profile->getArrayCopy()); + + if (false === $profile) { + throw new Exception('Failed saving user to DB', 500); + } + + $webhook + ->setParam('payload', [ + 'name' => $profile->getAttribute('name', ''), + 'email' => $profile->getAttribute('email', ''), + ]) + ; + + $audit + ->setParam('userId', $profile->getUid()) + ->setParam('event', 'auth.login') + ; + + $response + ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + + $response + ->json(array('result' => 'success')); + } + ); + $utopia->patch('/v1/account/name') ->desc('Update Account Name') - ->label('webhook', 'account.update-account-name') + ->label('webhook', 'account.update.name') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateAccountName') @@ -386,7 +413,7 @@ $utopia->patch('/v1/account/name') $utopia->patch('/v1/account/password') ->desc('Update Account Password') - ->label('webhook', 'account.update-account-password') + ->label('webhook', 'account.update.password') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateAccountPassword') @@ -415,7 +442,7 @@ $utopia->patch('/v1/account/password') $utopia->patch('/v1/account/email') ->desc('Update Account Email') - ->label('webhook', 'account.update-email') + ->label('webhook', 'account.update.email') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateEmail') @@ -459,7 +486,7 @@ $utopia->patch('/v1/account/email') $utopia->patch('/v1/account/prefs') ->desc('Update Account Prefs') - ->label('webhook', 'account') + ->label('webhook', 'account.update.prefs') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePrefs') diff --git a/app/controllers/api/database.php b/app/controllers/api/database.php index 62f7ef5fff..db42b6d473 100644 --- a/app/controllers/api/database.php +++ b/app/controllers/api/database.php @@ -160,6 +160,7 @@ $utopia->post('/v1/database') $utopia->put('/v1/database/:collectionId') ->desc('Update Collection') ->label('scope', 'collections.write') + ->label('webhook', 'database.collections.update') ->label('sdk.namespace', 'database') ->label('sdk.method', 'updateCollection') ->label('sdk.description', '/docs/references/database/update-collection.md') @@ -169,7 +170,7 @@ $utopia->put('/v1/database/:collectionId') ->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.') ->param('rules', [], function () use ($projectDB) { return new ArrayList(new Collection($projectDB, [Database::SYSTEM_COLLECTION_RULES], ['$collection' => Database::SYSTEM_COLLECTION_RULES, '$permissions' => ['read' => [], 'write' => []]])); }, 'Array of [rule objects](/docs/rules). Each rule define a collection field name, data type and validation', true) ->action( - function ($collectionId, $name, $read, $write, $rules) use ($response, $projectDB) { + function ($collectionId, $name, $read, $write, $rules) use ($response, $projectDB, $webhook, $audit) { $collection = $projectDB->getDocument($collectionId, false); if (empty($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { @@ -203,6 +204,18 @@ $utopia->put('/v1/database/:collectionId') throw new Exception('Failed saving collection to DB', 500); } + $data = $collection->getArrayCopy(); + + $webhook + ->setParam('payload', $data) + ; + + $audit + ->setParam('event', 'database.collections.update') + ->setParam('resource', 'database/collections/'.$data['$uid']) + ->setParam('data', $data) + ; + $response->json($collection->getArrayCopy()); } ); @@ -210,12 +223,13 @@ $utopia->put('/v1/database/:collectionId') $utopia->delete('/v1/database/:collectionId') ->desc('Delete Collection') ->label('scope', 'collections.write') + ->label('webhook', 'database.collections.delete') ->label('sdk.namespace', 'database') ->label('sdk.method', 'deleteCollection') ->label('sdk.description', '/docs/references/database/delete-collection.md') ->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.') ->action( - function ($collectionId) use ($response, $projectDB, $audit) { + function ($collectionId) use ($response, $projectDB, $webhook, $audit) { $collection = $projectDB->getDocument($collectionId, false); if (empty($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { @@ -225,11 +239,17 @@ $utopia->delete('/v1/database/:collectionId') if (!$projectDB->deleteDocument($collectionId)) { throw new Exception('Failed to remove collection from DB', 500); } + + $data = $collection->getArrayCopy(); + + $webhook + ->setParam('payload', $data) + ; $audit - ->setParam('event', 'database.collections.create') - ->setParam('resource', 'database/collection/'.$collection->getUid()) - ->setParam('data', $collection->getArrayCopy()) // Audit document in case of malicious or disastrous action + ->setParam('event', 'database.collections.delete') + ->setParam('resource', 'database/collections/'.$data['$uid']) + ->setParam('data', $data) ; $response->noContent(); @@ -454,7 +474,7 @@ $utopia->post('/v1/database/:collectionId/documents') $utopia->patch('/v1/database/:collectionId/documents/:documentId') ->desc('Update Document') - ->label('webhook', 'database.documents.patch') + ->label('webhook', 'database.documents.update') ->label('scope', 'documents.write') ->label('sdk.namespace', 'database') ->label('sdk.method', 'updateDocument') @@ -518,7 +538,7 @@ $utopia->patch('/v1/database/:collectionId/documents/:documentId') ; $audit - ->setParam('event', 'database.documents.patch') + ->setParam('event', 'database.documents.update') ->setParam('resource', 'database/document/'.$data['$uid']) ->setParam('data', $data) ; @@ -533,13 +553,14 @@ $utopia->patch('/v1/database/:collectionId/documents/:documentId') $utopia->delete('/v1/database/:collectionId/documents/:documentId') ->desc('Delete Document') ->label('scope', 'documents.write') + ->label('webhook', 'database.documents.delete') ->label('sdk.namespace', 'database') ->label('sdk.method', 'deleteDocument') ->label('sdk.description', '/docs/references/database/delete-document.md') ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID') ->param('documentId', null, function () { return new UID(); }, 'Document unique ID') ->action( - function ($collectionId, $documentId) use ($response, $projectDB, $audit, $isDev) { + function ($collectionId, $documentId) use ($response, $projectDB, $audit, $webhook, $isDev) { $collection = $projectDB->getDocument($collectionId, $isDev); $document = $projectDB->getDocument($documentId, $isDev); @@ -561,10 +582,16 @@ $utopia->delete('/v1/database/:collectionId/documents/:documentId') throw new Exception('Failed to remove document from DB', 500); } + $data = $document->getArrayCopy(); + + $webhook + ->setParam('payload', $data) + ; + $audit ->setParam('event', 'database.documents.delete') - ->setParam('resource', 'database/document/'.$documentId) - ->setParam('data', $document->getArrayCopy()) // Audit document in case of malicious or disastrous action + ->setParam('resource', 'database/document/'.$data['$uid']) + ->setParam('data', $data) // Audit document in case of malicious or disastrous action ; $response->noContent(); diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 793767f3f9..911e58b649 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -398,6 +398,7 @@ $utopia->get('/v1/storage/files/:fileId/view') $utopia->post('/v1/storage/files') ->desc('Create File') ->label('scope', 'files.write') + ->label('webhook', 'storage.files.create') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'createFile') ->label('sdk.description', '/docs/references/storage/create-file.md') @@ -407,7 +408,7 @@ $utopia->post('/v1/storage/files') ->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.') // ->param('folderId', '', function () { return new UID(); }, 'Folder to associate files with.', true) ->action( - function ($files, $read, $write, $folderId = '') use ($request, $response, $user, $projectDB, $audit, $usage) { + function ($files, $read, $write, $folderId = '') use ($request, $response, $user, $projectDB, $webhook, $audit, $usage) { $files = $request->getFiles('files'); $read = (empty($read)) ? ['user:'.$user->getUid()] : $read; $write = (empty($write)) ? ['user:'.$user->getUid()] : $write; @@ -513,9 +514,13 @@ $utopia->post('/v1/storage/files') throw new Exception('Failed saving file to DB', 500); } + $webhook + ->setParam('payload', $file->getArrayCopy()) + ; + $audit - ->setParam('event', 'storage.upload') - ->setParam('resource', 'storage/file/'.$file->getUid()) + ->setParam('event', 'storage.files.create') + ->setParam('resource', 'storage/files/'.$file->getUid()) ; $usage @@ -535,6 +540,7 @@ $utopia->post('/v1/storage/files') $utopia->put('/v1/storage/files/:fileId') ->desc('Update File') ->label('scope', 'files.write') + ->label('webhook', 'storage.files.update') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'updateFile') ->label('sdk.description', '/docs/references/storage/update-file.md') @@ -543,7 +549,7 @@ $utopia->put('/v1/storage/files/:fileId') ->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.') //->param('folderId', '', function () { return new UID(); }, 'Folder to associate files with.', true) ->action( - function ($fileId, $read, $write, $folderId = '') use ($response, $projectDB) { + function ($fileId, $read, $write, $folderId = '') use ($response, $projectDB, $audit, $webhook) { $file = $projectDB->getDocument($fileId); if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { @@ -562,6 +568,15 @@ $utopia->put('/v1/storage/files/:fileId') throw new Exception('Failed saving file to DB', 500); } + $webhook + ->setParam('payload', $file->getArrayCopy()) + ; + + $audit + ->setParam('event', 'storage.files.update') + ->setParam('resource', 'storage/files/'.$file->getUid()) + ; + $response->json($file->getArrayCopy()); } ); @@ -569,12 +584,13 @@ $utopia->put('/v1/storage/files/:fileId') $utopia->delete('/v1/storage/files/:fileId') ->desc('Delete File') ->label('scope', 'files.write') + ->label('webhook', 'storage.files.delete') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'deleteFile') ->label('sdk.description', '/docs/references/storage/delete-file.md') ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->action( - function ($fileId) use ($response, $projectDB, $audit, $usage) { + function ($fileId) use ($response, $projectDB, $webhook, $audit, $usage) { $file = $projectDB->getDocument($fileId); if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { @@ -589,9 +605,13 @@ $utopia->delete('/v1/storage/files/:fileId') } } + $webhook + ->setParam('payload', $file->getArrayCopy()) + ; + $audit - ->setParam('event', 'storage.delete') - ->setParam('resource', 'storage/file/'.$file->getUid()) + ->setParam('event', 'storage.files.delete') + ->setParam('resource', 'storage/files/'.$file->getUid()) ; $usage From aa391df411f88fef06cc5b7b576c6ce75cc7e7a9 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 4 Jan 2020 17:45:45 +0200 Subject: [PATCH 024/237] Fixed param error --- app/controllers/web/console.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/web/console.php b/app/controllers/web/console.php index 8470e5ba7d..a91cff9093 100644 --- a/app/controllers/web/console.php +++ b/app/controllers/web/console.php @@ -2,7 +2,7 @@ include_once __DIR__ . '/../shared/web.php'; -global $utopia, $response, $request, $layout, $version, $providers; +global $utopia, $response, $request, $layout, $version, $providers, $projectDB; use Utopia\View; use Database\Database; From cdbe1d4bc02c20d2ab7152f3df11f0e7b697d094 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 4 Jan 2020 17:45:59 +0200 Subject: [PATCH 025/237] Updated webhooks event list --- CHANGES.md | 2 + app/app.php | 67 +++++++++++++++++++++++- app/config/services.php | 71 +++++++++++++------------- app/views/console/webhooks/index.phtml | 25 ++++++--- 4 files changed, 120 insertions(+), 45 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 769e87c6b7..e1bedb5124 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,8 @@ * Update docs example with auth info * Allow non-web platform skip origin header * Limited to console UI to show max 5 alerts at the same time +* Added new webhooks events +* Normnailized all webhooks event names ## Bug Fixes diff --git a/app/app.php b/app/app.php index 7d1116fa27..f6e46bbaae 100644 --- a/app/app.php +++ b/app/app.php @@ -410,7 +410,7 @@ $utopia->get('/v1/proxy') } ); -$utopia->get('/v1/open-api-2.json') + $utopia->get('/v1/open-api-2.json') ->label('scope', 'public') ->label('docs', false) ->param('platform', 'client', function () {return new WhiteList(['client', 'server']);}, 'Choose target platform.', true) @@ -733,6 +733,71 @@ $utopia->get('/v1/open-api-2.json') } ); + +$utopia->get('/v1/debug') + ->label('scope', 'public') + ->label('docs', false) + ->action( + function () use ($response, $request, $utopia, $domain, $services) { + $output = [ + 'webhooks' => [], + 'methods' => [], + 'routes' => [], + ]; + + foreach ($services as $service) { /* @noinspection PhpIncludeInspection */ + /** @noinspection PhpIncludeInspection */ + if($service['tests']) { + continue; + } + + include_once $service['controller']; + } + + $i = 0; + + foreach ($utopia->getRoutes() as $key => $method) { + foreach ($method as $route) { /* @var $route \Utopia\Route */ + if (!$route->getLabel('docs', true)) { + continue; + } + + if (empty($route->getLabel('sdk.namespace', null))) { + continue; + } + + if ($route->getLabel('webhook', false)) { + if(array_key_exists($route->getLabel('webhook', false), $output['webhooks'])) { + throw new Exception('Webhook ('.$route->getLabel('webhook', false).') is already in use by another route', 500); + } + + $output['webhooks'][$route->getLabel('webhook', false)] = $route->getMethod().' '.$route->getURL(); + } + + if ($route->getLabel('sdk.namespace', false)) { + $method = $route->getLabel('sdk.namespace', false).'->'.$route->getLabel('sdk.method', false).'()'; + if(array_key_exists($method, $output['methods'])) { + throw new Exception('Method ('.$method.') is already in use by another route', 500); + } + + $output['methods'][$method] = $route->getMethod().' '.$route->getURL(); + } + + $output['routes'][$route->getURL().' ('.$route->getMethod().')'] = []; + + $i++; + } + } + + ksort($output['webhooks']); + ksort($output['methods']); + ksort($output['routes']); + + $response + ->json($output); + } + ); + $name = APP_NAME; if (array_key_exists($service, $services)) { /** @noinspection PhpIncludeInspection */ diff --git a/app/config/services.php b/app/config/services.php index 01de0c0985..fd17e84811 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -20,13 +20,13 @@ return [ 'sdk' => true, 'tests' => false, ], - 'v1/auth' => [ // Add to docs later: You can also learn how to [configure support for our supported OAuth providers](/docs/oauth) - 'name' => 'Auth', - 'description' => '/docs/services/auth.md', - 'controller' => 'controllers/api/auth.php', - 'sdk' => true, - 'tests' => false, - ], + // 'v1/auth' => [ // Add to docs later: You can also learn how to [configure support for our supported OAuth providers](/docs/oauth) + // 'name' => 'Auth', + // 'description' => '/docs/services/auth.md', + // 'controller' => 'controllers/api/auth.php', + // 'sdk' => true, + // 'tests' => false, + // ], 'v1/avatars' => [ 'name' => 'Avatars', 'description' => '/docs/services/avatars.md', @@ -88,35 +88,34 @@ 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, - ], + // '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, + // ], 'v1/graphql' => [ 'name' => 'GraphQL', 'description' => 'GraphQL Endpoint', diff --git a/app/views/console/webhooks/index.phtml b/app/views/console/webhooks/index.phtml index 15443e90d2..0318b1b3aa 100644 --- a/app/views/console/webhooks/index.phtml +++ b/app/views/console/webhooks/index.phtml @@ -1,16 +1,25 @@ From 25c219f57eff5a03b8b803fcc24c11089a1b4c55 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 5 Jan 2020 13:28:44 +0200 Subject: [PATCH 026/237] Debugs and tests --- app/app.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/app.php b/app/app.php index f6e46bbaae..48de253cfc 100644 --- a/app/app.php +++ b/app/app.php @@ -743,6 +743,7 @@ $utopia->get('/v1/debug') 'webhooks' => [], 'methods' => [], 'routes' => [], + 'docs' => [], ]; foreach ($services as $service) { /* @noinspection PhpIncludeInspection */ @@ -766,9 +767,17 @@ $utopia->get('/v1/debug') continue; } + if ($route->getLabel('sdk.description', false)) { + if(array_key_exists($route->getLabel('sdk.description', false), $output['docs'])) { + throw new Exception('Docs file ('.$route->getLabel('sdk.description', false).') is already in use by another route', 500); + } + + $output['docs'][$route->getLabel('sdk.description', false)] = $route->getMethod().' '.$route->getURL(); + } + if ($route->getLabel('webhook', false)) { if(array_key_exists($route->getLabel('webhook', false), $output['webhooks'])) { - throw new Exception('Webhook ('.$route->getLabel('webhook', false).') is already in use by another route', 500); + //throw new Exception('Webhook ('.$route->getLabel('webhook', false).') is already in use by another route', 500); } $output['webhooks'][$route->getLabel('webhook', false)] = $route->getMethod().' '.$route->getURL(); @@ -792,6 +801,7 @@ $utopia->get('/v1/debug') ksort($output['webhooks']); ksort($output['methods']); ksort($output['routes']); + ksort($output['docs']); $response ->json($output); From 426f65d2613684eae739895f2494fed9666e8a9f Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 5 Jan 2020 13:28:54 +0200 Subject: [PATCH 027/237] Fixed comments --- app/init.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/init.php b/app/init.php index 6e3198cab8..8ee73aae2b 100644 --- a/app/init.php +++ b/app/init.php @@ -38,8 +38,8 @@ $env = $request->getServer('_APP_ENV', App::ENV_TYPE_PRODUCTION); $domain = $request->getServer('HTTP_HOST', ''); $version = $request->getServer('_APP_VERSION', 'UNKNOWN'); $providers = include __DIR__.'/../app/config/providers.php'; // OAuth providers list -$locales = include __DIR__.'/../app/config/locales.php'; // OAuth providers list -$collections = include __DIR__.'/../app/config/collections.php'; // OAuth providers list +$locales = include __DIR__.'/../app/config/locales.php'; // Locales list +$collections = include __DIR__.'/../app/config/collections.php'; // Collections list $redisHost = $request->getServer('_APP_REDIS_HOST', ''); $redisPort = $request->getServer('_APP_REDIS_PORT', ''); $utopia = new App('Asia/Tel_Aviv', $env); From 07ee07f6e437707cd6cfb48ee1b393369d23d04a Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 5 Jan 2020 13:29:42 +0200 Subject: [PATCH 028/237] Deprecating auth service --- app/config/roles.php | 2 - app/config/services.php | 7 - app/controllers/api/account.php | 456 ++++++++++++++++-- app/views/console/users/index.phtml | 2 +- .../create-session-oauth.md} | 0 .../login.md => account/create-session.md} | 0 .../{auth/register.md => account/create.md} | 0 7 files changed, 412 insertions(+), 55 deletions(-) rename docs/references/{auth/login-oauth.md => account/create-session-oauth.md} (100%) rename docs/references/{auth/login.md => account/create-session.md} (100%) rename docs/references/{auth/register.md => account/create.md} (100%) diff --git a/app/config/roles.php b/app/config/roles.php index c68c52ca2f..9ea6b5eedf 100644 --- a/app/config/roles.php +++ b/app/config/roles.php @@ -13,7 +13,6 @@ $logged = [ 'public', 'home', 'console', - 'auth', 'account', 'teams.read', 'teams.write', @@ -50,7 +49,6 @@ return [ 'public', 'home', 'console', - 'auth', 'files.read', 'locale.read', 'avatars.read', diff --git a/app/config/services.php b/app/config/services.php index fd17e84811..2d9c5dd884 100644 --- a/app/config/services.php +++ b/app/config/services.php @@ -20,13 +20,6 @@ return [ 'sdk' => true, 'tests' => false, ], - // 'v1/auth' => [ // Add to docs later: You can also learn how to [configure support for our supported OAuth providers](/docs/oauth) - // 'name' => 'Auth', - // 'description' => '/docs/services/auth.md', - // 'controller' => 'controllers/api/auth.php', - // 'sdk' => true, - // 'tests' => false, - // ], 'v1/avatars' => [ 'name' => 'Avatars', 'description' => '/docs/services/avatars.md', diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 6404b41188..394952ebab 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -72,7 +72,7 @@ $utopia->get('/v1/account/prefs') try { $prefs = json_decode($prefs, true); } catch (\Exception $error) { - throw new Exception('Failed to parse prefs', 500); + throw new Exception('Failed to parse preferences', 500); } $response->json($prefs); @@ -80,7 +80,7 @@ $utopia->get('/v1/account/prefs') ); $utopia->get('/v1/account/sessions') - ->desc('Get Account Active Sessions') + ->desc('Get Account Sessions') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountSessions') @@ -137,7 +137,7 @@ $utopia->get('/v1/account/sessions') ); $utopia->get('/v1/account/logs') - ->desc('Get Account Security Log') + ->desc('Get Account Logs') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountLogs') @@ -150,20 +150,23 @@ $utopia->get('/v1/account/logs') $countries = Locale::getText('countries'); $logs = $audit->getLogsByUserAndActions($user->getUid(), [ - 'auth.register', - 'auth.confirm', - 'auth.login', - 'auth.logout', - 'auth.recovery', - 'auth.recovery.reset', - 'auth.oauth.login', - 'auth.invite', - 'auth.join', - 'auth.leave', + 'auth.register', // TODO Deprectate this + 'auth.login', // TODO Deprectate this + 'auth.logout', // TODO Deprectate this + 'auth.recovery', // TODO Deprectate this + 'auth.recovery.reset', // TODO Deprectate this + 'auth.oauth.login', // TODO Deprectate this + 'auth.invite', // TODO Deprectate this + 'auth.join', // TODO Deprectate this + 'auth.leave', // TODO Deprectate this + 'account.create', 'account.delete', 'account.update.name', 'account.update.email', 'account.update.password', + 'account.update.prefs', + 'account.sessions.create', + 'account.sessions.delete', ]); $reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb'); @@ -208,16 +211,16 @@ $utopia->get('/v1/account/logs') $utopia->post('/v1/account') ->desc('Create a new account') ->label('webhook', 'account.create') - ->label('scope', 'auth') + ->label('scope', 'public') ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccount') - ->label('sdk.description', '/docs/references/account/create-account.md') + ->label('sdk.description', '/docs/references/account/create.md') ->label('abuse-limit', 10) ->param('email', '', function () { return new Email(); }, 'Account email') ->param('password', '', function () { return new Password(); }, 'User password') ->param('name', '', function () { return new Text(100); }, 'User name', true) ->action( - function ($email, $password, $name) use ($request, $response, $audit, $projectDB, $project, $webhook) { + function ($email, $password, $name) use ($request, $response, $providers, $audit, $projectDB, $project, $webhook) { if ('console' === $project->getUid()) { $whitlistEmails = $project->getAttribute('authWhitelistEmails'); $whitlistIPs = $project->getAttribute('authWhitelistIPs'); @@ -249,9 +252,6 @@ $utopia->post('/v1/account') throw new Exception('Account already exists', 409); } - $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; - $loginSecret = Auth::tokenGenerator(); - Authorization::disable(); $user = $projectDB->createDocument([ @@ -278,18 +278,6 @@ $utopia->post('/v1/account') Authorization::setRole('user:'.$user->getUid()); - $user - ->setAttribute('tokens', new Document([ - '$collection' => Database::SYSTEM_COLLECTION_TOKENS, - '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], - 'type' => Auth::TOKEN_TYPE_LOGIN, - 'secret' => Auth::hash($loginSecret), // On way hash encryption to protect DB leak - 'expire' => $expiry, - 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), - 'ip' => $request->getIP(), - ]), Document::SET_TYPE_APPEND) - ; - $user = $projectDB->createDocument($user->getArrayCopy()); if (false === $user) { @@ -306,22 +294,39 @@ $utopia->post('/v1/account') $audit ->setParam('userId', $user->getUid()) ->setParam('event', 'account.create') + ->setParam('resource', 'users/'.$user->getUid()) ; - $response - ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $loginSecret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + $oauthKeys = []; - $response->json(array('result' => 'success')); + foreach ($providers as $key => $provider) { + if (!$provider['enabled']) { + continue; + } + + $oauthKeys[] = 'oauth'.ucfirst($key); + $oauthKeys[] = 'oauth'.ucfirst($key).'AccessToken'; + } + + $response->json(array_merge($user->getArrayCopy(array_merge( + [ + '$uid', + 'email', + 'registration', + 'name', + ], + $oauthKeys + )), ['roles' => Authorization::getRoles()])); } ); $utopia->post('/v1/account/sessions') - ->desc('Login') + ->desc('Create Account Session') ->label('webhook', 'account.sessions.create') - ->label('scope', 'account') + ->label('scope', 'public') ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccountSession') - ->label('sdk.description', '/docs/references/account/create-account-session.md') + ->label('sdk.description', '/docs/references/account/create-session.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},email:{param-email}') ->param('email', '', function () { return new Email(); }, 'User account email address') @@ -340,7 +345,8 @@ $utopia->post('/v1/account/sessions') if (!$profile || !Auth::passwordVerify($password, $profile->getAttribute('password'))) { $audit //->setParam('userId', $profile->getUid()) - ->setParam('event', 'auth.failure') + ->setParam('event', 'account.sesssions.failed') + ->setParam('resource', 'users/'.$profile->getUid()) ; throw new Exception('Invalid credentials', 401); // Wrong password or username @@ -376,7 +382,8 @@ $utopia->post('/v1/account/sessions') $audit ->setParam('userId', $profile->getUid()) - ->setParam('event', 'auth.login') + ->setParam('event', 'account.sesssions.create') + ->setParam('resource', 'users/'.$profile->getUid()) ; $response @@ -387,6 +394,234 @@ $utopia->post('/v1/account/sessions') } ); +$utopia->get('/v1/account/sessions/oauth/:provider') + ->desc('Create Account Session with OAuth') + ->label('error', __DIR__.'/../views/general/error.phtml') + ->label('scope', 'public') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'createAccountSessionOAuth') + ->label('sdk.description', '/docs/references/account/create-session-oauth.md') + ->label('sdk.location', true) + ->label('abuse-limit', 50) + ->label('abuse-key', 'ip:{ip}') + ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth Provider. Currently, supported providers are: ' . implode(', ', array_keys($providers))) + ->param('success', '', function () use ($clients) { return new Host($clients); }, 'URL to redirect back to your app after a successful login attempt.') + ->param('failure', '', function () use ($clients) { return new Host($clients); }, 'URL to redirect back to your app after a failed login attempt.') + ->action( + function ($provider, $success, $failure) use ($response, $request, $project) { + $callback = $request->getServer('REQUEST_SCHEME', 'https').'://'.$request->getServer('HTTP_HOST').'/v1/account/sessions/oauth/callback/'.$provider.'/'.$project->getUid(); + $appId = $project->getAttribute('usersOauth'.ucfirst($provider).'Appid', ''); + $appSecret = $project->getAttribute('usersOauth'.ucfirst($provider).'Secret', '{}'); + + $appSecret = json_decode($appSecret, true); + + if (!empty($appSecret) && isset($appSecret['version'])) { + $key = $request->getServer('_APP_OPENSSL_KEY_V'.$appSecret['version']); + $appSecret = OpenSSL::decrypt($appSecret['data'], $appSecret['method'], $key, 0, hex2bin($appSecret['iv']), hex2bin($appSecret['tag'])); + } + + if (empty($appId) || empty($appSecret)) { + throw new Exception('Provider is undefined, configure provider app ID and app secret key to continue', 412); + } + + $classname = 'Auth\\OAuth\\'.ucfirst($provider); + + if (!class_exists($classname)) { + throw new Exception('Provider is not supported', 501); + } + + $oauth = new $classname($appId, $appSecret, $callback, ['success' => $success, 'failure' => $failure]); + + $response->redirect($oauth->getLoginURL()); + } + ); + +$utopia->get('/v1/account/sessions/oauth/callback/:provider/:projectId') + ->desc('OAuth Callback') + ->label('error', __DIR__.'/../views/general/error.phtml') + ->label('scope', 'public') + ->label('abuse-limit', 50) + ->label('abuse-key', 'ip:{ip}') + ->label('docs', false) + ->param('projectId', '', function () { return new Text(1024); }, 'Project unique ID') + ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth provider') + ->param('code', '', function () { return new Text(1024); }, 'OAuth code') + ->param('state', '', function () { return new Text(2048); }, 'Login state params', true) + ->action( + function ($projectId, $provider, $code, $state) use ($response, $request, $domain) { + $response->redirect($request->getServer('REQUEST_SCHEME', 'https').'://'.$domain.'/v1/account/sessions/oauth/'.$provider.'/redirect?' + .http_build_query(['project' => $projectId, 'code' => $code, 'state' => $state])); + } + ); + +$utopia->get('/v1/account/sessions/oauth/:provider/redirect') + ->desc('OAuth Redirect') + ->label('error', __DIR__.'/../views/general/error.phtml') + ->label('webhook', 'account.sessions.create') + ->label('scope', 'public') + ->label('abuse-limit', 50) + ->label('abuse-key', 'ip:{ip}') + ->label('docs', false) + ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth provider') + ->param('code', '', function () { return new Text(1024); }, 'OAuth code') + ->param('state', '', function () { return new Text(2048); }, 'OAuth state params', true) + ->action( + function ($provider, $code, $state) use ($response, $request, $user, $projectDB, $project, $audit) { + $callback = $request->getServer('REQUEST_SCHEME', 'https').'://'.$request->getServer('HTTP_HOST').'/v1/account/sessions/oauth/callback/'.$provider.'/'.$project->getUid(); + $defaultState = ['success' => $project->getAttribute('url', ''), 'failure' => '']; + $validateURL = new URL(); + + $appId = $project->getAttribute('usersOauth'.ucfirst($provider).'Appid', ''); + $appSecret = $project->getAttribute('usersOauth'.ucfirst($provider).'Secret', '{}'); + + $appSecret = json_decode($appSecret, true); + + if (!empty($appSecret) && isset($appSecret['version'])) { + $key = $request->getServer('_APP_OPENSSL_KEY_V'.$appSecret['version']); + $appSecret = OpenSSL::decrypt($appSecret['data'], $appSecret['method'], $key, 0, hex2bin($appSecret['iv']), hex2bin($appSecret['tag'])); + } + + $classname = 'Auth\\OAuth\\'.ucfirst($provider); + + if (!class_exists($classname)) { + throw new Exception('Provider is not supported', 501); + } + + $oauth = new $classname($appId, $appSecret, $callback); + + if (!empty($state)) { + try { + $state = array_merge($defaultState, $oauth->parseState($state)); + } catch (\Exception $exception) { + throw new Exception('Failed to parse login state params as passed from OAuth provider'); + } + } else { + $state = $defaultState; + } + + if (!$validateURL->isValid($state['success'])) { + throw new Exception('Invalid redirect URL for success login', 400); + } + + if (!empty($state['failure']) && !$validateURL->isValid($state['failure'])) { + throw new Exception('Invalid redirect URL for failure login', 400); + } + + $accessToken = $oauth->getAccessToken($code); + + if (empty($accessToken)) { + if (!empty($state['failure'])) { + $response->redirect($state['failure'], 301, 0); + } + + throw new Exception('Failed to obtain access token'); + } + + $oauthID = $oauth->getUserID($accessToken); + + if (empty($oauthID)) { + if (!empty($state['failure'])) { + $response->redirect($state['failure'], 301, 0); + } + + throw new Exception('Missing ID from OAuth provider', 400); + } + + $current = Auth::tokenVerify($user->getAttribute('tokens', []), Auth::TOKEN_TYPE_LOGIN, Auth::$secret); + + if ($current) { + $projectDB->deleteDocument($current); //throw new Exception('User already logged in', 401); + } + + $user = (empty($user->getUid())) ? $projectDB->getCollection([ // Get user by provider id + 'limit' => 1, + 'first' => true, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + 'oauth'.ucfirst($provider).'='.$oauthID, + ], + ]) : $user; + + if (empty($user)) { // No user logged in or with oauth provider ID, create new one or connect with account with same email + $name = $oauth->getUserName($accessToken); + $email = $oauth->getUserEmail($accessToken); + + $user = $projectDB->getCollection([ // Get user by provider email address + 'limit' => 1, + 'first' => true, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + 'email='.$email, + ], + ]); + + if (!$user || empty($user->getUid())) { // Last option -> create user alone, generate random password + Authorization::disable(); + + $user = $projectDB->createDocument([ + '$collection' => Database::SYSTEM_COLLECTION_USERS, + '$permissions' => ['read' => ['*'], 'write' => ['user:{self}']], + 'email' => $email, + 'status' => Auth::USER_STATUS_ACTIVATED, // Email should already be authenticated by OAuth provider + 'password' => Auth::passwordHash(Auth::passwordGenerator()), + 'password-update' => time(), + 'registration' => time(), + 'confirm' => true, + 'reset' => false, + 'name' => $name, + ]); + + Authorization::enable(); + + if (false === $user) { + throw new Exception('Failed saving user to DB', 500); + } + } + } + + // Create login token, confirm user account and update OAuth ID and Access Token + + $secret = Auth::tokenGenerator(); + $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; + + $user + ->setAttribute('oauth'.ucfirst($provider), $oauthID) + ->setAttribute('oauth'.ucfirst($provider).'AccessToken', $accessToken) + ->setAttribute('status', Auth::USER_STATUS_ACTIVATED) + ->setAttribute('tokens', new Document([ + '$collection' => Database::SYSTEM_COLLECTION_TOKENS, + '$permissions' => ['read' => ['user:'.$user['$uid']], 'write' => ['user:'.$user['$uid']]], + 'type' => Auth::TOKEN_TYPE_LOGIN, + 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak + 'expire' => $expiry, + 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), + 'ip' => $request->getIP(), + ]), Document::SET_TYPE_APPEND) + ; + + Authorization::setRole('user:'.$user->getUid()); + + $user = $projectDB->updateDocument($user->getArrayCopy()); + + if (false === $user) { + throw new Exception('Failed saving user to DB', 500); + } + + $audit + ->setParam('userId', $user->getUid()) + ->setParam('event', 'account.sessions.create') + ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('data', ['provider' => $provider]) + ; + + $response + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ; + + $response->redirect($state['success']); + } + ); + $utopia->patch('/v1/account/name') ->desc('Update Account Name') ->label('webhook', 'account.update.name') @@ -405,7 +640,10 @@ $utopia->patch('/v1/account/name') throw new Exception('Failed saving user to DB', 500); } - $audit->setParam('event', 'account.update.name'); + $audit + ->setParam('event', 'account.update.name') + ->setParam('resource', 'users/'.$user->getUid()) + ; $response->json(array('result' => 'success')); } @@ -434,7 +672,10 @@ $utopia->patch('/v1/account/password') throw new Exception('Failed saving user to DB', 500); } - $audit->setParam('event', 'account.update.password'); + $audit + ->setParam('event', 'account.update.password') + ->setParam('resource', 'users/'.$user->getUid()) + ; $response->json(array('result' => 'success')); } @@ -478,14 +719,17 @@ $utopia->patch('/v1/account/email') throw new Exception('Failed saving user to DB', 500); } - $audit->setParam('event', 'account.update.email'); + $audit + ->setParam('event', 'account.update.email') + ->setParam('resource', 'users/'.$user->getUid()) + ; $response->json(array('result' => 'success')); } ); $utopia->patch('/v1/account/prefs') - ->desc('Update Account Prefs') + ->desc('Update Account Preferences') ->label('webhook', 'account.update.prefs') ->label('scope', 'account') ->label('sdk.namespace', 'account') @@ -502,7 +746,10 @@ $utopia->patch('/v1/account/prefs') throw new Exception('Failed saving user to DB', 500); } - $audit->setParam('event', 'account.update.prefs'); + $audit + ->setParam('event', 'account.update.prefs') + ->setParam('resource', 'users/'.$user->getUid()) + ; $response->json(array('result' => 'success')); } @@ -516,7 +763,7 @@ $utopia->delete('/v1/account') ->label('sdk.method', 'delete') ->label('sdk.description', '/docs/references/account/delete.md') ->action( - function () use ($response, $request, $user, $projectDB, $audit) { + function () use ($response, $request, $user, $projectDB, $audit, $webhook) { $user = $projectDB->updateDocument(array_merge($user->getArrayCopy(), [ 'status' => Auth::USER_STATUS_BLOCKED, ])); @@ -535,11 +782,130 @@ $utopia->delete('/v1/account') $audit ->setParam('event', 'account.delete') + ->setParam('resource', 'users/'.$user->getUid()) ->setParam('data', $user->getArrayCopy()) ; + $webhook + ->setParam('payload', [ + 'name' => $user->getAttribute('name', ''), + 'email' => $user->getAttribute('email', ''), + ]) + ; + $response ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->json(array('result' => 'success')); } ); + +$utopia->delete('/v1/account/sessions/current') + ->desc('Delete Current Account Session') + ->label('webhook', 'account.sessions.delete') + ->label('scope', 'account') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'deleteAccountCurrentSession') + ->label('sdk.description', '/docs/references/account/sessions-delete.md') + ->label('abuse-limit', 100) + ->action( + function () use ($response, $request, $user, $projectDB, $audit, $webhook) { + $token = Auth::tokenVerify($user->getAttribute('tokens'), Auth::TOKEN_TYPE_LOGIN, Auth::$secret); + + if (!$projectDB->deleteDocument($token)) { + throw new Exception('Failed to remove token from DB', 500); + } + + $webhook + ->setParam('payload', [ + 'name' => $user->getAttribute('name', ''), + 'email' => $user->getAttribute('email', ''), + ]) + ; + + $audit->setParam('event', 'account.sessions.delete'); + + $response + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->json(array('result' => 'success')) + ; + } + ); + +$utopia->delete('/v1/account/sessions/:id') + ->desc('Delete Account Session') + ->label('scope', 'account') + ->label('webhook', 'account.sessions.delete') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'deleteAccountSession') + ->label('sdk.description', '/docs/references/account/delete-account-session.md') + ->label('abuse-limit', 100) + ->param('id', null, function () { return new UID(); }, 'Session unique ID.') + ->action( + function ($id) use ($response, $request, $user, $projectDB, $webhook, $audit) { + $tokens = $user->getAttribute('tokens', []); + + foreach ($tokens as $token) { /* @var $token Document */ + if (($id == $token->getUid()) && Auth::TOKEN_TYPE_LOGIN == $token->getAttribute('type')) { + if (!$projectDB->deleteDocument($token->getUid())) { + throw new Exception('Failed to remove token from DB', 500); + } + + $audit + ->setParam('event', 'account.sessions.delete') + ->setParam('resource', '/user/'.$user->getUid()) + ; + + $webhook + ->setParam('payload', [ + 'name' => $user->getAttribute('name', ''), + 'email' => $user->getAttribute('email', ''), + ]) + ; + + if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too + $response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + } + } + } + + $response->json(array('result' => 'success')); + } + ); + +$utopia->delete('/v1/account/sessions') + ->desc('Delete All Account Sessions') + ->label('scope', 'account') + ->label('webhook', 'account.sessions.delete') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'deleteAccountSessions') + ->label('sdk.description', '/docs/references/account/delete-account-sessions.md') + ->label('abuse-limit', 100) + ->action( + function () use ($response, $request, $user, $projectDB, $audit, $webhook) { + $tokens = $user->getAttribute('tokens', []); + + foreach ($tokens as $token) { /* @var $token Document */ + if (!$projectDB->deleteDocument($token->getUid())) { + throw new Exception('Failed to remove token from DB', 500); + } + + $audit + ->setParam('event', 'account.sessions.delete') + ->setParam('resource', '/user/'.$user->getUid()) + ; + + $webhook + ->setParam('payload', [ + 'name' => $user->getAttribute('name', ''), + 'email' => $user->getAttribute('email', ''), + ]) + ; + + if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too + $response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + } + } + + $response->json(array('result' => 'success')); + } + ); \ No newline at end of file diff --git a/app/views/console/users/index.phtml b/app/views/console/users/index.phtml index f16b9df458..87184e95d7 100644 --- a/app/views/console/users/index.phtml +++ b/app/views/console/users/index.phtml @@ -352,7 +352,7 @@ $providers = $this->getParam('providers', []);

To complete set up, add this OAuth redirect URI to your app configuration.

- +
diff --git a/docs/references/auth/login-oauth.md b/docs/references/account/create-session-oauth.md similarity index 100% rename from docs/references/auth/login-oauth.md rename to docs/references/account/create-session-oauth.md diff --git a/docs/references/auth/login.md b/docs/references/account/create-session.md similarity index 100% rename from docs/references/auth/login.md rename to docs/references/account/create-session.md diff --git a/docs/references/auth/register.md b/docs/references/account/create.md similarity index 100% rename from docs/references/auth/register.md rename to docs/references/account/create.md From daa12dd17c3694881cfc617237f6bc9887460a54 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 6 Jan 2020 01:07:41 +0200 Subject: [PATCH 029/237] Deprecation of auth service --- app/controllers/api/account.php | 146 +++++++++++++++++- .../create-recovery.md} | 0 .../delete-session-current.md} | 0 .../delete-session.md} | 0 docs/references/account/delete-sessions.md | 1 + .../update-recovery.md} | 0 6 files changed, 145 insertions(+), 2 deletions(-) rename docs/references/{auth/recovery.md => account/create-recovery.md} (100%) rename docs/references/{auth/logout.md => account/delete-session-current.md} (100%) rename docs/references/{auth/logout-by-session.md => account/delete-session.md} (100%) create mode 100644 docs/references/account/delete-sessions.md rename docs/references/{auth/recovery-reset.md => account/update-recovery.md} (100%) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 394952ebab..240f50a4f8 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -805,7 +805,7 @@ $utopia->delete('/v1/account/sessions/current') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteAccountCurrentSession') - ->label('sdk.description', '/docs/references/account/sessions-delete.md') + ->label('sdk.description', '/docs/references/account/sessions-delete-current.md') ->label('abuse-limit', 100) ->action( function () use ($response, $request, $user, $projectDB, $audit, $webhook) { @@ -837,7 +837,7 @@ $utopia->delete('/v1/account/sessions/:id') ->label('webhook', 'account.sessions.delete') ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteAccountSession') - ->label('sdk.description', '/docs/references/account/delete-account-session.md') + ->label('sdk.description', '/docs/references/account/delete-session.md') ->label('abuse-limit', 100) ->param('id', null, function () { return new UID(); }, 'Session unique ID.') ->action( @@ -906,6 +906,148 @@ $utopia->delete('/v1/account/sessions') } } + $response->json(array('result' => 'success')); + } + ); + +$utopia->post('/v1/account/recovery') + ->desc('Password Recovery') + ->label('scope', 'public') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'createAccountRecovery') + ->label('sdk.description', '/docs/references/account/create-recovery.md') + ->label('abuse-limit', 10) + ->label('abuse-key', 'url:{url},email:{param-email}') + ->param('email', '', function () { return new Email(); }, 'User account email address.') + ->param('reset', '', function () use ($clients) { return new Host($clients); }, 'Reset URL in your app to redirect the user after the reset token has been sent to the user email.') + ->action( + function ($email, $reset) use ($request, $response, $projectDB, $register, $audit, $project) { + $profile = $projectDB->getCollection([ // Get user by email address + 'limit' => 1, + 'first' => true, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + 'email='.$email, + ], + ]); + + if (empty($profile)) { + throw new Exception('User not found', 404); // TODO maybe hide this + } + + $secret = Auth::tokenGenerator(); + + $profile->setAttribute('tokens', new Document([ + '$collection' => Database::SYSTEM_COLLECTION_TOKENS, + '$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]], + 'type' => Auth::TOKEN_TYPE_RECOVERY, + 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak + 'expire' => time() + Auth::TOKEN_EXPIRATION_RECOVERY, + 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), + 'ip' => $request->getIP(), + ]), Document::SET_TYPE_APPEND); + + Authorization::setRole('user:'.$profile->getUid()); + + $profile = $projectDB->updateDocument($profile->getArrayCopy()); + + if (false === $profile) { + throw new Exception('Failed to save user to DB', 500); + } + + $reset = Template::parseURL($reset); + $reset['query'] = Template::mergeQuery(((isset($reset['query'])) ? $reset['query'] : ''), ['userId' => $profile->getUid(), 'token' => $secret]); + $reset = Template::unParseURL($reset); + + $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.recovery.body')); + $body + ->setParam('{{direction}}', Locale::getText('settings.direction')) + ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) + ->setParam('{{name}}', $profile->getAttribute('name')) + ->setParam('{{redirect}}', $reset) + ; + + $mail = $register->get('smtp'); /* @var $mail \PHPMailer\PHPMailer\PHPMailer */ + + $mail->addAddress($profile->getAttribute('email', ''), $profile->getAttribute('name', '')); + + $mail->Subject = Locale::getText('auth.emails.recovery.title'); + $mail->Body = $body->render(); + $mail->AltBody = strip_tags($body->render()); + + try { + $mail->send(); + } catch (\Exception $error) { + //throw new Exception('Problem sending mail: ' . $error->getMessage(), 500); + } + + $audit + ->setParam('userId', $profile->getUid()) + ->setParam('event', 'account.recovery.create') + ; + + $response->json(array('result' => 'success')); + } + ); + +$utopia->put('/v1/account/recovery') + ->desc('Password Reset') + ->label('scope', 'public') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'updateAccountRecovery') + ->label('sdk.description', '/docs/references/account/update-recovery.md') + ->label('abuse-limit', 10) + ->label('abuse-key', 'url:{url},userId:{param-userId}') + ->param('userId', '', function () { return new UID(); }, 'User account email address.') + ->param('token', '', function () { return new Text(256); }, 'Valid reset token.') + ->param('password-a', '', function () { return new Password(); }, 'New password.') + ->param('password-b', '', function () {return new Password(); }, 'New password again.') + ->action( + function ($userId, $token, $passwordA, $passwordB) use ($response, $projectDB, $audit) { + if ($passwordA !== $passwordB) { + throw new Exception('Passwords must match', 400); + } + + $profile = $projectDB->getCollection([ // Get user by email address + 'limit' => 1, + 'first' => true, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + '$uid='.$userId, + ], + ]); + + if (empty($profile)) { + throw new Exception('User not found', 404); // TODO maybe hide this + } + + $token = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_RECOVERY, $token); + + if (!$token) { + throw new Exception('Recovery token is not valid', 401); + } + + Authorization::setRole('user:'.$profile->getUid()); + + $profile = $projectDB->updateDocument(array_merge($profile->getArrayCopy(), [ + 'password' => Auth::passwordHash($passwordA), + 'password-update' => time(), + 'confirm' => true, + ])); + + if (false === $profile) { + throw new Exception('Failed saving user to DB', 500); + } + + if (!$projectDB->deleteDocument($token)) { + throw new Exception('Failed to remove token from DB', 500); + } + + $audit + ->setParam('userId', $profile->getUid()) + ->setParam('event', 'account.recovery.update') + ; + $response->json(array('result' => 'success')); } ); \ No newline at end of file diff --git a/docs/references/auth/recovery.md b/docs/references/account/create-recovery.md similarity index 100% rename from docs/references/auth/recovery.md rename to docs/references/account/create-recovery.md diff --git a/docs/references/auth/logout.md b/docs/references/account/delete-session-current.md similarity index 100% rename from docs/references/auth/logout.md rename to docs/references/account/delete-session-current.md diff --git a/docs/references/auth/logout-by-session.md b/docs/references/account/delete-session.md similarity index 100% rename from docs/references/auth/logout-by-session.md rename to docs/references/account/delete-session.md diff --git a/docs/references/account/delete-sessions.md b/docs/references/account/delete-sessions.md new file mode 100644 index 0000000000..f7830dfbd7 --- /dev/null +++ b/docs/references/account/delete-sessions.md @@ -0,0 +1 @@ +Delete all sessions from the user account and remove any sessions cookies from the end client. \ No newline at end of file diff --git a/docs/references/auth/recovery-reset.md b/docs/references/account/update-recovery.md similarity index 100% rename from docs/references/auth/recovery-reset.md rename to docs/references/account/update-recovery.md From 2181683c138b117ed9d07b652cb18dcbd401da51 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 6 Jan 2020 01:22:02 +0200 Subject: [PATCH 030/237] Updated docs --- app/app.php | 4 ++++ app/controllers/api/account.php | 16 ++++++++-------- .../account/{get-security.md => get-logs.md} | 0 docs/references/locale/get-countries-eu.md | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) rename docs/references/account/{get-security.md => get-logs.md} (100%) diff --git a/app/app.php b/app/app.php index 48de253cfc..b73ab3cf50 100644 --- a/app/app.php +++ b/app/app.php @@ -768,6 +768,10 @@ $utopia->get('/v1/debug') } if ($route->getLabel('sdk.description', false)) { + if(!realpath(__DIR__.'/../'.$route->getLabel('sdk.description', false))) { + throw new Exception('Docs file ('.$route->getLabel('sdk.description', false).') is missing', 500); + } + if(array_key_exists($route->getLabel('sdk.description', false), $output['docs'])) { throw new Exception('Docs file ('.$route->getLabel('sdk.description', false).') is already in use by another route', 500); } diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 240f50a4f8..733f70c920 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -29,7 +29,7 @@ $utopia->get('/v1/account') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccount') - ->label('sdk.description', '/docs/references/account/get-account.md') + ->label('sdk.description', '/docs/references/account/get.md') ->action( function () use ($response, &$user, $providers) { $oauthKeys = []; @@ -60,7 +60,7 @@ $utopia->get('/v1/account/prefs') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountPrefs') - ->label('sdk.description', '/docs/references/account/get-account-prefs.md') + ->label('sdk.description', '/docs/references/account/get-prefs.md') ->action( function () use ($response, $user) { $prefs = $user->getAttribute('prefs', '{}'); @@ -84,7 +84,7 @@ $utopia->get('/v1/account/sessions') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountSessions') - ->label('sdk.description', '/docs/references/account/get-account-sessions.md') + ->label('sdk.description', '/docs/references/account/get-sessions.md') ->action( function () use ($response, $user) { $tokens = $user->getAttribute('tokens', []); @@ -141,7 +141,7 @@ $utopia->get('/v1/account/logs') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountLogs') - ->label('sdk.description', '/docs/references/account/get-account-logs.md') + ->label('sdk.description', '/docs/references/account/get-logs.md') ->action( function () use ($response, $register, $project, $user) { $adapter = new AuditAdapter($register->get('db')); @@ -628,7 +628,7 @@ $utopia->patch('/v1/account/name') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateAccountName') - ->label('sdk.description', '/docs/references/account/update-account-name.md') + ->label('sdk.description', '/docs/references/account/update-name.md') ->param('name', '', function () { return new Text(100); }, 'User name') ->action( function ($name) use ($response, $user, $projectDB, $audit) { @@ -655,7 +655,7 @@ $utopia->patch('/v1/account/password') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateAccountPassword') - ->label('sdk.description', '/docs/references/account/update-account-password.md') + ->label('sdk.description', '/docs/references/account/update-password.md') ->param('password', '', function () { return new Password(); }, 'New password') ->param('old-password', '', function () { return new Password(); }, 'Old password') ->action( @@ -805,7 +805,7 @@ $utopia->delete('/v1/account/sessions/current') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteAccountCurrentSession') - ->label('sdk.description', '/docs/references/account/sessions-delete-current.md') + ->label('sdk.description', '/docs/references/account/delete-session-current.md') ->label('abuse-limit', 100) ->action( function () use ($response, $request, $user, $projectDB, $audit, $webhook) { @@ -878,7 +878,7 @@ $utopia->delete('/v1/account/sessions') ->label('webhook', 'account.sessions.delete') ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteAccountSessions') - ->label('sdk.description', '/docs/references/account/delete-account-sessions.md') + ->label('sdk.description', '/docs/references/account/delete-sessions.md') ->label('abuse-limit', 100) ->action( function () use ($response, $request, $user, $projectDB, $audit, $webhook) { diff --git a/docs/references/account/get-security.md b/docs/references/account/get-logs.md similarity index 100% rename from docs/references/account/get-security.md rename to docs/references/account/get-logs.md diff --git a/docs/references/locale/get-countries-eu.md b/docs/references/locale/get-countries-eu.md index 2dcf03a3ee..777ae51f71 100644 --- a/docs/references/locale/get-countries-eu.md +++ b/docs/references/locale/get-countries-eu.md @@ -1 +1 @@ -List of all countries that are currently members of the EU. You can use the locale header to get the data in a supported language. UK brexit date is currently set to 2019-10-31 and will be updated if and when needed. \ No newline at end of file +List of all countries that are currently members of the EU. You can use the locale header to get the data in a supported language. \ No newline at end of file From f5f074eb862bb1d92f26b3aaf172c4776c0172ae Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 11 Jan 2020 15:58:02 +0200 Subject: [PATCH 031/237] Tests - work in progress --- CHANGES.md | 6 +- app/app.php | 12 +- .../templates/en.email.auth.recovery.tpl | 2 +- app/controllers/api/account.php | 316 +++--- app/controllers/api/teams.php | 4 +- app/init.php | 7 +- docker-compose.yml | 35 +- tests/e2e/AccountBase.php | 920 +++++++++++++++++ tests/e2e/AccountConsoleClientTest.php | 14 + tests/e2e/AccountCustomClientTest.php | 14 + tests/e2e/AccountCustomServerTest.php | 9 + tests/e2e/Client.php | 11 +- tests/e2e/Scopes/ProjectConsole.php | 15 + tests/e2e/Scopes/ProjectCustom.php | 119 +++ tests/e2e/Scopes/Scope.php | 55 ++ tests/e2e/Scopes/SideClient.php | 11 + tests/e2e/Scopes/SideServer.php | 19 + tests/old/AccountTest.php | 930 ++++++++++++++++++ tests/old/Base.php | 41 + tests/{e2e => old}/BaseConsole.php | 0 tests/{e2e => old}/BaseProjects.php | 0 tests/{e2e => old}/ConsoleHealthTest.php | 0 tests/{e2e => old}/ConsoleProjectsTest.php | 0 tests/{e2e => old}/ConsoleTest.php | 0 tests/{e2e => old}/ProjectAvatarsTest.php | 0 tests/{e2e => old}/ProjectDatabaseTest.php | 0 tests/{e2e => old}/ProjectLocaleTest.php | 0 tests/{e2e => old}/ProjectStorageTest.php | 0 tests/{e2e => old}/ProjectUsersTest.php | 0 29 files changed, 2381 insertions(+), 159 deletions(-) create mode 100644 tests/e2e/AccountBase.php create mode 100644 tests/e2e/AccountConsoleClientTest.php create mode 100644 tests/e2e/AccountCustomClientTest.php create mode 100644 tests/e2e/AccountCustomServerTest.php create mode 100644 tests/e2e/Scopes/ProjectConsole.php create mode 100644 tests/e2e/Scopes/ProjectCustom.php create mode 100644 tests/e2e/Scopes/Scope.php create mode 100644 tests/e2e/Scopes/SideClient.php create mode 100644 tests/e2e/Scopes/SideServer.php create mode 100644 tests/old/AccountTest.php create mode 100644 tests/old/Base.php rename tests/{e2e => old}/BaseConsole.php (100%) rename tests/{e2e => old}/BaseProjects.php (100%) rename tests/{e2e => old}/ConsoleHealthTest.php (100%) rename tests/{e2e => old}/ConsoleProjectsTest.php (100%) rename tests/{e2e => old}/ConsoleTest.php (100%) rename tests/{e2e => old}/ProjectAvatarsTest.php (100%) rename tests/{e2e => old}/ProjectDatabaseTest.php (100%) rename tests/{e2e => old}/ProjectLocaleTest.php (100%) rename tests/{e2e => old}/ProjectStorageTest.php (100%) rename tests/{e2e => old}/ProjectUsersTest.php (100%) diff --git a/CHANGES.md b/CHANGES.md index e1bedb5124..f6d3acbffa 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,11 +4,11 @@ * Upgraded core API PHP version to 7.4 * New database rule validation options -* Update docs example with auth info * Allow non-web platform skip origin header -* Limited to console UI to show max 5 alerts at the same time +* Limited console dashboard to show max 5 alerts at the same time * Added new webhooks events -* Normnailized all webhooks event names +* Normailized all webhooks event names +* Merged Auth and Account service for making the API more REST compatible ## Bug Fixes diff --git a/app/app.php b/app/app.php index b73ab3cf50..a1afaedc15 100644 --- a/app/app.php +++ b/app/app.php @@ -211,7 +211,7 @@ $utopia->shutdown(function () use ($response, $request, $webhook, $audit, $usage if (!empty($webhook->getParam('event'))) { $webhook->trigger(); } - + if (!empty($audit->getParam('event'))) { $audit->trigger(); } @@ -361,7 +361,7 @@ $utopia->get('/humans.txt') ); $utopia->get('/v1/info') // This is only visible to gods -->label('scope', 'god') + ->label('scope', 'god') ->label('docs', false) ->action( function () use ($response, $user, $project, $version, $env) { //TODO CONSIDER BLOCKING THIS ACTION TO ROLE GOD @@ -410,7 +410,7 @@ $utopia->get('/v1/proxy') } ); - $utopia->get('/v1/open-api-2.json') +$utopia->get('/v1/open-api-2.json') ->label('scope', 'public') ->label('docs', false) ->param('platform', 'client', function () {return new WhiteList(['client', 'server']);}, 'Choose target platform.', true) @@ -740,6 +740,7 @@ $utopia->get('/v1/debug') ->action( function () use ($response, $request, $utopia, $domain, $services) { $output = [ + 'scopes' => [], 'webhooks' => [], 'methods' => [], 'routes' => [], @@ -767,6 +768,10 @@ $utopia->get('/v1/debug') continue; } + if ($route->getLabel('scope', false)) { + $output['scopes'][$route->getLabel('scope', false)] = $route->getMethod().' '.$route->getURL(); + } + if ($route->getLabel('sdk.description', false)) { if(!realpath(__DIR__.'/../'.$route->getLabel('sdk.description', false))) { throw new Exception('Docs file ('.$route->getLabel('sdk.description', false).') is missing', 500); @@ -802,6 +807,7 @@ $utopia->get('/v1/debug') } } + ksort($output['scopes']); ksort($output['webhooks']); ksort($output['methods']); ksort($output['routes']); diff --git a/app/config/locales/templates/en.email.auth.recovery.tpl b/app/config/locales/templates/en.email.auth.recovery.tpl index 7a6fa2fa60..82b365546a 100644 --- a/app/config/locales/templates/en.email.auth.recovery.tpl +++ b/app/config/locales/templates/en.email.auth.recovery.tpl @@ -15,7 +15,7 @@ {{redirect}}

- If you didn’t ask to reset your password, you can ignore this message. + If you didn't ask to reset your password, you can ignore this message.

Thanks, diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 733f70c920..850b24a1d3 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1,8 +1,10 @@ init(function() use ($providers, &$oauthKeys) { + foreach ($providers as $key => $provider) { + if (!$provider['enabled']) { + continue; + } + + $oauthKeys[] = 'oauth'.ucfirst($key); + $oauthKeys[] = 'oauth'.ucfirst($key).'AccessToken'; + } + +}); + $utopia->get('/v1/account') ->desc('Get Account') ->label('scope', 'account') @@ -31,18 +47,7 @@ $utopia->get('/v1/account') ->label('sdk.method', 'getAccount') ->label('sdk.description', '/docs/references/account/get.md') ->action( - function () use ($response, &$user, $providers) { - $oauthKeys = []; - - foreach ($providers as $key => $provider) { - if (!$provider['enabled']) { - continue; - } - - $oauthKeys[] = 'oauth'.ucfirst($key); - $oauthKeys[] = 'oauth'.ucfirst($key).'AccessToken'; - } - + function () use ($response, &$user, $oauthKeys) { $response->json(array_merge($user->getArrayCopy(array_merge( [ '$uid', @@ -109,7 +114,7 @@ $utopia->get('/v1/account/sessions') $dd->parse(); $sessions[$index] = [ - 'id' => $token->getUid(), + '$uid' => $token->getUid(), 'OS' => $dd->getOs(), 'client' => $dd->getClient(), 'device' => $dd->getDevice(), @@ -146,6 +151,7 @@ $utopia->get('/v1/account/logs') function () use ($response, $register, $project, $user) { $adapter = new AuditAdapter($register->get('db')); $adapter->setNamespace('app_'.$project->getUid()); + $audit = new Audit($adapter); $countries = Locale::getText('countries'); @@ -220,7 +226,7 @@ $utopia->post('/v1/account') ->param('password', '', function () { return new Password(); }, 'User password') ->param('name', '', function () { return new Text(100); }, 'User name', true) ->action( - function ($email, $password, $name) use ($request, $response, $providers, $audit, $projectDB, $project, $webhook) { + function ($email, $password, $name) use ($register, $request, $response, $audit, $projectDB, $project, $webhook, $oauthKeys) { if ('console' === $project->getUid()) { $whitlistEmails = $project->getAttribute('authWhitelistEmails'); $whitlistIPs = $project->getAttribute('authWhitelistIPs'); @@ -276,14 +282,6 @@ $utopia->post('/v1/account') throw new Exception('Failed saving user to DB', 500); } - Authorization::setRole('user:'.$user->getUid()); - - $user = $projectDB->createDocument($user->getArrayCopy()); - - if (false === $user) { - throw new Exception('Failed saving tokens to DB', 500); - } - $webhook ->setParam('payload', [ 'name' => $name, @@ -297,26 +295,17 @@ $utopia->post('/v1/account') ->setParam('resource', 'users/'.$user->getUid()) ; - $oauthKeys = []; - - foreach ($providers as $key => $provider) { - if (!$provider['enabled']) { - continue; - } - - $oauthKeys[] = 'oauth'.ucfirst($key); - $oauthKeys[] = 'oauth'.ucfirst($key).'AccessToken'; - } - - $response->json(array_merge($user->getArrayCopy(array_merge( - [ - '$uid', - 'email', - 'registration', - 'name', - ], - $oauthKeys - )), ['roles' => Authorization::getRoles()])); + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->json(array_merge($user->getArrayCopy(array_merge( + [ + '$uid', + 'email', + 'registration', + 'name', + ], + $oauthKeys + )), ['roles' => Authorization::getRoles()])); } ); @@ -342,11 +331,11 @@ $utopia->post('/v1/account/sessions') ], ]); - if (!$profile || !Auth::passwordVerify($password, $profile->getAttribute('password'))) { + if (false == $profile || !Auth::passwordVerify($password, $profile->getAttribute('password'))) { $audit //->setParam('userId', $profile->getUid()) ->setParam('event', 'account.sesssions.failed') - ->setParam('resource', 'users/'.$profile->getUid()) + ->setParam('resource', 'users/'.($profile ? $profile->getUid() : '')) ; throw new Exception('Invalid credentials', 401); // Wrong password or username @@ -354,8 +343,7 @@ $utopia->post('/v1/account/sessions') $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; $secret = Auth::tokenGenerator(); - - $profile->setAttribute('tokens', new Document([ + $session = new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, '$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]], 'type' => Auth::TOKEN_TYPE_LOGIN, @@ -363,10 +351,18 @@ $utopia->post('/v1/account/sessions') 'expire' => $expiry, 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), 'ip' => $request->getIP(), - ]), Document::SET_TYPE_APPEND); + ]); Authorization::setRole('user:'.$profile->getUid()); + $session = $projectDB->createDocument($session->getArrayCopy()); + + if (false === $session) { + throw new Exception('Failed saving session to DB', 500); + } + + $profile->setAttribute('tokens', $session, Document::SET_TYPE_APPEND); + $profile = $projectDB->updateDocument($profile->getArrayCopy()); if (false === $profile) { @@ -382,15 +378,15 @@ $utopia->post('/v1/account/sessions') $audit ->setParam('userId', $profile->getUid()) - ->setParam('event', 'account.sesssions.create') + ->setParam('event', 'account.sessions.create') ->setParam('resource', 'users/'.$profile->getUid()) ; - + $response - ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); - - $response - ->json(array('result' => 'success')); + ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->json($session->getArrayCopy(['$uid', 'type', 'expire'])) + ; } ); @@ -583,20 +579,21 @@ $utopia->get('/v1/account/sessions/oauth/:provider/redirect') $secret = Auth::tokenGenerator(); $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; + $session = new Document([ + '$collection' => Database::SYSTEM_COLLECTION_TOKENS, + '$permissions' => ['read' => ['user:'.$user['$uid']], 'write' => ['user:'.$user['$uid']]], + 'type' => Auth::TOKEN_TYPE_LOGIN, + 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak + 'expire' => $expiry, + 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), + 'ip' => $request->getIP(), + ]); $user ->setAttribute('oauth'.ucfirst($provider), $oauthID) ->setAttribute('oauth'.ucfirst($provider).'AccessToken', $accessToken) ->setAttribute('status', Auth::USER_STATUS_ACTIVATED) - ->setAttribute('tokens', new Document([ - '$collection' => Database::SYSTEM_COLLECTION_TOKENS, - '$permissions' => ['read' => ['user:'.$user['$uid']], 'write' => ['user:'.$user['$uid']]], - 'type' => Auth::TOKEN_TYPE_LOGIN, - 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak - 'expire' => $expiry, - 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), - 'ip' => $request->getIP(), - ]), Document::SET_TYPE_APPEND) + ->setAttribute('tokens', $session, Document::SET_TYPE_APPEND) ; Authorization::setRole('user:'.$user->getUid()); @@ -631,7 +628,7 @@ $utopia->patch('/v1/account/name') ->label('sdk.description', '/docs/references/account/update-name.md') ->param('name', '', function () { return new Text(100); }, 'User name') ->action( - function ($name) use ($response, $user, $projectDB, $audit) { + function ($name) use ($response, $user, $projectDB, $audit, $oauthKeys) { $user = $projectDB->updateDocument(array_merge($user->getArrayCopy(), [ 'name' => $name, ])); @@ -645,7 +642,15 @@ $utopia->patch('/v1/account/name') ->setParam('resource', 'users/'.$user->getUid()) ; - $response->json(array('result' => 'success')); + $response->json(array_merge($user->getArrayCopy(array_merge( + [ + '$uid', + 'email', + 'registration', + 'name', + ], + $oauthKeys + )), ['roles' => Authorization::getRoles()])); } ); @@ -659,7 +664,7 @@ $utopia->patch('/v1/account/password') ->param('password', '', function () { return new Password(); }, 'New password') ->param('old-password', '', function () { return new Password(); }, 'Old password') ->action( - function ($password, $oldPassword) use ($response, $user, $projectDB, $audit) { + function ($password, $oldPassword) use ($response, $user, $projectDB, $audit, $oauthKeys) { if (!Auth::passwordVerify($oldPassword, $user->getAttribute('password'))) { // Double check user password throw new Exception('Invalid credentials', 401); } @@ -677,7 +682,15 @@ $utopia->patch('/v1/account/password') ->setParam('resource', 'users/'.$user->getUid()) ; - $response->json(array('result' => 'success')); + $response->json(array_merge($user->getArrayCopy(array_merge( + [ + '$uid', + 'email', + 'registration', + 'name', + ], + $oauthKeys + )), ['roles' => Authorization::getRoles()])); } ); @@ -691,7 +704,7 @@ $utopia->patch('/v1/account/email') ->param('email', '', function () { return new Email(); }, 'Email Address') ->param('password', '', function () { return new Password(); }, 'User Password') ->action( - function ($email, $password) use ($response, $user, $projectDB, $audit) { + function ($email, $password) use ($response, $user, $projectDB, $audit, $oauthKeys) { if (!Auth::passwordVerify($password, $user->getAttribute('password'))) { // Double check user password throw new Exception('Invalid credentials', 401); } @@ -724,7 +737,15 @@ $utopia->patch('/v1/account/email') ->setParam('resource', 'users/'.$user->getUid()) ; - $response->json(array('result' => 'success')); + $response->json(array_merge($user->getArrayCopy(array_merge( + [ + '$uid', + 'email', + 'registration', + 'name', + ], + $oauthKeys + )), ['roles' => Authorization::getRoles()])); } ); @@ -751,7 +772,19 @@ $utopia->patch('/v1/account/prefs') ->setParam('resource', 'users/'.$user->getUid()) ; - $response->json(array('result' => 'success')); + $prefs = $user->getAttribute('prefs', '{}'); + + if (empty($prefs)) { + $prefs = '[]'; + } + + try { + $prefs = json_decode($prefs, true); + } catch (\Exception $error) { + throw new Exception('Failed to parse preferences', 500); + } + + $response->json($prefs); } ); @@ -795,39 +828,46 @@ $utopia->delete('/v1/account') $response ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) - ->json(array('result' => 'success')); + ->noContent() + ; } ); -$utopia->delete('/v1/account/sessions/current') - ->desc('Delete Current Account Session') - ->label('webhook', 'account.sessions.delete') +$utopia->delete('/v1/account/sessions') + ->desc('Delete All Account Sessions') ->label('scope', 'account') + ->label('webhook', 'account.sessions.delete') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'deleteAccountCurrentSession') - ->label('sdk.description', '/docs/references/account/delete-session-current.md') + ->label('sdk.method', 'deleteAccountSessions') + ->label('sdk.description', '/docs/references/account/delete-sessions.md') ->label('abuse-limit', 100) ->action( function () use ($response, $request, $user, $projectDB, $audit, $webhook) { - $token = Auth::tokenVerify($user->getAttribute('tokens'), Auth::TOKEN_TYPE_LOGIN, Auth::$secret); + $tokens = $user->getAttribute('tokens', []); - if (!$projectDB->deleteDocument($token)) { - throw new Exception('Failed to remove token from DB', 500); + foreach ($tokens as $token) { /* @var $token Document */ + if (!$projectDB->deleteDocument($token->getUid())) { + throw new Exception('Failed to remove token from DB', 500); + } + + $audit + ->setParam('event', 'account.sessions.delete') + ->setParam('resource', '/user/'.$user->getUid()) + ; + + $webhook + ->setParam('payload', [ + 'name' => $user->getAttribute('name', ''), + 'email' => $user->getAttribute('email', ''), + ]) + ; + + if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too + $response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + } } - $webhook - ->setParam('payload', [ - 'name' => $user->getAttribute('name', ''), - 'email' => $user->getAttribute('email', ''), - ]) - ; - - $audit->setParam('event', 'account.sessions.delete'); - - $response - ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) - ->json(array('result' => 'success')) - ; + $response->noContent(); } ); @@ -868,45 +908,39 @@ $utopia->delete('/v1/account/sessions/:id') } } - $response->json(array('result' => 'success')); + $response->noContent(); } ); -$utopia->delete('/v1/account/sessions') - ->desc('Delete All Account Sessions') - ->label('scope', 'account') +$utopia->delete('/v1/account/sessions/current') + ->desc('Delete Current Account Session') ->label('webhook', 'account.sessions.delete') + ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'deleteAccountSessions') - ->label('sdk.description', '/docs/references/account/delete-sessions.md') + ->label('sdk.method', 'deleteAccountCurrentSession') + ->label('sdk.description', '/docs/references/account/delete-session-current.md') ->label('abuse-limit', 100) ->action( function () use ($response, $request, $user, $projectDB, $audit, $webhook) { - $tokens = $user->getAttribute('tokens', []); + $token = Auth::tokenVerify($user->getAttribute('tokens'), Auth::TOKEN_TYPE_LOGIN, Auth::$secret); - foreach ($tokens as $token) { /* @var $token Document */ - if (!$projectDB->deleteDocument($token->getUid())) { - throw new Exception('Failed to remove token from DB', 500); - } - - $audit - ->setParam('event', 'account.sessions.delete') - ->setParam('resource', '/user/'.$user->getUid()) - ; - - $webhook - ->setParam('payload', [ - 'name' => $user->getAttribute('name', ''), - 'email' => $user->getAttribute('email', ''), - ]) - ; - - if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too - $response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); - } + if (!$projectDB->deleteDocument($token)) { + throw new Exception('Failed to remove token from DB', 500); } - $response->json(array('result' => 'success')); + $webhook + ->setParam('payload', [ + 'name' => $user->getAttribute('name', ''), + 'email' => $user->getAttribute('email', ''), + ]) + ; + + $audit->setParam('event', 'account.sessions.delete'); + + $response + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->noContent() + ; } ); @@ -936,8 +970,7 @@ $utopia->post('/v1/account/recovery') } $secret = Auth::tokenGenerator(); - - $profile->setAttribute('tokens', new Document([ + $recovery = new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, '$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]], 'type' => Auth::TOKEN_TYPE_RECOVERY, @@ -945,10 +978,18 @@ $utopia->post('/v1/account/recovery') 'expire' => time() + Auth::TOKEN_EXPIRATION_RECOVERY, 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), 'ip' => $request->getIP(), - ]), Document::SET_TYPE_APPEND); - + ]); + Authorization::setRole('user:'.$profile->getUid()); + $recovery = $projectDB->createDocument($recovery->getArrayCopy()); + + if (false === $recovery) { + throw new Exception('Failed saving recovery to DB', 500); + } + + $profile->setAttribute('tokens', $recovery, Document::SET_TYPE_APPEND); + $profile = $projectDB->updateDocument($profile->getArrayCopy()); if (false === $profile) { @@ -978,7 +1019,7 @@ $utopia->post('/v1/account/recovery') try { $mail->send(); } catch (\Exception $error) { - //throw new Exception('Problem sending mail: ' . $error->getMessage(), 500); + throw new Exception('Error sending mail: ' . $error->getMessage(), 500); } $audit @@ -986,7 +1027,10 @@ $utopia->post('/v1/account/recovery') ->setParam('event', 'account.recovery.create') ; - $response->json(array('result' => 'success')); + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->json($recovery->getArrayCopy(['$uid', 'type', 'expire'])) + ; } ); @@ -998,7 +1042,7 @@ $utopia->put('/v1/account/recovery') ->label('sdk.description', '/docs/references/account/update-recovery.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{param-userId}') - ->param('userId', '', function () { return new UID(); }, 'User account email address.') + ->param('userId', '', function () { return new UID(); }, 'User account UID address.') ->param('token', '', function () { return new Text(256); }, 'Valid reset token.') ->param('password-a', '', function () { return new Password(); }, 'New password.') ->param('password-b', '', function () {return new Password(); }, 'New password again.') @@ -1021,10 +1065,10 @@ $utopia->put('/v1/account/recovery') throw new Exception('User not found', 404); // TODO maybe hide this } - $token = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_RECOVERY, $token); + $recovery = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_RECOVERY, $token); - if (!$token) { - throw new Exception('Recovery token is not valid', 401); + if (!$recovery) { + throw new Exception('Invalid recovery token', 401); } Authorization::setRole('user:'.$profile->getUid()); @@ -1039,8 +1083,12 @@ $utopia->put('/v1/account/recovery') throw new Exception('Failed saving user to DB', 500); } - if (!$projectDB->deleteDocument($token)) { - throw new Exception('Failed to remove token from DB', 500); + /** + * We act like we're updating and validating + * the recovery token but actually we don't need it anymore. + */ + if (!$projectDB->deleteDocument($recovery)) { + throw new Exception('Failed to remove recovery from DB', 500); } $audit @@ -1048,6 +1096,8 @@ $utopia->put('/v1/account/recovery') ->setParam('event', 'account.recovery.update') ; - $response->json(array('result' => 'success')); + $recovery = $profile->search('$uid', $recovery, $profile->getAttribute('tokens', [])); + + $response->json($recovery->getArrayCopy(['$uid', 'type', 'expire'])); } ); \ No newline at end of file diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 2fdcad5ee7..55b590a4e6 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -378,7 +378,7 @@ $utopia->post('/v1/teams/:teamId/memberships') try { $mail->send(); } catch (\Exception $error) { - //throw new Exception('Problem sending mail: ' . $error->getMessage(), 500); + throw new Exception('Error sending mail: ' . $error->getMessage(), 500); } $audit @@ -457,7 +457,7 @@ $utopia->post('/v1/teams/:teamId/memberships/:inviteId/resend') try { $mail->send(); } catch (\Exception $error) { - //throw new Exception('Problem sending mail: ' . $error->getMessage(), 500); + throw new Exception('Error sending mail: ' . $error->getMessage(), 500); } $audit diff --git a/app/init.php b/app/init.php index 8ee73aae2b..46d659ea4d 100644 --- a/app/init.php +++ b/app/init.php @@ -111,8 +111,8 @@ $register->set('smtp', function () use ($request) { $mail->isSMTP(); - $username = $request->getServer('_APP_SMTP_USERNAME', ''); - $password = $request->getServer('_APP_SMTP_PASSWORD', ''); + $username = $request->getServer('_APP_SMTP_USERNAME', null); + $password = $request->getServer('_APP_SMTP_PASSWORD', null); $mail->XMailer = 'Appwrite Mailer'; $mail->Host = $request->getServer('_APP_SMTP_HOST', 'smtp'); @@ -120,7 +120,8 @@ $register->set('smtp', function () use ($request) { $mail->SMTPAuth = (!empty($username) && !empty($password)); $mail->Username = $username; $mail->Password = $password; - $mail->SMTPSecure = $request->getServer('_APP_SMTP_SECURE', ''); + $mail->SMTPSecure = $request->getServer('_APP_SMTP_SECURE', false); + $mail->SMTPAutoTLS = false; $mail->setFrom('team@appwrite.io', APP_NAME.' Team'); $mail->addReplyTo('team@appwrite.io', APP_NAME.' Team'); diff --git a/docker-compose.yml b/docker-compose.yml index cb49a945c8..28620ee051 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,6 +17,7 @@ services: - ./phpunit.xml:/usr/share/nginx/html/phpunit.xml - ./tests:/usr/share/nginx/html/tests - ./app:/usr/share/nginx/html/app + - ./vendor:/usr/share/nginx/html/vendor - ./docs:/usr/share/nginx/html/docs - ./public:/usr/share/nginx/html/public - ./src:/usr/share/nginx/html/src @@ -31,6 +32,7 @@ services: - clamav - influxdb - telegraf + - maildev environment: - _APP_ENV=development - _APP_OPTIONS_ABUSE=disabled @@ -46,6 +48,8 @@ services: - _APP_INFLUXDB_PORT=8086 - _APP_STATSD_HOST=telegraf - _APP_STATSD_PORT=8125 + - _APP_SMTP_HOST=maildev + - _APP_SMTP_PORT=25 mariadb: image: appwrite/mariadb:1.0.2 # fix issues when upgrading using: mysql_upgrade -u root -p @@ -100,18 +104,25 @@ services: networks: - appwrite - # resque: - # image: registry.gitlab.com/appwrite/appwrite/resque-web:v1.0.2 - # restart: unless-stopped - # networks: - # - appwrite - # ports: - # - "5678:5678" - # environment: - # - RESQUE_WEB_HOST=redis - # - RESQUE_WEB_PORT=6379 - # - RESQUE_WEB_HTTP_BASIC_AUTH_USER=user - # - RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD=password + resque: + image: registry.gitlab.com/appwrite/appwrite/resque-web:v1.0.2 + restart: unless-stopped + networks: + - appwrite + ports: + - "5678:5678" + environment: + - RESQUE_WEB_HOST=redis + - RESQUE_WEB_PORT=6379 + - RESQUE_WEB_HTTP_BASIC_AUTH_USER=user + - RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD=password + + maildev: + ports: + - '1080:80' + networks: + - appwrite + image: djfarrelly/maildev networks: appwrite: diff --git a/tests/e2e/AccountBase.php b/tests/e2e/AccountBase.php new file mode 100644 index 0000000000..bae6bea2de --- /dev/null +++ b/tests/e2e/AccountBase.php @@ -0,0 +1,920 @@ +client->call(Client::METHOD_POST, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]); + + $uid = $response['body']['$uid']; + + $this->assertEquals($response['headers']['status-code'], 201); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $email); + $this->assertEquals($response['body']['name'], $name); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_POST, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]); + + $this->assertEquals($response['headers']['status-code'], 409); + + return [ + 'uid' => $uid, + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]; + } + + /** + * @depends testCreateAccount + */ + public function testCreateAccountSession($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $sessionUid = $response['body']['$uid']; + $session = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + + $this->assertEquals($response['headers']['status-code'], 201); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email.'x', + 'password' => $password, + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password.'x', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => '', + 'password' => '', + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + return array_merge($data, [ + 'sessionUid' => $sessionUid, + 'session' => $session, + ]); + } + + /** + * @depends testCreateAccountSession + */ + public function testGetAccount($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $name = (isset($data['name'])) ? $data['name'] : ''; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $email); + $this->assertEquals($response['body']['name'], $name); + $this->assertContains('*', $response['body']['roles']); + $this->assertContains('user:'.$response['body']['$uid'], $response['body']['roles']); + $this->assertContains('role:1', $response['body']['roles']); + $this->assertCount(3, $response['body']['roles']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session.'xx', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testCreateAccountSession + */ + public function testGetAccountPrefs($data):array + { + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/account/prefs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertEmpty($response['body']); + $this->assertCount(0, $response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account/prefs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testCreateAccountSession + */ + public function testGetAccountSessions($data):array + { + $session = (isset($data['session'])) ? $data['session'] : ''; + $sessionUid = (isset($data['sessionUid'])) ? $data['sessionUid'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertCount(1, $response['body']); + $this->assertEquals($sessionUid, $response['body'][0]['$uid']); + + $this->assertIsArray($response['body'][0]['OS']); + $this->assertEquals('Windows', $response['body'][0]['OS']['name']); + $this->assertEquals('WIN', $response['body'][0]['OS']['short_name']); + $this->assertEquals('10', $response['body'][0]['OS']['version']); + $this->assertEquals('x64', $response['body'][0]['OS']['platform']); + + $this->assertIsArray($response['body'][0]['client']); + $this->assertEquals('browser', $response['body'][0]['client']['type']); + $this->assertEquals('Chrome', $response['body'][0]['client']['name']); + $this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase + $this->assertEquals('70.0', $response['body'][0]['client']['version']); + $this->assertEquals('Blink', $response['body'][0]['client']['engine']); + $this->assertEquals(0, $response['body'][0]['device']); + $this->assertEquals('', $response['body'][0]['brand']); + $this->assertEquals('', $response['body'][0]['model']); + $this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + + $this->assertIsArray($response['body'][0]['geo']); + $this->assertEquals('--', $response['body'][0]['geo']['isoCode']); + $this->assertEquals('Unknown', $response['body'][0]['geo']['country']); + + $this->assertEquals(true, $response['body'][0]['current']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testCreateAccountSession + */ + public function testGetAccountLogs($data):array + { + sleep(5); + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/account/logs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertCount(2, $response['body']); + + $this->assertEquals('account.create', $response['body'][0]['event']); + $this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + $this->assertIsNumeric($response['body'][0]['time']); + + $this->assertIsArray($response['body'][0]['OS']); + $this->assertEquals('Windows', $response['body'][0]['OS']['name']); + $this->assertEquals('WIN', $response['body'][0]['OS']['short_name']); + $this->assertEquals('10', $response['body'][0]['OS']['version']); + $this->assertEquals('x64', $response['body'][0]['OS']['platform']); + + $this->assertIsArray($response['body'][0]['client']); + $this->assertEquals('browser', $response['body'][0]['client']['type']); + $this->assertEquals('Chrome', $response['body'][0]['client']['name']); + $this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase + $this->assertEquals('70.0', $response['body'][0]['client']['version']); + $this->assertEquals('Blink', $response['body'][0]['client']['engine']); + $this->assertEquals(0, $response['body'][0]['device']); + $this->assertEquals('', $response['body'][0]['brand']); + $this->assertEquals('', $response['body'][0]['model']); + $this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + + $this->assertIsArray($response['body'][0]['geo']); + $this->assertEquals('--', $response['body'][0]['geo']['isoCode']); + $this->assertEquals('Unknown', $response['body'][0]['geo']['country']); + + $this->assertEquals('account.sessions.create', $response['body'][1]['event']); + $this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + $this->assertIsNumeric($response['body'][1]['time']); + + $this->assertIsArray($response['body'][1]['OS']); + $this->assertEquals('Windows', $response['body'][1]['OS']['name']); + $this->assertEquals('WIN', $response['body'][1]['OS']['short_name']); + $this->assertEquals('10', $response['body'][1]['OS']['version']); + $this->assertEquals('x64', $response['body'][1]['OS']['platform']); + + $this->assertIsArray($response['body'][1]['client']); + $this->assertEquals('browser', $response['body'][1]['client']['type']); + $this->assertEquals('Chrome', $response['body'][1]['client']['name']); + $this->assertEquals('CH', $response['body'][1]['client']['short_name']); // FIXME (v1) key name should be camelcase + $this->assertEquals('70.0', $response['body'][1]['client']['version']); + $this->assertEquals('Blink', $response['body'][1]['client']['engine']); + $this->assertEquals(0, $response['body'][1]['device']); + $this->assertEquals('', $response['body'][1]['brand']); + $this->assertEquals('', $response['body'][1]['model']); + $this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + + $this->assertIsArray($response['body'][1]['geo']); + $this->assertEquals('--', $response['body'][1]['geo']['isoCode']); + $this->assertEquals('Unknown', $response['body'][1]['geo']['country']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account/logs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + //TODO Add tests for OAuth session creation + + /** + * @depends testCreateAccountSession + */ + public function testUpdateAccountName($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $session = (isset($data['session'])) ? $data['session'] : ''; + $newName = 'New Name'; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'name' => $newName + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $email); + $this->assertEquals($response['body']['name'], $newName); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y7' + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $data['name'] = $newName; + + return $data; + } + + /** + * @depends testUpdateAccountName + */ + public function testUpdateAccountPassword($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'password' => 'new-password', + 'old-password' => $password, + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $email); + $this->assertEquals($response['body']['name'], 'New Name'); + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => 'new-password', + ]); + + $this->assertEquals($response['headers']['status-code'], 201); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $data['password'] = 'new-password'; + + return $data; + } + + /** + * @depends testUpdateAccountPassword + */ + public function testUpdateAccountEmail($data):array + { + $newEmail = uniqid().'new@localhost.test'; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'email' => $newEmail, + 'password' => 'new-password', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $newEmail); + $this->assertEquals($response['body']['name'], 'New Name'); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $data['email'] = $newEmail; + + return $data; + } + + /** + * @depends testUpdateAccountEmail + */ + public function testUpdateAccountPrefs($data):array + { + $newEmail = uniqid().'new@localhost.test'; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'prefs' => [ + 'key1' => 'value1', + 'key2' => 'value2', + ] + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertEquals('value1', $response['body']['key1']); + $this->assertEquals('value2', $response['body']['key2']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testUpdateAccountPrefs + */ + public function testDeleteAccountSession($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $sessionNewUid = $response['body']['$uid']; + $sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + + $this->assertEquals($response['headers']['status-code'], 201); + + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + + $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/'.$sessionNewUid, [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 204); + + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testUpdateAccountPrefs + */ + public function testDeleteAccountSessionCurrent($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + + $this->assertEquals($response['headers']['status-code'], 201); + + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + + $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/current', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 204); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testUpdateAccountPrefs + */ + public function testDeleteAccountSessions($data):array + { + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 204); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + /** + * Create new fallback session + */ + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $data['session'] = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + + return $data; + } + + /** + * @depends testDeleteAccountSession + */ + public function testCreateAccountRecovery($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $name = (isset($data['name'])) ? $data['name'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'reset' => 'http://localhost/recovery', + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty(3, $response['body']['$uid']); + $this->assertEquals(3, $response['body']['type']); + $this->assertIsNumeric($response['body']['expire']); + + $lastEmail = $this->getLastEmail(); + + $this->assertEquals($email, $lastEmail['to'][0]['address']); + $this->assertEquals($name, $lastEmail['to'][0]['name']); + $this->assertEquals('Password Reset', $lastEmail['subject']); + + $recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&token=', 0) + 7, 256); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'reset' => 'localhost/recovery', + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'reset' => 'http://remotehost/recovery', + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => 'not-found@localhost.test', + 'reset' => 'http://localhost/recovery', + ]); + + $this->assertEquals(404, $response['headers']['status-code']); + + $data['recovery'] = $recovery; + + return $data; + } + + /** + * @depends testCreateAccountRecovery + */ + public function testUpdateAccountRecovery($data):array + { + $uid = (isset($data['uid'])) ? $data['uid'] : ''; + $recovery = (isset($data['recovery'])) ? $data['recovery'] : ''; + $newPassowrd = 'test-recovery'; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'userId' => $uid, + 'token' => $recovery, + 'password-a' => $newPassowrd, + 'password-b' => $newPassowrd, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'userId' => 'ewewe', + 'token' => $recovery, + 'password-a' => $newPassowrd, + 'password-b' => $newPassowrd, + ]); + + $this->assertEquals(404, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'userId' => $uid, + 'token' => 'sdasdasdasd', + 'password-a' => $newPassowrd, + 'password-b' => $newPassowrd, + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'userId' => $uid, + 'token' => $recovery, + 'password-a' => $newPassowrd.'x', + 'password-b' => $newPassowrd, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return $data; + } +} \ No newline at end of file diff --git a/tests/e2e/AccountConsoleClientTest.php b/tests/e2e/AccountConsoleClientTest.php new file mode 100644 index 0000000000..e6b9dd6b64 --- /dev/null +++ b/tests/e2e/AccountConsoleClientTest.php @@ -0,0 +1,14 @@ + 'console', + 'name' => 'Appwrite', + 'apiKey' => '', + ]; + } +} diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php new file mode 100644 index 0000000000..873e1353bb --- /dev/null +++ b/tests/e2e/Scopes/ProjectCustom.php @@ -0,0 +1,119 @@ +project)) { + return $this->project; + } + + $root = $this->client->call(Client::METHOD_POST, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $this->rootEmail, + 'password' => $this->rootEmail, + 'name' => 'Demo User', + ]); + + $this->assertEquals(201, $root['headers']['status-code']); + + $session = $this->client->parseCookie($root['headers']['set-cookie'])['a_session_console']; + + $team = $this->client->call(Client::METHOD_POST, '/teams', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'name' => 'Demo Project Team', + ]); + + $this->assertEquals(201, $team['headers']['status-code']); + $this->assertEquals('Demo Project Team', $team['body']['name']); + $this->assertNotEmpty($team['body']['$uid']); + + $project = $this->client->call(Client::METHOD_POST, '/projects', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'name' => 'Demo Project', + 'teamId' => $team['body']['$uid'], + 'description' => 'Demo Project Description', + 'logo' => '', + 'url' => 'https://appwrite.io', + 'legalName' => '', + 'legalCountry' => '', + 'legalState' => '', + 'legalCity' => '', + 'legalAddress' => '', + 'legalTaxId' => '', + ]); + + $this->assertEquals(201, $project['headers']['status-code']); + $this->assertNotEmpty($project['body']); + + $key = $this->client->call(Client::METHOD_POST, '/projects/' . $project['body']['$uid'] . '/keys', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'name' => 'Demo Project Key', + 'scopes' => [ + 'account', + '', + '', + ], + ]); + + $this->assertEquals(201, $project['headers']['status-code']); + $this->assertNotEmpty($key['body']); + $this->assertNotEmpty($key['body']['secret']); + + // return [ + // 'email' => $this->demoEmail, + // 'password' => $this->demoPassword, + // 'session' => $session, + // 'projectUid' => $project['body']['$uid'], + // 'projectAPIKeySecret' => $key['body']['secret'], + // 'projectSession' => $this->client->parseCookie($user['headers']['set-cookie'])['a_session_' . $project['body']['$uid']], + // ]; + + $this->project = [ + '$uid' => $project['body']['$uid'], + 'name' => $project['body']['name'], + 'apiKey' => $key['body']['secret'], + ]; + + var_dump('init project'); + + return $this->project; + } +} diff --git a/tests/e2e/Scopes/Scope.php b/tests/e2e/Scopes/Scope.php new file mode 100644 index 0000000000..60937da0bb --- /dev/null +++ b/tests/e2e/Scopes/Scope.php @@ -0,0 +1,55 @@ +client = new Client(); + + $this->client + ->setEndpoint($this->endpoint) + ; + } + + protected function tearDown(): void + { + $this->client = null; + } + + protected function getLastEmail():array + { + sleep(3); + $emails = json_decode(file_get_contents('http://maildev/email'), true); + + if($emails && is_array($emails)) { + return end($emails); + } + + return []; + } + + /** + * @return array + */ + abstract public function getHeaders():array; + + /** + * @return array + */ + abstract public function getProject():array; +} diff --git a/tests/e2e/Scopes/SideClient.php b/tests/e2e/Scopes/SideClient.php new file mode 100644 index 0000000000..2e442ef7af --- /dev/null +++ b/tests/e2e/Scopes/SideClient.php @@ -0,0 +1,11 @@ + $this->getProject() + ]; + } +} diff --git a/tests/old/AccountTest.php b/tests/old/AccountTest.php new file mode 100644 index 0000000000..c600261279 --- /dev/null +++ b/tests/old/AccountTest.php @@ -0,0 +1,930 @@ +demo(); } +} + +class AccountTest extends Base +{ + use TraitDemo; + + public function demo() { + var_dump(4321); + } + + public function testCreateAccount():array + { + $email = uniqid().'user@localhost.test'; + $password = 'passwrod'; + $name = 'User Name'; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]); + + $uid = $response['body']['$uid']; + + $this->assertEquals($response['headers']['status-code'], 201); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $email); + $this->assertEquals($response['body']['name'], $name); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_POST, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]); + + $this->assertEquals($response['headers']['status-code'], 409); + + return [ + 'uid' => $uid, + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]; + } + + /** + * @depends testCreateAccount + */ + public function testCreateAccountSession($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $sessionUid = $response['body']['$uid']; + $session = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + + $this->assertEquals($response['headers']['status-code'], 201); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email.'x', + 'password' => $password, + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password.'x', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => '', + 'password' => '', + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + return array_merge($data, [ + 'sessionUid' => $sessionUid, + 'session' => $session, + ]); + } + + /** + * @depends testCreateAccountSession + */ + public function testGetAccount($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $name = (isset($data['name'])) ? $data['name'] : ''; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $email); + $this->assertEquals($response['body']['name'], $name); + $this->assertContains('*', $response['body']['roles']); + $this->assertContains('user:'.$response['body']['$uid'], $response['body']['roles']); + $this->assertContains('role:1', $response['body']['roles']); + $this->assertCount(3, $response['body']['roles']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session.'xx', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testCreateAccountSession + */ + public function testGetAccountPrefs($data):array + { + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/account/prefs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertEmpty($response['body']); + $this->assertCount(0, $response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account/prefs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testCreateAccountSession + */ + public function testGetAccountSessions($data):array + { + $session = (isset($data['session'])) ? $data['session'] : ''; + $sessionUid = (isset($data['sessionUid'])) ? $data['sessionUid'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertCount(1, $response['body']); + $this->assertEquals($sessionUid, $response['body'][0]['$uid']); + + $this->assertIsArray($response['body'][0]['OS']); + $this->assertEquals('Windows', $response['body'][0]['OS']['name']); + $this->assertEquals('WIN', $response['body'][0]['OS']['short_name']); + $this->assertEquals('10', $response['body'][0]['OS']['version']); + $this->assertEquals('x64', $response['body'][0]['OS']['platform']); + + $this->assertIsArray($response['body'][0]['client']); + $this->assertEquals('browser', $response['body'][0]['client']['type']); + $this->assertEquals('Chrome', $response['body'][0]['client']['name']); + $this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase + $this->assertEquals('70.0', $response['body'][0]['client']['version']); + $this->assertEquals('Blink', $response['body'][0]['client']['engine']); + $this->assertEquals(0, $response['body'][0]['device']); + $this->assertEquals('', $response['body'][0]['brand']); + $this->assertEquals('', $response['body'][0]['model']); + $this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + + $this->assertIsArray($response['body'][0]['geo']); + $this->assertEquals('--', $response['body'][0]['geo']['isoCode']); + $this->assertEquals('Unknown', $response['body'][0]['geo']['country']); + + $this->assertEquals(true, $response['body'][0]['current']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testCreateAccountSession + */ + public function testGetAccountLogs($data):array + { + sleep(5); + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/account/logs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertCount(2, $response['body']); + + $this->assertEquals('account.create', $response['body'][0]['event']); + $this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + $this->assertIsNumeric($response['body'][0]['time']); + + $this->assertIsArray($response['body'][0]['OS']); + $this->assertEquals('Windows', $response['body'][0]['OS']['name']); + $this->assertEquals('WIN', $response['body'][0]['OS']['short_name']); + $this->assertEquals('10', $response['body'][0]['OS']['version']); + $this->assertEquals('x64', $response['body'][0]['OS']['platform']); + + $this->assertIsArray($response['body'][0]['client']); + $this->assertEquals('browser', $response['body'][0]['client']['type']); + $this->assertEquals('Chrome', $response['body'][0]['client']['name']); + $this->assertEquals('CH', $response['body'][0]['client']['short_name']); // FIXME (v1) key name should be camelcase + $this->assertEquals('70.0', $response['body'][0]['client']['version']); + $this->assertEquals('Blink', $response['body'][0]['client']['engine']); + $this->assertEquals(0, $response['body'][0]['device']); + $this->assertEquals('', $response['body'][0]['brand']); + $this->assertEquals('', $response['body'][0]['model']); + $this->assertEquals($response['body'][0]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + + $this->assertIsArray($response['body'][0]['geo']); + $this->assertEquals('--', $response['body'][0]['geo']['isoCode']); + $this->assertEquals('Unknown', $response['body'][0]['geo']['country']); + + $this->assertEquals('account.sessions.create', $response['body'][1]['event']); + $this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + $this->assertIsNumeric($response['body'][1]['time']); + + $this->assertIsArray($response['body'][1]['OS']); + $this->assertEquals('Windows', $response['body'][1]['OS']['name']); + $this->assertEquals('WIN', $response['body'][1]['OS']['short_name']); + $this->assertEquals('10', $response['body'][1]['OS']['version']); + $this->assertEquals('x64', $response['body'][1]['OS']['platform']); + + $this->assertIsArray($response['body'][1]['client']); + $this->assertEquals('browser', $response['body'][1]['client']['type']); + $this->assertEquals('Chrome', $response['body'][1]['client']['name']); + $this->assertEquals('CH', $response['body'][1]['client']['short_name']); // FIXME (v1) key name should be camelcase + $this->assertEquals('70.0', $response['body'][1]['client']['version']); + $this->assertEquals('Blink', $response['body'][1]['client']['engine']); + $this->assertEquals(0, $response['body'][1]['device']); + $this->assertEquals('', $response['body'][1]['brand']); + $this->assertEquals('', $response['body'][1]['model']); + $this->assertEquals($response['body'][1]['ip'], filter_var($response['body'][0]['ip'], FILTER_VALIDATE_IP)); + + $this->assertIsArray($response['body'][1]['geo']); + $this->assertEquals('--', $response['body'][1]['geo']['isoCode']); + $this->assertEquals('Unknown', $response['body'][1]['geo']['country']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account/logs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + //TODO Add tests for OAuth session creation + + /** + * @depends testCreateAccountSession + */ + public function testUpdateAccountName($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $session = (isset($data['session'])) ? $data['session'] : ''; + $newName = 'New Name'; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'name' => $newName + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $email); + $this->assertEquals($response['body']['name'], $newName); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y7' + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $data['name'] = $newName; + + return $data; + } + + /** + * @depends testUpdateAccountName + */ + public function testUpdateAccountPassword($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'password' => 'new-password', + 'old-password' => $password, + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $email); + $this->assertEquals($response['body']['name'], 'New Name'); + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => 'new-password', + ]); + + $this->assertEquals($response['headers']['status-code'], 201); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $data['password'] = 'new-password'; + + return $data; + } + + /** + * @depends testUpdateAccountPassword + */ + public function testUpdateAccountEmail($data):array + { + $newEmail = uniqid().'new@localhost.test'; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'email' => $newEmail, + 'password' => 'new-password', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertIsNumeric($response['body']['registration']); + $this->assertEquals($response['body']['email'], $newEmail); + $this->assertEquals($response['body']['name'], 'New Name'); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $data['email'] = $newEmail; + + return $data; + } + + /** + * @depends testUpdateAccountEmail + */ + public function testUpdateAccountPrefs($data):array + { + $newEmail = uniqid().'new@localhost.test'; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ], [ + 'prefs' => [ + 'key1' => 'value1', + 'key2' => 'value2', + ] + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertNotEmpty($response['body']); + $this->assertEquals('value1', $response['body']['key1']); + $this->assertEquals('value2', $response['body']['key2']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testUpdateAccountPrefs + */ + public function testDeleteAccountSession($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $sessionNewUid = $response['body']['$uid']; + $sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + + $this->assertEquals($response['headers']['status-code'], 201); + + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + + $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/'.$sessionNewUid, [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 204); + + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testUpdateAccountPrefs + */ + public function testDeleteAccountSessionCurrent($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + + $this->assertEquals($response['headers']['status-code'], 201); + + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + + $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/current', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 204); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $sessionNew, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + return $data; + } + + /** + * @depends testUpdateAccountPrefs + */ + public function testDeleteAccountSessions($data):array + { + $session = (isset($data['session'])) ? $data['session'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 204); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'cookie' => 'a_session_console=' . $session, + 'x-appwrite-project' => 'console', + ]); + + $this->assertEquals($response['headers']['status-code'], 401); + + /** + * Create new fallback session + */ + $email = (isset($data['email'])) ? $data['email'] : ''; + $password = (isset($data['password'])) ? $data['password'] : ''; + + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $data['session'] = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + + return $data; + } + + /** + * @depends testDeleteAccountSession + */ + public function testCreateAccountRecovery($data):array + { + $email = (isset($data['email'])) ? $data['email'] : ''; + $name = (isset($data['name'])) ? $data['name'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'reset' => 'http://localhost/recovery', + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty(3, $response['body']['$uid']); + $this->assertEquals(3, $response['body']['type']); + $this->assertIsNumeric($response['body']['expire']); + + $lastEmail = $this->getLastEmail(); + + $this->assertEquals($email, $lastEmail['to'][0]['address']); + $this->assertEquals($name, $lastEmail['to'][0]['name']); + $this->assertEquals('Password Reset', $lastEmail['subject']); + + $recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&token=', 0) + 7, 256); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'reset' => 'localhost/recovery', + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'reset' => 'http://remotehost/recovery', + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => 'not-found@localhost.test', + 'reset' => 'http://localhost/recovery', + ]); + + $this->assertEquals(404, $response['headers']['status-code']); + + $data['recovery'] = $recovery; + + return $data; + } + + /** + * @depends testCreateAccountRecovery + */ + public function testUpdateAccountRecovery($data):array + { + $uid = (isset($data['uid'])) ? $data['uid'] : ''; + $recovery = (isset($data['recovery'])) ? $data['recovery'] : ''; + $newPassowrd = 'test-recovery'; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'userId' => $uid, + 'token' => $recovery, + 'password-a' => $newPassowrd, + 'password-b' => $newPassowrd, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'userId' => 'ewewe', + 'token' => $recovery, + 'password-a' => $newPassowrd, + 'password-b' => $newPassowrd, + ]); + + $this->assertEquals(404, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'userId' => $uid, + 'token' => 'sdasdasdasd', + 'password-a' => $newPassowrd, + 'password-b' => $newPassowrd, + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'userId' => $uid, + 'token' => $recovery, + 'password-a' => $newPassowrd.'x', + 'password-b' => $newPassowrd, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return $data; + } +} \ No newline at end of file diff --git a/tests/old/Base.php b/tests/old/Base.php new file mode 100644 index 0000000000..24104d782a --- /dev/null +++ b/tests/old/Base.php @@ -0,0 +1,41 @@ +client = new Client(); + + $this->client + ->setEndpoint($this->endpoint) + ; + } + + protected function tearDown(): void + { + $this->client = null; + } + + protected function getLastEmail():array + { + sleep(3); + $emails = json_decode(file_get_contents('http://localhost:1080/email'), true); + + if($emails && is_array($emails)) { + return end($emails); + } + + return []; + } +} diff --git a/tests/e2e/BaseConsole.php b/tests/old/BaseConsole.php similarity index 100% rename from tests/e2e/BaseConsole.php rename to tests/old/BaseConsole.php diff --git a/tests/e2e/BaseProjects.php b/tests/old/BaseProjects.php similarity index 100% rename from tests/e2e/BaseProjects.php rename to tests/old/BaseProjects.php diff --git a/tests/e2e/ConsoleHealthTest.php b/tests/old/ConsoleHealthTest.php similarity index 100% rename from tests/e2e/ConsoleHealthTest.php rename to tests/old/ConsoleHealthTest.php diff --git a/tests/e2e/ConsoleProjectsTest.php b/tests/old/ConsoleProjectsTest.php similarity index 100% rename from tests/e2e/ConsoleProjectsTest.php rename to tests/old/ConsoleProjectsTest.php diff --git a/tests/e2e/ConsoleTest.php b/tests/old/ConsoleTest.php similarity index 100% rename from tests/e2e/ConsoleTest.php rename to tests/old/ConsoleTest.php diff --git a/tests/e2e/ProjectAvatarsTest.php b/tests/old/ProjectAvatarsTest.php similarity index 100% rename from tests/e2e/ProjectAvatarsTest.php rename to tests/old/ProjectAvatarsTest.php diff --git a/tests/e2e/ProjectDatabaseTest.php b/tests/old/ProjectDatabaseTest.php similarity index 100% rename from tests/e2e/ProjectDatabaseTest.php rename to tests/old/ProjectDatabaseTest.php diff --git a/tests/e2e/ProjectLocaleTest.php b/tests/old/ProjectLocaleTest.php similarity index 100% rename from tests/e2e/ProjectLocaleTest.php rename to tests/old/ProjectLocaleTest.php diff --git a/tests/e2e/ProjectStorageTest.php b/tests/old/ProjectStorageTest.php similarity index 100% rename from tests/e2e/ProjectStorageTest.php rename to tests/old/ProjectStorageTest.php diff --git a/tests/e2e/ProjectUsersTest.php b/tests/old/ProjectUsersTest.php similarity index 100% rename from tests/e2e/ProjectUsersTest.php rename to tests/old/ProjectUsersTest.php From a2f9e7ef990b87012be3e38baab7ee70a2885022 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 11 Jan 2020 23:53:57 +0200 Subject: [PATCH 032/237] Updated tests --- app/app.php | 6 +- app/config/roles.php | 12 +- app/controllers/api/account.php | 6 +- app/controllers/api/auth.php | 4 +- docker-compose.yml | 3 +- tests/e2e/AccountBase.php | 154 +++++++++++++------------- tests/e2e/AccountCustomServerTest.php | 30 ++++- tests/e2e/Client.php | 4 + tests/e2e/Scopes/ProjectCustom.php | 47 ++++---- tests/old/AccountTest.php | 2 +- 10 files changed, 153 insertions(+), 115 deletions(-) diff --git a/app/app.php b/app/app.php index a1afaedc15..773af72892 100644 --- a/app/app.php +++ b/app/app.php @@ -120,10 +120,10 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $ $scope = $route->getLabel('scope', 'none'); // Allowed scope for chosen route $scopes = $roles[$role]['scopes']; // Allowed scopes for user role - + // Check if given key match project API keys $key = $project->search('secret', $request->getHeader('X-Appwrite-Key', ''), $project->getAttribute('keys', [])); - + /* * Try app auth when we have project key and no user * Mock user to app and grant API key scopes in addition to default app scopes @@ -138,7 +138,7 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $ ]); $role = Auth::USER_ROLE_APP; - $scopes = array_merge($roles[$role]['scopes'], $key->getAttribute('scopes', [])); + $scopes = $key->getAttribute('scopes', []); Authorization::disable(); // Cancel security segmentation for API keys. } diff --git a/app/config/roles.php b/app/config/roles.php index 9ea6b5eedf..c30570e36b 100644 --- a/app/config/roles.php +++ b/app/config/roles.php @@ -28,6 +28,12 @@ $logged = [ ]; $admins = [ + 'teams.read', + 'teams.write', + 'documents.read', + 'documents.write', + 'files.read', + 'files.write', 'users.read', 'users.write', 'collections.read', @@ -61,15 +67,15 @@ return [ ], ROLE_ADMIN => [ 'label' => 'Admin', - 'scopes' => array_merge($logged, $admins, []), + 'scopes' => array_merge($admins, []), ], ROLE_DEVELOPER => [ 'label' => 'Developer', - 'scopes' => array_merge($logged, $admins, []), + 'scopes' => array_merge($admins, []), ], ROLE_OWNER => [ 'label' => 'Owner', - 'scopes' => array_merge($logged, $admins, []), + 'scopes' => array_merge($admins, []), ], ROLE_APP => [ 'label' => 'Application', diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 850b24a1d3..4fae49c576 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -392,7 +392,7 @@ $utopia->post('/v1/account/sessions') $utopia->get('/v1/account/sessions/oauth/:provider') ->desc('Create Account Session with OAuth') - ->label('error', __DIR__.'/../views/general/error.phtml') + ->label('error', __DIR__.'/../../views/general/error.phtml') ->label('scope', 'public') ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccountSessionOAuth') @@ -434,7 +434,7 @@ $utopia->get('/v1/account/sessions/oauth/:provider') $utopia->get('/v1/account/sessions/oauth/callback/:provider/:projectId') ->desc('OAuth Callback') - ->label('error', __DIR__.'/../views/general/error.phtml') + ->label('error', __DIR__.'/../../views/general/error.phtml') ->label('scope', 'public') ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') @@ -452,7 +452,7 @@ $utopia->get('/v1/account/sessions/oauth/callback/:provider/:projectId') $utopia->get('/v1/account/sessions/oauth/:provider/redirect') ->desc('OAuth Redirect') - ->label('error', __DIR__.'/../views/general/error.phtml') + ->label('error', __DIR__.'/../../views/general/error.phtml') ->label('webhook', 'account.sessions.create') ->label('scope', 'public') ->label('abuse-limit', 50) diff --git a/app/controllers/api/auth.php b/app/controllers/api/auth.php index b303e0181e..23704a6c6d 100644 --- a/app/controllers/api/auth.php +++ b/app/controllers/api/auth.php @@ -431,7 +431,7 @@ $utopia->get('/v1/auth/login/oauth/:provider') $utopia->get('/v1/auth/login/oauth/callback/:provider/:projectId') ->desc('OAuth Callback') - ->label('error', __DIR__.'/../views/general/error.phtml') + ->label('error', __DIR__.'/../../views/general/error.phtml') ->label('scope', 'auth') ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') @@ -449,7 +449,7 @@ $utopia->get('/v1/auth/login/oauth/callback/:provider/:projectId') $utopia->get('/v1/auth/login/oauth/:provider/redirect') ->desc('OAuth Redirect') - ->label('error', __DIR__.'/../views/general/error.phtml') + ->label('error', __DIR__.'/../../views/general/error.phtml') ->label('webhook', 'auth.oauth') ->label('scope', 'auth') ->label('abuse-limit', 50) diff --git a/docker-compose.yml b/docker-compose.yml index 28620ee051..1eb523a09a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -118,11 +118,12 @@ services: - RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD=password maildev: + image: djfarrelly/maildev + restart: unless-stopped ports: - '1080:80' networks: - appwrite - image: djfarrelly/maildev networks: appwrite: diff --git a/tests/e2e/AccountBase.php b/tests/e2e/AccountBase.php index bae6bea2de..aa856dd1dd 100644 --- a/tests/e2e/AccountBase.php +++ b/tests/e2e/AccountBase.php @@ -9,7 +9,7 @@ trait AccountBase public function testCreateAccount():array { $email = uniqid().'user@localhost.test'; - $password = 'passwrod'; + $password = 'password'; $name = 'User Name'; /** @@ -18,7 +18,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'password' => $password, @@ -40,7 +40,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'password' => $password, @@ -71,24 +71,24 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'password' => $password, ]); - $sessionUid = $response['body']['$uid']; - $session = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; - $this->assertEquals($response['headers']['status-code'], 201); + $sessionUid = $response['body']['$uid']; + $session = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_'.$this->getProject()['$uid']]; + /** * Test for FAILURE */ $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email.'x', 'password' => $password, @@ -99,7 +99,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'password' => $password.'x', @@ -110,7 +110,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => '', 'password' => '', @@ -139,8 +139,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 200); @@ -160,7 +160,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -168,8 +168,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session.'xx', - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session.'xx', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -190,8 +190,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account/prefs', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 200); @@ -205,7 +205,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account/prefs', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -227,8 +227,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 200); @@ -266,7 +266,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -288,8 +288,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account/logs', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 200); @@ -353,7 +353,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account/logs', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -378,8 +378,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'name' => $newName ]); @@ -399,7 +399,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -407,8 +407,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ ]); @@ -417,8 +417,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y7' ]); @@ -445,8 +445,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'password' => 'new-password', 'old-password' => $password, @@ -464,7 +464,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'password' => 'new-password', @@ -478,7 +478,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -486,8 +486,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ ]); @@ -512,8 +512,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $newEmail, 'password' => 'new-password', @@ -534,7 +534,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -542,8 +542,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ ]); @@ -568,8 +568,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'prefs' => [ 'key1' => 'value1', @@ -590,7 +590,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -613,22 +613,22 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'password' => $password, ]); $sessionNewUid = $response['body']['$uid']; - $sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + $sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_'.$this->getProject()['$uid']]; $this->assertEquals($response['headers']['status-code'], 201); $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $sessionNew, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 200); @@ -636,8 +636,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/'.$sessionNewUid, [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 204); @@ -645,8 +645,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 200); @@ -657,8 +657,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $sessionNew, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -680,21 +680,21 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'password' => $password, ]); - $sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + $sessionNew = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_'.$this->getProject()['$uid']]; $this->assertEquals($response['headers']['status-code'], 201); $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $sessionNew, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 200); @@ -702,8 +702,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/current', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $sessionNew, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 204); @@ -714,8 +714,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $sessionNew, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -736,8 +736,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 204); @@ -748,8 +748,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, - 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -763,13 +763,13 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'password' => $password, ]); - $data['session'] = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_console']; + $data['session'] = $this->client->parseCookie($response['headers']['set-cookie'])['a_session_'.$this->getProject()['$uid']]; return $data; } @@ -788,7 +788,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'reset' => 'http://localhost/recovery', @@ -813,7 +813,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'reset' => 'localhost/recovery', @@ -824,7 +824,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, 'reset' => 'http://remotehost/recovery', @@ -835,7 +835,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => 'not-found@localhost.test', 'reset' => 'http://localhost/recovery', @@ -863,7 +863,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'userId' => $uid, 'token' => $recovery, @@ -879,7 +879,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'userId' => 'ewewe', 'token' => $recovery, @@ -892,7 +892,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'userId' => $uid, 'token' => 'sdasdasdasd', @@ -905,7 +905,7 @@ trait AccountBase $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'userId' => $uid, 'token' => $recovery, diff --git a/tests/e2e/AccountCustomServerTest.php b/tests/e2e/AccountCustomServerTest.php index 0614d31783..fdb7ccdf4c 100644 --- a/tests/e2e/AccountCustomServerTest.php +++ b/tests/e2e/AccountCustomServerTest.php @@ -2,8 +2,36 @@ namespace Tests\E2E; +use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\Scope; +use Tests\E2E\Scopes\SideServer; -class AccountServerClientTest extends Scope +class AccountCustomServerTest extends Scope { + use ProjectCustom; + use SideServer; + + public function testCreateAccount():array + { + $email = uniqid().'user@localhost.test'; + $password = 'password'; + $name = 'User Name'; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/account', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'X-Appwrite-Key' => $this->getProject()['apiKey'], + ], [ + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + + return []; + } } \ No newline at end of file diff --git a/tests/e2e/Client.php b/tests/e2e/Client.php index 9f4d4bf257..4511f78c98 100644 --- a/tests/e2e/Client.php +++ b/tests/e2e/Client.php @@ -234,6 +234,10 @@ class Client $responseHeaders['status-code'] = $responseStatus; + if($responseStatus === 500) { + echo 'Server error(!): '.json_encode($responseBody)."\n"; + } + return [ 'headers' => $responseHeaders, 'body' => $responseBody diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php index 873e1353bb..c8c95cea10 100644 --- a/tests/e2e/Scopes/ProjectCustom.php +++ b/tests/e2e/Scopes/ProjectCustom.php @@ -6,43 +6,46 @@ use Tests\E2E\Client; trait ProjectCustom { - /** - * @var string - */ - protected $rootEmail = ''; - - /** - * @var string - */ - protected $rootPassword = ''; - /** * @var array */ - protected $project = []; + protected static $project = []; /** * @return array */ public function getProject(): array { - if(!empty($this->project)) { - return $this->project; + if(!empty(self::$project)) { + return self::$project; } + $email = uniqid().'user@localhost.test'; + $password = 'password'; + $name = 'User Name'; + $root = $this->client->call(Client::METHOD_POST, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => 'console', ], [ - 'email' => $this->rootEmail, - 'password' => $this->rootEmail, - 'name' => 'Demo User', + 'email' => $email, + 'password' => $password, + 'name' => $name, ]); $this->assertEquals(201, $root['headers']['status-code']); - $session = $this->client->parseCookie($root['headers']['set-cookie'])['a_session_console']; + $session = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $session = $this->client->parseCookie($session['headers']['set-cookie'])['a_session_console']; $team = $this->client->call(Client::METHOD_POST, '/teams', [ 'origin' => 'http://localhost', @@ -87,9 +90,7 @@ trait ProjectCustom ], [ 'name' => 'Demo Project Key', 'scopes' => [ - 'account', - '', - '', + 'files.read', ], ]); @@ -106,14 +107,12 @@ trait ProjectCustom // 'projectSession' => $this->client->parseCookie($user['headers']['set-cookie'])['a_session_' . $project['body']['$uid']], // ]; - $this->project = [ + self::$project = [ '$uid' => $project['body']['$uid'], 'name' => $project['body']['name'], 'apiKey' => $key['body']['secret'], ]; - var_dump('init project'); - - return $this->project; + return self::$project; } } diff --git a/tests/old/AccountTest.php b/tests/old/AccountTest.php index c600261279..f9a16c9be6 100644 --- a/tests/old/AccountTest.php +++ b/tests/old/AccountTest.php @@ -19,7 +19,7 @@ class AccountTest extends Base public function testCreateAccount():array { $email = uniqid().'user@localhost.test'; - $password = 'passwrod'; + $password = 'password'; $name = 'User Name'; /** From 43dd5c6c2b3c718cfb0dff3e94afa4fa86e8dab8 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 01:13:55 +0200 Subject: [PATCH 033/237] Fixed OAuth issue --- .gitignore | 3 ++- app/config/roles.php | 2 +- app/controllers/api/account.php | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 0494e8fba0..b227c06be4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ /tests/resources/storage/ /.idea/ .DS_Store -.php_cs.cache \ No newline at end of file +.php_cs.cache +.env \ No newline at end of file diff --git a/app/config/roles.php b/app/config/roles.php index c30570e36b..399ab9737a 100644 --- a/app/config/roles.php +++ b/app/config/roles.php @@ -75,7 +75,7 @@ return [ ], ROLE_OWNER => [ 'label' => 'Owner', - 'scopes' => array_merge($admins, []), + 'scopes' => array_merge($logged, $admins, []), ], ROLE_APP => [ 'label' => 'Application', diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 4fae49c576..043c4cde6b 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -436,8 +436,8 @@ $utopia->get('/v1/account/sessions/oauth/callback/:provider/:projectId') ->desc('OAuth Callback') ->label('error', __DIR__.'/../../views/general/error.phtml') ->label('scope', 'public') - ->label('abuse-limit', 50) - ->label('abuse-key', 'ip:{ip}') + //->label('abuse-limit', 50) + //->label('abuse-key', 'ip:{ip}') ->label('docs', false) ->param('projectId', '', function () { return new Text(1024); }, 'Project unique ID') ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth provider') From 511d0c31e642d1f9178f0bbeb7e0eecb836ee620 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 01:16:00 +0200 Subject: [PATCH 034/237] Updated change log --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index f6d3acbffa..b5cbc0d88f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -16,6 +16,7 @@ * Fixed gravatar icons not showing up correctly on the console * Fixed code location of project not found error * Fixed bug where tags element would ignore tab key for parsing new tags +* Fixed OAuth login error saying project UID is missing when its not # Version 0.4.0 (PRE-RELEASE) From 917b5759732d266d6c78c6ba86a8c7033d2ba40f Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 02:19:28 +0200 Subject: [PATCH 035/237] Updated docs --- README.md | 2 +- docs/references/account/create-session.md | 2 +- docs/references/account/create-verification.md | 3 +++ docs/references/account/create.md | 2 +- docs/references/account/update-recovery.md | 2 +- docs/references/account/update-verification.md | 1 + docs/references/auth/confirm-resend.md | 2 +- docs/references/auth/confirm.md | 1 - docs/references/teams/create-team-membership.md | 2 +- docs/references/teams/update-team-membership-status.md | 2 +- 10 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 docs/references/account/create-verification.md create mode 100644 docs/references/account/update-verification.md delete mode 100644 docs/references/auth/confirm.md diff --git a/README.md b/README.md index 2e92e68773..836c1c6170 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ docker-compose up -d --remove-orphans ``` -Once the Docker installation completes, go to http://localhost to access the Appwrite console from your browser. Please notice that on non-linux native hosts, the server might take a few minutes to start after installation completes. +Once the Docker installation completes, go to http://localhost to access the Appwrite console from your browser. Please note that on non-linux native hosts, the server might take a few minutes to start after installation completes. For advanced production and custom installation, check out our Docker [environment variables](docs/tutorials/environment-variables.md) docs. diff --git a/docs/references/account/create-session.md b/docs/references/account/create-session.md index f2689efbbd..e3e221ad7d 100644 --- a/docs/references/account/create-session.md +++ b/docs/references/account/create-session.md @@ -1,5 +1,5 @@ Allow the user to login into his account by providing a valid email and password combination. Use the success and failure arguments to provide a redirect URL\'s back to your app when login is completed. -Please notice that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. When accessing this route using Javascript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. \ No newline at end of file diff --git a/docs/references/account/create-verification.md b/docs/references/account/create-verification.md new file mode 100644 index 0000000000..1710e34068 --- /dev/null +++ b/docs/references/account/create-verification.md @@ -0,0 +1,3 @@ +Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **token** arguments will be passed as query parameters to the URL you have provider to be attached to the verification email. The provided URL should redirect the user back for your app and allow you to complete the verification process by verifying both the **userId** and **token** parameters. Learn more about how to [complete the verification process](/docs/account#updateAccountVerification). + +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/account/create.md b/docs/references/account/create.md index 3f975995f9..17966ffd9d 100644 --- a/docs/references/account/create.md +++ b/docs/references/account/create.md @@ -2,6 +2,6 @@ Use this endpoint to allow a new user to register an account in your project. Us If registration completes successfully user will be sent with a confirmation email in order to confirm he is the owner of the account email address. Use the confirmation parameter to redirect the user from the confirmation email back to your app. When the user is redirected, use the /auth/confirm endpoint to complete the account confirmation. -Please notice that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. When accessing this route using Javascript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. \ No newline at end of file diff --git a/docs/references/account/update-recovery.md b/docs/references/account/update-recovery.md index b7b7819c88..1936120e82 100644 --- a/docs/references/account/update-recovery.md +++ b/docs/references/account/update-recovery.md @@ -1,3 +1,3 @@ Use this endpoint to complete the user account password reset. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. -Please notice that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. \ No newline at end of file +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/account/update-verification.md b/docs/references/account/update-verification.md new file mode 100644 index 0000000000..4b11befa13 --- /dev/null +++ b/docs/references/account/update-verification.md @@ -0,0 +1 @@ +Use this endpoint to complete the user email verification process. Use both the **userId** and **token** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code. \ No newline at end of file diff --git a/docs/references/auth/confirm-resend.md b/docs/references/auth/confirm-resend.md index 30712ace16..c4917e61b2 100644 --- a/docs/references/auth/confirm-resend.md +++ b/docs/references/auth/confirm-resend.md @@ -1,3 +1,3 @@ This endpoint allows the user to request your app to resend him his email confirmation message. The redirect arguments act the same way as in /auth/register endpoint. -Please notice that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. \ No newline at end of file +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/auth/confirm.md b/docs/references/auth/confirm.md deleted file mode 100644 index 1826e605aa..0000000000 --- a/docs/references/auth/confirm.md +++ /dev/null @@ -1 +0,0 @@ -Use this endpoint to complete the confirmation of the user account email address. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/register endpoint. \ No newline at end of file diff --git a/docs/references/teams/create-team-membership.md b/docs/references/teams/create-team-membership.md index 2edba8cd68..a3826109b8 100644 --- a/docs/references/teams/create-team-membership.md +++ b/docs/references/teams/create-team-membership.md @@ -2,4 +2,4 @@ Use this endpoint to invite a new member to your team. An email with a link to j Use the redirect parameter to redirect the user from the invitation email back to your app. When the user is redirected, use the /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the user to the team. -Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. \ No newline at end of file +Please note that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/teams/update-team-membership-status.md b/docs/references/teams/update-team-membership-status.md index 11eaf8ef88..199c243a08 100644 --- a/docs/references/teams/update-team-membership-status.md +++ b/docs/references/teams/update-team-membership-status.md @@ -1,5 +1,5 @@ Use this endpoint to let user accept an invitation to join a team after he is being redirect back to your app from the invitation email. Use the success and failure URL's to redirect users back to your application after the request completes. -Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. +Please note that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. When not using the success or failure redirect arguments this endpoint will result with a 200 status code on success and with 401 status error on failure. This behavior was applied to help the web clients deal with browsers who don't allow to set 3rd party HTTP cookies needed for saving the account session token. \ No newline at end of file From 37756fee71510030378350c56b128f81ff9c48ec Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 02:19:55 +0200 Subject: [PATCH 036/237] Updated docs --- docs/references/auth/confirm-resend.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 docs/references/auth/confirm-resend.md diff --git a/docs/references/auth/confirm-resend.md b/docs/references/auth/confirm-resend.md deleted file mode 100644 index c4917e61b2..0000000000 --- a/docs/references/auth/confirm-resend.md +++ /dev/null @@ -1,3 +0,0 @@ -This endpoint allows the user to request your app to resend him his email confirmation message. The redirect arguments act the same way as in /auth/register endpoint. - -Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. \ No newline at end of file From 211047d92eb2c9db523500ed38203b184916ddf3 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 02:20:35 +0200 Subject: [PATCH 037/237] Updated naming conventions --- app/controllers/api/account.php | 155 ++++++++++++++++++++++++-- app/controllers/api/auth.php | 6 +- app/views/console/account/index.phtml | 2 +- src/Auth/Auth.php | 2 +- tests/e2e/AccountBase.php | 8 +- 5 files changed, 157 insertions(+), 16 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 043c4cde6b..f2975ef0ff 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -575,7 +575,7 @@ $utopia->get('/v1/account/sessions/oauth/:provider/redirect') } } - // Create login token, confirm user account and update OAuth ID and Access Token + // Create session token, verify user account and update OAuth ID and Access Token $secret = Auth::tokenGenerator(); $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; @@ -953,9 +953,9 @@ $utopia->post('/v1/account/recovery') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},email:{param-email}') ->param('email', '', function () { return new Email(); }, 'User account email address.') - ->param('reset', '', function () use ($clients) { return new Host($clients); }, 'Reset URL in your app to redirect the user after the reset token has been sent to the user email.') + ->param('url', '', function () use ($clients) { return new Host($clients); }, 'URL to redirect the user back to your app from the recovery email.') ->action( - function ($email, $reset) use ($request, $response, $projectDB, $register, $audit, $project) { + function ($email, $url) use ($request, $response, $projectDB, $register, $audit, $project) { $profile = $projectDB->getCollection([ // Get user by email address 'limit' => 1, 'first' => true, @@ -996,16 +996,16 @@ $utopia->post('/v1/account/recovery') throw new Exception('Failed to save user to DB', 500); } - $reset = Template::parseURL($reset); - $reset['query'] = Template::mergeQuery(((isset($reset['query'])) ? $reset['query'] : ''), ['userId' => $profile->getUid(), 'token' => $secret]); - $reset = Template::unParseURL($reset); + $url = Template::parseURL($url); + $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $profile->getUid(), 'token' => $secret]); + $url = Template::unParseURL($url); $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.recovery.body')); $body ->setParam('{{direction}}', Locale::getText('settings.direction')) ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) ->setParam('{{name}}', $profile->getAttribute('name')) - ->setParam('{{redirect}}', $reset) + ->setParam('{{redirect}}', $url) ; $mail = $register->get('smtp'); /* @var $mail \PHPMailer\PHPMailer\PHPMailer */ @@ -1025,6 +1025,7 @@ $utopia->post('/v1/account/recovery') $audit ->setParam('userId', $profile->getUid()) ->setParam('event', 'account.recovery.create') + ->setParam('resource', 'users/'.$profile->getUid()) ; $response @@ -1094,10 +1095,150 @@ $utopia->put('/v1/account/recovery') $audit ->setParam('userId', $profile->getUid()) ->setParam('event', 'account.recovery.update') + ->setParam('resource', 'users/'.$profile->getUid()) ; $recovery = $profile->search('$uid', $recovery, $profile->getAttribute('tokens', [])); $response->json($recovery->getArrayCopy(['$uid', 'type', 'expire'])); } + ); + + $utopia->post('/v1/account/verification') + ->desc('Create Verification') + ->label('scope', 'account') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'createAccountVerification') + ->label('sdk.description', '/docs/references/account/create-verification.md') + ->label('abuse-limit', 10) + ->label('abuse-key', 'url:{url},email:{param-email}') + ->param('url', '', function () use ($clients) { return new Host($clients); }, 'URL to redirect the user back to your app from the verification email.') // TODO add our own built-in confirm page + ->action( + function ($url) use ($request, $response, $register, $user, $project, $projectDB, $audit) { + $verificationSecret = Auth::tokenGenerator(); + + $verification = new Document([ + '$collection' => Database::SYSTEM_COLLECTION_TOKENS, + '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], + 'type' => Auth::TOKEN_TYPE_VERIFICATION, + 'secret' => Auth::hash($verificationSecret), // On way hash encryption to protect DB leak + 'expire' => time() + Auth::TOKEN_EXPIRATION_CONFIRM, + 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), + 'ip' => $request->getIP(), + ]); + + Authorization::setRole('user:'.$user->getUid()); + + $verification = $projectDB->createDocument($verification->getArrayCopy()); + + if (false === $verification) { + throw new Exception('Failed saving verification to DB', 500); + } + + $user->setAttribute('tokens', $verification, Document::SET_TYPE_APPEND); + + $user = $projectDB->updateDocument($user->getArrayCopy()); + + if (false === $user) { + throw new Exception('Failed to save user to DB', 500); + } + + $url = Template::parseURL($url); + $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $user->getUid(), 'token' => $verificationSecret]); + $url = Template::unParseURL($url); + + $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.verification.body')); + $body + ->setParam('{{direction}}', Locale::getText('settings.direction')) + ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) + ->setParam('{{name}}', $user->getAttribute('name')) + ->setParam('{{redirect}}', $url) + ; + + $mail = $register->get('smtp'); /* @var $mail \PHPMailer\PHPMailer\PHPMailer */ + + $mail->addAddress($user->getAttribute('email'), $user->getAttribute('name')); + + $mail->Subject = Locale::getText('auth.emails.verification.title'); + $mail->Body = $body->render(); + $mail->AltBody = strip_tags($body->render()); + + try { + $mail->send(); + } catch (\Exception $error) { + throw new Exception('Problem sending mail: ' . $error->getMessage(), 500); + } + + $audit + ->setParam('userId', $user->getUid()) + ->setParam('event', 'account.verification.create') + ->setParam('resource', 'users/'.$user->getUid()) + ; + + $response + ->setStatusCode(Response::STATUS_CODE_CREATED) + ->json($verification->getArrayCopy(['$uid', 'type', 'expire'])) + ; + } + ); + +$utopia->put('/v1/account/verification') + ->desc('Updated Verification') + ->label('scope', 'public') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'updateAccountVerification') + ->label('sdk.description', '/docs/references/account/update-verification.md') + ->label('abuse-limit', 10) + ->label('abuse-key', 'url:{url},userId:{param-userId}') + ->param('userId', '', function () { return new UID(); }, 'User account UID address.') + ->param('token', '', function () { return new Text(256); }, 'Valid reset token.') ->param('password-b', '', function () {return new Password(); }, 'New password again.') + ->action( + function ($userId, $token) use ($response, $user, $projectDB, $audit) { + $profile = $projectDB->getCollection([ // Get user by email address + 'limit' => 1, + 'first' => true, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_USERS, + '$uid='.$userId, + ], + ]); + + if (empty($profile)) { + throw new Exception('User not found', 404); // TODO maybe hide this + } + + $verification = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_VERIFICATION, $token); + + if (!$verification) { + throw new Exception('Invalid verification token', 401); + } + + Authorization::setRole('user:'.$profile->getUid()); + + $profile = $projectDB->updateDocument(array_merge($profile->getArrayCopy(), [ + 'confirm' => true, + ])); + + if (false === $profile) { + throw new Exception('Failed saving user to DB', 500); + } + + /** + * We act like we're updating and validating + * the verification token but actually we don't need it anymore. + */ + if (!$projectDB->deleteDocument($verification)) { + throw new Exception('Failed to remove verification from DB', 500); + } + + $audit + ->setParam('userId', $profile->getUid()) + ->setParam('event', 'account.verification.update') + ->setParam('resource', 'users/'.$user->getUid()) + ; + + $verification = $profile->search('$uid', $verification, $profile->getAttribute('tokens', [])); + + $response->json($verification->getArrayCopy(['$uid', 'type', 'expire'])); + } ); \ No newline at end of file diff --git a/app/controllers/api/auth.php b/app/controllers/api/auth.php index 23704a6c6d..bf3b4f8943 100644 --- a/app/controllers/api/auth.php +++ b/app/controllers/api/auth.php @@ -108,7 +108,7 @@ $utopia->post('/v1/auth/register') ->setAttribute('tokens', new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], - 'type' => Auth::TOKEN_TYPE_CONFIRM, + 'type' => Auth::TOKEN_TYPE_VERIFICATION, 'secret' => Auth::hash($confirmSecret), // On way hash encryption to protect DB leak 'expire' => time() + Auth::TOKEN_EXPIRATION_CONFIRM, 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), @@ -213,7 +213,7 @@ $utopia->post('/v1/auth/register/confirm') throw new Exception('User not found', 404); // TODO maybe hide this } - $token = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_CONFIRM, $token); + $token = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_VERIFICATION, $token); if (!$token) { throw new Exception('Confirmation token is not valid', 401); @@ -258,7 +258,7 @@ $utopia->post('/v1/auth/register/confirm/resend') $user->setAttribute('tokens', new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], - 'type' => Auth::TOKEN_TYPE_CONFIRM, + 'type' => Auth::TOKEN_TYPE_VERIFICATION, 'secret' => Auth::hash($secret), // One way hash encryption to protect DB leak 'expire' => time() + Auth::TOKEN_EXPIRATION_CONFIRM, 'userAgent' => $request->getServer('HTTP_USER_AGENT', 'UNKNOWN'), diff --git a/app/views/console/account/index.phtml b/app/views/console/account/index.phtml index c27c0b343d..f6e174e959 100644 --- a/app/views/console/account/index.phtml +++ b/app/views/console/account/index.phtml @@ -147,7 +147,7 @@

By deleting your account you will lose access to any of your teams and shared data.

-

PLEASE NOTICE: Account deletion is irreversible.

+

PLEASE NOTE: Account deletion is irreversible.

$this->getProject()['$uid'], ], [ 'email' => $email, - 'reset' => 'http://localhost/recovery', + 'url' => 'http://localhost/recovery', ]); $this->assertEquals(201, $response['headers']['status-code']); @@ -816,7 +816,7 @@ trait AccountBase 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, - 'reset' => 'localhost/recovery', + 'url' => 'localhost/recovery', ]); $this->assertEquals(400, $response['headers']['status-code']); @@ -827,7 +827,7 @@ trait AccountBase 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => $email, - 'reset' => 'http://remotehost/recovery', + 'url' => 'http://remotehost/recovery', ]); $this->assertEquals(400, $response['headers']['status-code']); @@ -838,7 +838,7 @@ trait AccountBase 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'email' => 'not-found@localhost.test', - 'reset' => 'http://localhost/recovery', + 'url' => 'http://localhost/recovery', ]); $this->assertEquals(404, $response['headers']['status-code']); From 5d33721e603f6d4352da5a9b8671b6608851347c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 08:35:37 +0200 Subject: [PATCH 038/237] Updated tests structure --- docker-compose.yml | 24 +++++++++---------- .../{ => Services/Account}/AccountBase.php | 2 +- .../Account}/AccountConsoleClientTest.php | 2 +- .../Account}/AccountCustomClientTest.php | 2 +- .../Account}/AccountCustomServerTest.php | 3 ++- 5 files changed, 17 insertions(+), 16 deletions(-) rename tests/e2e/{ => Services/Account}/AccountBase.php (99%) rename tests/e2e/{ => Services/Account}/AccountConsoleClientTest.php (85%) rename tests/e2e/{ => Services/Account}/AccountCustomClientTest.php (85%) rename tests/e2e/{ => Services/Account}/AccountCustomServerTest.php (93%) diff --git a/docker-compose.yml b/docker-compose.yml index 1eb523a09a..a94584dfb8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -104,18 +104,18 @@ services: networks: - appwrite - resque: - image: registry.gitlab.com/appwrite/appwrite/resque-web:v1.0.2 - restart: unless-stopped - networks: - - appwrite - ports: - - "5678:5678" - environment: - - RESQUE_WEB_HOST=redis - - RESQUE_WEB_PORT=6379 - - RESQUE_WEB_HTTP_BASIC_AUTH_USER=user - - RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD=password + # resque: + # image: registry.gitlab.com/appwrite/appwrite/resque-web:v1.0.2 + # restart: unless-stopped + # networks: + # - appwrite + # ports: + # - "5678:5678" + # environment: + # - RESQUE_WEB_HOST=redis + # - RESQUE_WEB_PORT=6379 + # - RESQUE_WEB_HTTP_BASIC_AUTH_USER=user + # - RESQUE_WEB_HTTP_BASIC_AUTH_PASSWORD=password maildev: image: djfarrelly/maildev diff --git a/tests/e2e/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php similarity index 99% rename from tests/e2e/AccountBase.php rename to tests/e2e/Services/Account/AccountBase.php index c7384b5805..e60e41ad24 100644 --- a/tests/e2e/AccountBase.php +++ b/tests/e2e/Services/Account/AccountBase.php @@ -1,6 +1,6 @@ Date: Sun, 12 Jan 2020 09:00:07 +0200 Subject: [PATCH 039/237] Test for CI --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index a94584dfb8..754338967a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -17,7 +17,7 @@ services: - ./phpunit.xml:/usr/share/nginx/html/phpunit.xml - ./tests:/usr/share/nginx/html/tests - ./app:/usr/share/nginx/html/app - - ./vendor:/usr/share/nginx/html/vendor + # - ./vendor:/usr/share/nginx/html/vendor - ./docs:/usr/share/nginx/html/docs - ./public:/usr/share/nginx/html/public - ./src:/usr/share/nginx/html/src From 327b82dffc555bcdb2b158c07880208cf7bddcf2 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 13:11:16 +0200 Subject: [PATCH 040/237] Improved e2e tests --- tests/e2e/Services/Account/AccountBase.php | 2 +- .../Account/AccountCustomServerTest.php | 4 +- tests/e2e/Services/Avatars/AvatarsBase.php | 414 ++++++++++++++++++ .../Avatars/AvatarsConsoleClientTest.php | 14 + .../Avatars/AvatarsCustomClientTest.php | 14 + .../Avatars/AvatarsCustomServerTest.php | 30 ++ tests/e2e/Services/Locale/LocaleBase.php | 236 ++++++++++ .../Locale/LocaleConsoleClientTest.php | 14 + .../Locale/LocaleCustomClientTest.php | 14 + .../Locale/LocaleCustomServerTest.php | 30 ++ tests/old/ProjectAvatarsTest.php | 172 ++++---- tests/old/ProjectLocaleTest.php | 128 +++--- 12 files changed, 919 insertions(+), 153 deletions(-) create mode 100644 tests/e2e/Services/Avatars/AvatarsBase.php create mode 100644 tests/e2e/Services/Avatars/AvatarsConsoleClientTest.php create mode 100644 tests/e2e/Services/Avatars/AvatarsCustomClientTest.php create mode 100644 tests/e2e/Services/Avatars/AvatarsCustomServerTest.php create mode 100644 tests/e2e/Services/Locale/LocaleBase.php create mode 100644 tests/e2e/Services/Locale/LocaleConsoleClientTest.php create mode 100644 tests/e2e/Services/Locale/LocaleCustomClientTest.php create mode 100644 tests/e2e/Services/Locale/LocaleCustomServerTest.php diff --git a/tests/e2e/Services/Account/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php index e60e41ad24..77d60c72bc 100644 --- a/tests/e2e/Services/Account/AccountBase.php +++ b/tests/e2e/Services/Account/AccountBase.php @@ -279,7 +279,7 @@ trait AccountBase */ public function testGetAccountLogs($data):array { - sleep(5); + sleep(10); $session = (isset($data['session'])) ? $data['session'] : ''; /** diff --git a/tests/e2e/Services/Account/AccountCustomServerTest.php b/tests/e2e/Services/Account/AccountCustomServerTest.php index 8561cbc337..14949544fc 100644 --- a/tests/e2e/Services/Account/AccountCustomServerTest.php +++ b/tests/e2e/Services/Account/AccountCustomServerTest.php @@ -19,12 +19,12 @@ class AccountCustomServerTest extends Scope $name = 'User Name'; /** - * Test for SUCCESS + * Test for FAILURE */ $response = $this->client->call(Client::METHOD_POST, '/account', [ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - 'X-Appwrite-Key' => $this->getProject()['apiKey'], + 'x-appwrite-key' => $this->getProject()['apiKey'], ], [ 'email' => $email, 'password' => $password, diff --git a/tests/e2e/Services/Avatars/AvatarsBase.php b/tests/e2e/Services/Avatars/AvatarsBase.php new file mode 100644 index 0000000000..fd39983449 --- /dev/null +++ b/tests/e2e/Services/Avatars/AvatarsBase.php @@ -0,0 +1,414 @@ +client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 200, + 'height' => 200, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 300, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + /** + * Test for FAILURE + */ + + $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/unknown', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 300, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 2001, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return []; + } + + public function testGetBrowser():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 200, + 'height' => 200, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 300, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + /** + * Test for FAILURE + */ + + $response = $this->client->call(Client::METHOD_GET, '/avatars/browsers/unknown', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 300, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 2001, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return []; + } + + public function testGetFlag():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 200, + 'height' => 200, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 300, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/flags/unknown', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 300, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'width' => 2001, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return []; + } + + public function testGetImage():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/image', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'url' => 'https://appwrite.io/images/apple.png', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/image', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'url' => 'https://appwrite.io/images/apple.png', + 'width' => 200, + 'height' => 200, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/image', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'url' => 'https://appwrite.io/images/apple.png', + 'width' => 300, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/image', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'url' => 'https://appwrite.io/images/unknown.png', + 'width' => 300, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(404, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/image', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'url' => 'https://appwrite.io/images/apple.png', + 'width' => 2001, + 'height' => 300, + 'quality' => 30, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + // TODO Add test for non-image file (PDF, WORD) + + return []; + } + + public function testGetFavicon():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/favicon', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'url' => 'https://appwrite.io/', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + // $response = $this->client->call(Client::METHOD_GET, '/avatars/favicon', [ + // 'x-appwrite-project' => $this->getProject()['$uid'], + // ], [ + // 'url' => 'https://www.bbc.com/', + // ]); + + // $this->assertEquals(200, $response['headers']['status-code']); + // $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + // $this->assertNotEmpty($response['body']); + + // $response = $this->client->call(Client::METHOD_GET, '/avatars/favicon', [ + // 'x-appwrite-project' => $this->getProject()['$uid'], + // ], [ + // 'url' => 'https://edition.cnn.com/', + // ]); + + // $this->assertEquals(200, $response['headers']['status-code']); + // $this->assertEquals('image/x-icon; charset=UTF-8', $response['headers']['content-type']); + // $this->assertNotEmpty($response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/favicon', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'url' => 'unknown-address', + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/favicon', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'url' => 'http://unknown-address.test', + ]); + + $this->assertEquals(404, $response['headers']['status-code']); + + return []; + } + + public function testGetQR():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'text' => 'url:https://appwrite.io/', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'text' => 'url:https://appwrite.io/', + 'size' => 200, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'text' => 'url:https://appwrite.io/', + 'size' => 200, + 'margin' => 10, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'text' => 'url:https://appwrite.io/', + 'size' => 200, + 'margin' => 10, + 'download' => 1, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('attachment; filename="qr.png"', $response['headers']['content-disposition']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'text' => 'url:https://appwrite.io/', + 'size' => 1001, + 'margin' => 10, + 'download' => 1, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'text' => 'url:https://appwrite.io/', + 'size' => 400, + 'margin' => 11, + 'download' => 1, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'text' => 'url:https://appwrite.io/', + 'size' => 400, + 'margin' => 10, + 'download' => 2, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Avatars/AvatarsConsoleClientTest.php b/tests/e2e/Services/Avatars/AvatarsConsoleClientTest.php new file mode 100644 index 0000000000..5a86e33f9e --- /dev/null +++ b/tests/e2e/Services/Avatars/AvatarsConsoleClientTest.php @@ -0,0 +1,14 @@ +client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'X-appwrite-key' => $this->getProject()['apiKey'], + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Locale/LocaleBase.php b/tests/e2e/Services/Locale/LocaleBase.php new file mode 100644 index 0000000000..7362b17f36 --- /dev/null +++ b/tests/e2e/Services/Locale/LocaleBase.php @@ -0,0 +1,236 @@ +client->call(Client::METHOD_GET, '/locale', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertArrayHasKey('ip', $response['body']); + $this->assertArrayHasKey('countryCode', $response['body']); + $this->assertArrayHasKey('country', $response['body']); + $this->assertArrayHasKey('continent', $response['body']); + $this->assertArrayHasKey('continentCode', $response['body']); + $this->assertArrayHasKey('eu', $response['body']); + $this->assertArrayHasKey('currency', $response['body']); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testGetCountries():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(194, $response['body']); + $this->assertEquals($response['body']['US'], 'United States'); + + // Test locale code change to ES + + $response = $this->client->call(Client::METHOD_GET, '/locale/countries', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-locale' => 'es', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(194, $response['body']); + $this->assertEquals($response['body']['US'], 'Estados Unidos'); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testGetCountriesEU():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries/eu', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(28, $response['body']); + $this->assertEquals($response['body']['DE'], 'Germany'); + + // Test locale code change to ES + + $response = $this->client->call(Client::METHOD_GET, '/locale/countries/eu', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-locale' => 'es', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(28, $response['body']); + $this->assertEquals($response['body']['DE'], 'Alemania'); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testGetCountriesPhones():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries/phones', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(194, $response['body']); + $this->assertEquals($response['body']['US'], 'United States +1'); + $this->assertEquals($response['body']['IL'], 'Israel +972'); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testGetContinents():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(7, $response['body']); + $this->assertEquals($response['body']['NA'], 'North America'); + + // Test locale code change to ES + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-locale' => 'es', + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(7, $response['body']); + $this->assertEquals($response['body']['NA'], 'América del Norte'); + + + /** + * Test for FAILURE + */ + + return []; + } + + public function testGetCurrencies():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/locale/currencies', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(117, $response['body']); + $this->assertEquals($response['body'][0]['symbol'], '$'); + $this->assertEquals($response['body'][0]['name'], 'US Dollar'); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testLangaugaes(): array + { + /** + * Test for SUCCESS + */ + $languages = require('app/config/locales.php'); + $defaultCountries = require('app/config/locales/en.countries.php'); + $defaultContinents = require('app/config/locales/en.continents.php'); + + foreach ($languages as $lang) { + $response = $this->client->call(Client::METHOD_GET, '/locale/countries', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-locale' => $lang, + ]); + + foreach ($response['body'] as $i => $code) { + $this->assertArrayHasKey($i, $defaultCountries, $i . ' country should be removed from ' . $lang); + } + + foreach (array_keys($defaultCountries) as $i => $code) { + $this->assertArrayHasKey($code, $response['body'], $code . ' country is missing from ' . $lang . ' (total: ' . count($response['body']) . ')'); + } + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertCount(194, $response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-locale' => $lang, + ]); + + foreach ($response['body'] as $i => $code) { + $this->assertArrayHasKey($i, $defaultContinents, $i . ' continent should be removed from ' . $lang); + } + + foreach (array_keys($defaultContinents) as $i => $code) { + $this->assertArrayHasKey($code, $response['body'], $code . ' continent is missing from ' . $lang . ' (total: ' . count($response['body']) . ')'); + } + + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertCount(7, $response['body']); + } + + /** + * Test for FAILURE + */ + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Locale/LocaleConsoleClientTest.php b/tests/e2e/Services/Locale/LocaleConsoleClientTest.php new file mode 100644 index 0000000000..e43f0f50ab --- /dev/null +++ b/tests/e2e/Services/Locale/LocaleConsoleClientTest.php @@ -0,0 +1,14 @@ +client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'X-appwrite-key' => $this->getProject()['apiKey'], + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + + return []; + } +} \ No newline at end of file diff --git a/tests/old/ProjectAvatarsTest.php b/tests/old/ProjectAvatarsTest.php index 7fa39ea74e..791a02bdb1 100644 --- a/tests/old/ProjectAvatarsTest.php +++ b/tests/old/ProjectAvatarsTest.php @@ -16,36 +16,36 @@ class ProjectAvatarsTest extends BaseProjects */ public function testAvatarsCCReadSuccess(array $data): array { - $logo = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'width' => 200, 'height' => 200, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'width' => 300, 'height' => 300, 'quality' => 30, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); return $data; } @@ -55,36 +55,36 @@ class ProjectAvatarsTest extends BaseProjects */ public function testAvatarsBrowserReadSuccess(array $data): array { - $logo = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'width' => 200, 'height' => 200, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/browsers/ch', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'width' => 300, 'height' => 300, 'quality' => 30, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); return $data; } @@ -94,36 +94,36 @@ class ProjectAvatarsTest extends BaseProjects */ public function testAvatarsFlagReadSuccess(array $data): array { - $logo = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'width' => 200, 'height' => 200, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/flags/us', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'width' => 300, 'height' => 300, 'quality' => 30, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); return $data; } @@ -133,30 +133,30 @@ class ProjectAvatarsTest extends BaseProjects */ public function testAvatarsRemoteImageReadSuccess(array $data): array { - $logo = $this->client->call(Client::METHOD_GET, '/avatars/image', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/image', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'url' => 'https://appwrite.io/images/apple.png', ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/image', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/image', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'url' => 'https://appwrite.io/images/apple.png', 'width' => 200, 'height' => 200, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/image', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/image', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'url' => 'https://appwrite.io/images/apple.png', 'width' => 300, @@ -164,9 +164,9 @@ class ProjectAvatarsTest extends BaseProjects 'quality' => 30, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); return $data; } @@ -176,15 +176,15 @@ class ProjectAvatarsTest extends BaseProjects */ public function testAvatarsFaviconReadSuccess(array $data): array { - $logo = $this->client->call(Client::METHOD_GET, '/avatars/favicon', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/favicon', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'url' => 'https://appwrite.io/', ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); return $data; } @@ -194,41 +194,41 @@ class ProjectAvatarsTest extends BaseProjects */ public function testAvatarsQRReadSuccess(array $data): array { - $logo = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'text' => 'url:https://appwrite.io/', ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'text' => 'url:https://appwrite.io/', 'size' => 200, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'text' => 'url:https://appwrite.io/', 'size' => 200, 'margin' => 10, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); - $logo = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ - 'x-appwrite-project' => $data['projectUid'], + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'text' => 'url:https://appwrite.io/', 'size' => 200, @@ -236,10 +236,10 @@ class ProjectAvatarsTest extends BaseProjects 'download' => 1, ]); - $this->assertEquals(200, $logo['headers']['status-code']); - $this->assertEquals('attachment; filename="qr.png"', $logo['headers']['content-disposition']); - $this->assertEquals('image/png; charset=UTF-8', $logo['headers']['content-type']); - $this->assertNotEmpty($logo['body']); + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('attachment; filename="qr.png"', $response['headers']['content-disposition']); + $this->assertEquals('image/png; charset=UTF-8', $response['headers']['content-type']); + $this->assertNotEmpty($response['body']); return $data; } diff --git a/tests/old/ProjectLocaleTest.php b/tests/old/ProjectLocaleTest.php index 97dd215d9c..7bcc156636 100644 --- a/tests/old/ProjectLocaleTest.php +++ b/tests/old/ProjectLocaleTest.php @@ -16,18 +16,18 @@ class ProjectLocaleTest extends BaseProjects */ public function testLocaleReadSuccess(array $data): array { - $locale = $this->client->call(Client::METHOD_GET, '/locale', [ + $response = $this->client->call(Client::METHOD_GET, '/locale', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); - $this->assertArrayHasKey('ip', $locale['body']); - $this->assertArrayHasKey('countryCode', $locale['body']); - $this->assertArrayHasKey('country', $locale['body']); - $this->assertArrayHasKey('continent', $locale['body']); - $this->assertArrayHasKey('continentCode', $locale['body']); - $this->assertArrayHasKey('eu', $locale['body']); - $this->assertArrayHasKey('currency', $locale['body']); + $this->assertArrayHasKey('ip', $response['body']); + $this->assertArrayHasKey('countryCode', $response['body']); + $this->assertArrayHasKey('country', $response['body']); + $this->assertArrayHasKey('continent', $response['body']); + $this->assertArrayHasKey('continentCode', $response['body']); + $this->assertArrayHasKey('eu', $response['body']); + $this->assertArrayHasKey('currency', $response['body']); return $data; } @@ -37,28 +37,28 @@ class ProjectLocaleTest extends BaseProjects */ public function testLocaleCountriesReadSuccess(array $data): array { - $countries = $this->client->call(Client::METHOD_GET, '/locale/countries', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); - $this->assertEquals($countries['headers']['status-code'], 200); - $this->assertIsArray($countries['body']); - $this->assertCount(194, $countries['body']); - $this->assertEquals($countries['body']['US'], 'United States'); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(194, $response['body']); + $this->assertEquals($response['body']['US'], 'United States'); // Test locale code change to ES - $countries = $this->client->call(Client::METHOD_GET, '/locale/countries', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], 'x-appwrite-locale' => 'es', ]); - $this->assertEquals($countries['headers']['status-code'], 200); - $this->assertIsArray($countries['body']); - $this->assertCount(194, $countries['body']); - $this->assertEquals($countries['body']['US'], 'Estados Unidos'); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(194, $response['body']); + $this->assertEquals($response['body']['US'], 'Estados Unidos'); return $data; } @@ -68,28 +68,28 @@ class ProjectLocaleTest extends BaseProjects */ public function testLocaleCountriesEUReadSuccess(array $data): array { - $countries = $this->client->call(Client::METHOD_GET, '/locale/countries/eu', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries/eu', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); - $this->assertEquals($countries['headers']['status-code'], 200); - $this->assertIsArray($countries['body']); - $this->assertCount(28, $countries['body']); - $this->assertEquals($countries['body']['DE'], 'Germany'); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(28, $response['body']); + $this->assertEquals($response['body']['DE'], 'Germany'); // Test locale code change to ES - $countries = $this->client->call(Client::METHOD_GET, '/locale/countries/eu', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries/eu', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], 'x-appwrite-locale' => 'es', ]); - $this->assertEquals($countries['headers']['status-code'], 200); - $this->assertIsArray($countries['body']); - $this->assertCount(28, $countries['body']); - $this->assertEquals($countries['body']['DE'], 'Alemania'); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(28, $response['body']); + $this->assertEquals($response['body']['DE'], 'Alemania'); return $data; } @@ -99,27 +99,27 @@ class ProjectLocaleTest extends BaseProjects */ public function testLocaleContinentsReadSuccess(array $data): array { - $continents = $this->client->call(Client::METHOD_GET, '/locale/continents', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); - $this->assertEquals($continents['headers']['status-code'], 200); - $this->assertIsArray($continents['body']); - $this->assertCount(7, $continents['body']); - $this->assertEquals($continents['body']['NA'], 'North America'); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(7, $response['body']); + $this->assertEquals($response['body']['NA'], 'North America'); // Test locale code change to ES - $continents = $this->client->call(Client::METHOD_GET, '/locale/continents', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], 'x-appwrite-locale' => 'es', ]); - $this->assertEquals($continents['headers']['status-code'], 200); - $this->assertIsArray($continents['body']); - $this->assertCount(7, $continents['body']); - $this->assertEquals($continents['body']['NA'], 'América del Norte'); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(7, $response['body']); + $this->assertEquals($response['body']['NA'], 'América del Norte'); return $data; } @@ -129,16 +129,16 @@ class ProjectLocaleTest extends BaseProjects */ public function testLocaleCurrenciesReadSuccess(array $data): array { - $continents = $this->client->call(Client::METHOD_GET, '/locale/currencies', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/currencies', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); - $this->assertEquals($continents['headers']['status-code'], 200); - $this->assertIsArray($continents['body']); - $this->assertCount(117, $continents['body']); - $this->assertEquals($continents['body'][0]['symbol'], '$'); - $this->assertEquals($continents['body'][0]['name'], 'US Dollar'); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertIsArray($response['body']); + $this->assertCount(117, $response['body']); + $this->assertEquals($response['body'][0]['symbol'], '$'); + $this->assertEquals($response['body'][0]['name'], 'US Dollar'); return $data; } @@ -153,39 +153,39 @@ class ProjectLocaleTest extends BaseProjects $defaultContinents = require('app/config/locales/en.continents.php'); foreach ($languages as $key => $lang) { - $countries = $this->client->call(Client::METHOD_GET, '/locale/countries', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], 'x-appwrite-locale' => $lang, ]); - foreach ($countries['body'] as $i => $code) { + foreach ($response['body'] as $i => $code) { $this->assertArrayHasKey($i, $defaultCountries, $i . ' country should be removed from ' . $lang); } foreach (array_keys($defaultCountries) as $i => $code) { - $this->assertArrayHasKey($code, $countries['body'], $code . ' country is missing from ' . $lang . ' (total: ' . count($countries['body']) . ')'); + $this->assertArrayHasKey($code, $response['body'], $code . ' country is missing from ' . $lang . ' (total: ' . count($response['body']) . ')'); } - $this->assertEquals($countries['headers']['status-code'], 200); - $this->assertCount(194, $countries['body']); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertCount(194, $response['body']); - $continents = $this->client->call(Client::METHOD_GET, '/locale/continents', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], + 'x-appwrite-project' => $this->getProject()['$uid'], 'x-appwrite-locale' => $lang, ]); - foreach ($continents['body'] as $i => $code) { + foreach ($response['body'] as $i => $code) { $this->assertArrayHasKey($i, $defaultContinents, $i . ' continent should be removed from ' . $lang); } foreach (array_keys($defaultContinents) as $i => $code) { - $this->assertArrayHasKey($code, $continents['body'], $code . ' continent is missing from ' . $lang . ' (total: ' . count($continents['body']) . ')'); + $this->assertArrayHasKey($code, $response['body'], $code . ' continent is missing from ' . $lang . ' (total: ' . count($response['body']) . ')'); } - $this->assertEquals($continents['headers']['status-code'], 200); - $this->assertCount(7, $continents['body']); + $this->assertEquals($response['headers']['status-code'], 200); + $this->assertCount(7, $response['body']); } return $data; From f77aa39ff793cef94da24d608955edbdacc46d2d Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 13:46:39 +0200 Subject: [PATCH 041/237] Updated and synced public available scopes --- app/config/roles.php | 3 +++ app/config/scopes.php | 18 ++++++++++-------- app/controllers/api/projects.php | 13 +------------ app/views/console/keys/index.phtml | 14 +------------- tests/e2e/Scopes/ProjectCustom.php | 11 +++++++++++ 5 files changed, 26 insertions(+), 33 deletions(-) diff --git a/app/config/roles.php b/app/config/roles.php index 399ab9737a..9110795419 100644 --- a/app/config/roles.php +++ b/app/config/roles.php @@ -46,6 +46,9 @@ $admins = [ 'tasks.write', 'webhooks.read', 'webhooks.write', + 'locale.read', + 'avatars.read', + 'health.read', ]; return [ diff --git a/app/config/scopes.php b/app/config/scopes.php index ea309401e6..53b71dd78f 100644 --- a/app/config/scopes.php +++ b/app/config/scopes.php @@ -11,12 +11,14 @@ return [ // List of publicly visible scopes 'documents.write', 'files.read', 'files.write', - 'platforms.read', - 'platforms.write', - 'keys.read', - 'keys.write', - 'tasks.read', - 'tasks.write', - 'webhooks.read', - 'webhooks.write', + // 'platforms.read', + // 'platforms.write', + // 'keys.read', + // 'keys.write', + // 'tasks.read', + // 'tasks.write', + // 'webhooks.read', + // 'webhooks.write', + 'locale.read', + 'avatars.read', ];; \ No newline at end of file diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 242264b90b..d10717905c 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -18,18 +18,7 @@ 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', -]; +$scopes = include __DIR__.'/../../../app/config/scopes.php'; $utopia->get('/v1/projects') ->desc('List Projects') diff --git a/app/views/console/keys/index.phtml b/app/views/console/keys/index.phtml index 45f9b1a5f2..a7845dcfd0 100644 --- a/app/views/console/keys/index.phtml +++ b/app/views/console/keys/index.phtml @@ -1,17 +1,5 @@ getParam('scopes', []); ?>

diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php index c8c95cea10..13bf42fbd6 100644 --- a/tests/e2e/Scopes/ProjectCustom.php +++ b/tests/e2e/Scopes/ProjectCustom.php @@ -90,7 +90,18 @@ trait ProjectCustom ], [ 'name' => 'Demo Project Key', 'scopes' => [ + 'users.read', + 'users.write', + 'teams.read', + 'teams.write', + 'collections.read', + 'collections.write', + 'documents.read', + 'documents.write', 'files.read', + 'files.write', + 'locale.read', + 'avatars.read', ], ]); From 3686171d6eaf2901b8911d439edda3deaa576e5a Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 13:47:08 +0200 Subject: [PATCH 042/237] Updated server tests --- tests/e2e/Scopes/SideServer.php | 3 +-- .../Avatars/AvatarsCustomServerTest.php | 17 +----------- tests/e2e/Services/Locale/LocaleBase.php | 27 ++++++++++--------- .../Locale/LocaleCustomServerTest.php | 17 ++---------- 4 files changed, 18 insertions(+), 46 deletions(-) diff --git a/tests/e2e/Scopes/SideServer.php b/tests/e2e/Scopes/SideServer.php index 0f69e597ec..5da9b3311d 100644 --- a/tests/e2e/Scopes/SideServer.php +++ b/tests/e2e/Scopes/SideServer.php @@ -11,9 +11,8 @@ trait SideServer public function getHeaders():array { - return [ - 'x-appwrite-key' => $this->getProject() + 'x-appwrite-key' => $this->getProject()['apiKey'] ]; } } diff --git a/tests/e2e/Services/Avatars/AvatarsCustomServerTest.php b/tests/e2e/Services/Avatars/AvatarsCustomServerTest.php index b162b2e79d..4b22b29cbb 100644 --- a/tests/e2e/Services/Avatars/AvatarsCustomServerTest.php +++ b/tests/e2e/Services/Avatars/AvatarsCustomServerTest.php @@ -9,22 +9,7 @@ use Tests\E2E\Scopes\SideServer; class AvatarsCustomServerTest extends Scope { + use AvatarsBase; use ProjectCustom; use SideServer; - - public function testGetCreditCard():array - { - /** - * Test for FAILURE - */ - $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - 'X-appwrite-key' => $this->getProject()['apiKey'], - ]); - - $this->assertEquals(401, $response['headers']['status-code']); - - return []; - } } \ No newline at end of file diff --git a/tests/e2e/Services/Locale/LocaleBase.php b/tests/e2e/Services/Locale/LocaleBase.php index 7362b17f36..e2aeace8e3 100644 --- a/tests/e2e/Services/Locale/LocaleBase.php +++ b/tests/e2e/Services/Locale/LocaleBase.php @@ -11,11 +11,12 @@ trait LocaleBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/locale', [ + $response = $this->client->call(Client::METHOD_GET, '/locale', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ], $this->getHeaders())); + $this->assertEquals($response['headers']['status-code'], 200); $this->assertArrayHasKey('ip', $response['body']); $this->assertArrayHasKey('countryCode', $response['body']); $this->assertArrayHasKey('country', $response['body']); @@ -27,7 +28,7 @@ trait LocaleBase /** * Test for FAILURE */ - + return []; } @@ -36,10 +37,10 @@ trait LocaleBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/locale/countries', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ], $this->getHeaders())); $this->assertEquals($response['headers']['status-code'], 200); $this->assertIsArray($response['body']); @@ -71,10 +72,10 @@ trait LocaleBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/locale/countries/eu', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries/eu', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ], $this->getHeaders())); $this->assertEquals($response['headers']['status-code'], 200); $this->assertIsArray($response['body']); @@ -106,10 +107,10 @@ trait LocaleBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/locale/countries/phones', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/countries/phones', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ], $this->getHeaders())); $this->assertEquals($response['headers']['status-code'], 200); $this->assertIsArray($response['body']); @@ -129,10 +130,10 @@ trait LocaleBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/locale/continents', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/continents', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ], $this->getHeaders())); $this->assertEquals($response['headers']['status-code'], 200); $this->assertIsArray($response['body']); @@ -164,10 +165,10 @@ trait LocaleBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/locale/currencies', [ + $response = $this->client->call(Client::METHOD_GET, '/locale/currencies', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ], $this->getHeaders())); $this->assertEquals($response['headers']['status-code'], 200); $this->assertIsArray($response['body']); diff --git a/tests/e2e/Services/Locale/LocaleCustomServerTest.php b/tests/e2e/Services/Locale/LocaleCustomServerTest.php index c028aeae02..dc23f5843d 100644 --- a/tests/e2e/Services/Locale/LocaleCustomServerTest.php +++ b/tests/e2e/Services/Locale/LocaleCustomServerTest.php @@ -9,22 +9,9 @@ use Tests\E2E\Scopes\SideServer; class LocaleCustomServerTest extends Scope { + use LocaleBase; use ProjectCustom; use SideServer; - public function testCreateLocale():array - { - /** - * Test for FAILURE - */ - $response = $this->client->call(Client::METHOD_GET, '/avatars/credit-cards/visa', [ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - 'X-appwrite-key' => $this->getProject()['apiKey'], - ]); - - $this->assertEquals(401, $response['headers']['status-code']); - - return []; - } + ///$this->getHeaders() } \ No newline at end of file From 2f843943e18cc3bfd19da750101b5c622794a678 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 17:20:51 +0200 Subject: [PATCH 043/237] Improved health check tests --- app/app.php | 2 +- app/config/roles.php | 2 +- .../Avatars/AvatarsCustomServerTest.php | 1 - tests/e2e/Services/Health/HealthBase.php | 154 ++++++++++++++++++ .../Health/HealthConsoleClientTest.php | 14 ++ .../Health/HealthCustomClientTest.php | 14 ++ .../Health/HealthCustomServerTest.php | 15 ++ .../Locale/LocaleCustomServerTest.php | 2 - tests/old/ConsoleHealthTest.php | 42 ++--- 9 files changed, 220 insertions(+), 26 deletions(-) create mode 100644 tests/e2e/Services/Health/HealthBase.php create mode 100644 tests/e2e/Services/Health/HealthConsoleClientTest.php create mode 100644 tests/e2e/Services/Health/HealthCustomClientTest.php create mode 100644 tests/e2e/Services/Health/HealthCustomServerTest.php diff --git a/app/app.php b/app/app.php index 773af72892..af3e07f0e8 100644 --- a/app/app.php +++ b/app/app.php @@ -138,7 +138,7 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $ ]); $role = Auth::USER_ROLE_APP; - $scopes = $key->getAttribute('scopes', []); + $scopes = array_merge($roles[$role]['scopes'], $key->getAttribute('scopes', [])); Authorization::disable(); // Cancel security segmentation for API keys. } diff --git a/app/config/roles.php b/app/config/roles.php index 9110795419..e690783172 100644 --- a/app/config/roles.php +++ b/app/config/roles.php @@ -82,6 +82,6 @@ return [ ], ROLE_APP => [ 'label' => 'Application', - 'scopes' => ['public'], + 'scopes' => ['health.read'], ], ]; diff --git a/tests/e2e/Services/Avatars/AvatarsCustomServerTest.php b/tests/e2e/Services/Avatars/AvatarsCustomServerTest.php index 4b22b29cbb..be8b4d1a77 100644 --- a/tests/e2e/Services/Avatars/AvatarsCustomServerTest.php +++ b/tests/e2e/Services/Avatars/AvatarsCustomServerTest.php @@ -2,7 +2,6 @@ namespace Tests\E2E\Services\Avatars; -use Tests\E2E\Client; use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\SideServer; diff --git a/tests/e2e/Services/Health/HealthBase.php b/tests/e2e/Services/Health/HealthBase.php new file mode 100644 index 0000000000..e579f46809 --- /dev/null +++ b/tests/e2e/Services/Health/HealthBase.php @@ -0,0 +1,154 @@ +client->call(Client::METHOD_GET, '/health', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('OK', $response['body']['status']); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testDBSuccess():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/health/db', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('OK', $response['body']['status']); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testCacheSuccess():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/health/db', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('OK', $response['body']['status']); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testTimeSuccess():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/health/time', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertIsInt($response['body']['remote']); + $this->assertIsInt($response['body']['local']); + $this->assertNotEmpty($response['body']['remote']); + $this->assertNotEmpty($response['body']['local']); + $this->assertLessThan(10, $response['body']['diff']); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testWebhooksSuccess():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/health/webhooks', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertIsInt($response['body']['size']); + $this->assertLessThan(10, $response['body']['size']); + + /** + * Test for FAILURE + */ + + return []; + } + + public function xtestStorageLocalSuccess():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/health/storage/local', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('OK', $response['body']['status']); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testStorageAntiVirusSuccess():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/health/storage/anti-virus', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('online', $response['body']['status']); + $this->assertStringStartsWith('ClamAV ', $response['body']['version']); + + /** + * Test for FAILURE + */ + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Health/HealthConsoleClientTest.php b/tests/e2e/Services/Health/HealthConsoleClientTest.php new file mode 100644 index 0000000000..f52d51c7ba --- /dev/null +++ b/tests/e2e/Services/Health/HealthConsoleClientTest.php @@ -0,0 +1,14 @@ +getHeaders() } \ No newline at end of file diff --git a/tests/old/ConsoleHealthTest.php b/tests/old/ConsoleHealthTest.php index a664e4d01f..26c49fa959 100644 --- a/tests/old/ConsoleHealthTest.php +++ b/tests/old/ConsoleHealthTest.php @@ -8,10 +8,10 @@ class ConsoleHealthTest extends BaseConsole { public function testHTTPSuccess(): void { - $response = $this->client->call(Client::METHOD_GET, '/health', [ - 'origin' => 'http://localhost', + $response = $this->client->call(Client::METHOD_GET, '/health', array_merge([ 'content-type' => 'application/json', - ], []); + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals('OK', $response['body']['status']); @@ -19,10 +19,10 @@ class ConsoleHealthTest extends BaseConsole public function testDBSuccess(): void { - $response = $this->client->call(Client::METHOD_GET, '/health/db', [ - 'origin' => 'http://localhost', + $response = $this->client->call(Client::METHOD_GET, '/health/db', array_merge([ 'content-type' => 'application/json', - ], []); + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals('OK', $response['body']['status']); @@ -30,10 +30,10 @@ class ConsoleHealthTest extends BaseConsole public function testCacheSuccess(): void { - $response = $this->client->call(Client::METHOD_GET, '/health/db', [ - 'origin' => 'http://localhost', + $response = $this->client->call(Client::METHOD_GET, '/health/db', array_merge([ 'content-type' => 'application/json', - ], []); + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals('OK', $response['body']['status']); @@ -41,10 +41,10 @@ class ConsoleHealthTest extends BaseConsole public function testTimeSuccess(): void { - $response = $this->client->call(Client::METHOD_GET, '/health/time', [ - 'origin' => 'http://localhost', + $response = $this->client->call(Client::METHOD_GET, '/health/time', array_merge([ 'content-type' => 'application/json', - ], []); + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsInt($response['body']['remote']); @@ -56,10 +56,10 @@ class ConsoleHealthTest extends BaseConsole public function testWebhooksSuccess(): void { - $response = $this->client->call(Client::METHOD_GET, '/health/webhooks', [ - 'origin' => 'http://localhost', + $response = $this->client->call(Client::METHOD_GET, '/health/webhooks', array_merge([ 'content-type' => 'application/json', - ], []); + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsInt($response['body']['size']); @@ -68,10 +68,10 @@ class ConsoleHealthTest extends BaseConsole public function xtestStorageLocalSuccess(): void { - $response = $this->client->call(Client::METHOD_GET, '/health/storage/local', [ - 'origin' => 'http://localhost', + $response = $this->client->call(Client::METHOD_GET, '/health/storage/local', array_merge([ 'content-type' => 'application/json', - ], []); + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals('OK', $response['body']['status']); @@ -79,10 +79,10 @@ class ConsoleHealthTest extends BaseConsole public function testStorageAntiVirusSuccess(): void { - $response = $this->client->call(Client::METHOD_GET, '/health/storage/anti-virus', [ - 'origin' => 'http://localhost', + $response = $this->client->call(Client::METHOD_GET, '/health/storage/anti-virus', array_merge([ 'content-type' => 'application/json', - ], []); + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), []); $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals('online', $response['body']['status']); From e30deaf7b7f181feff3f166ee8cc8d09956104e2 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 12 Jan 2020 23:28:26 +0200 Subject: [PATCH 044/237] New tests --- tests/e2e/Scopes/ProjectCustom.php | 33 +-- tests/e2e/Scopes/Scope.php | 102 ++++++++- tests/e2e/Scopes/SideClient.php | 5 +- tests/e2e/Services/Account/AccountBase.php | 205 +++++++++--------- tests/e2e/Services/Storage/StorageBase.php | 196 +++++++++++++++++ .../Storage/StorageConsoleClientTest.php | 14 ++ .../Storage/StorageCustomClientTest.php | 14 ++ .../Storage/StorageCustomServerTest.php | 14 ++ tests/old/ProjectStorageTest.php | 57 +++-- 9 files changed, 475 insertions(+), 165 deletions(-) create mode 100644 tests/e2e/Services/Storage/StorageBase.php create mode 100644 tests/e2e/Services/Storage/StorageConsoleClientTest.php create mode 100644 tests/e2e/Services/Storage/StorageCustomClientTest.php create mode 100644 tests/e2e/Services/Storage/StorageCustomServerTest.php diff --git a/tests/e2e/Scopes/ProjectCustom.php b/tests/e2e/Scopes/ProjectCustom.php index 13bf42fbd6..e048a62162 100644 --- a/tests/e2e/Scopes/ProjectCustom.php +++ b/tests/e2e/Scopes/ProjectCustom.php @@ -20,37 +20,10 @@ trait ProjectCustom return self::$project; } - $email = uniqid().'user@localhost.test'; - $password = 'password'; - $name = 'User Name'; - - $root = $this->client->call(Client::METHOD_POST, '/account', [ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', - ], [ - 'email' => $email, - 'password' => $password, - 'name' => $name, - ]); - - $this->assertEquals(201, $root['headers']['status-code']); - - $session = $this->client->call(Client::METHOD_POST, '/account/sessions', [ - 'origin' => 'http://localhost', - 'content-type' => 'application/json', - 'x-appwrite-project' => 'console', - ], [ - 'email' => $email, - 'password' => $password, - ]); - - $session = $this->client->parseCookie($session['headers']['set-cookie'])['a_session_console']; - $team = $this->client->call(Client::METHOD_POST, '/teams', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, + 'cookie' => 'a_session_console=' . $this->getRoot()['session'], 'x-appwrite-project' => 'console', ], [ 'name' => 'Demo Project Team', @@ -63,7 +36,7 @@ trait ProjectCustom $project = $this->client->call(Client::METHOD_POST, '/projects', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, + 'cookie' => 'a_session_console=' . $this->getRoot()['session'], 'x-appwrite-project' => 'console', ], [ 'name' => 'Demo Project', @@ -85,7 +58,7 @@ trait ProjectCustom $key = $this->client->call(Client::METHOD_POST, '/projects/' . $project['body']['$uid'] . '/keys', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_console=' . $session, + 'cookie' => 'a_session_console=' . $this->getRoot()['session'], 'x-appwrite-project' => 'console', ], [ 'name' => 'Demo Project Key', diff --git a/tests/e2e/Scopes/Scope.php b/tests/e2e/Scopes/Scope.php index 60937da0bb..d9b6881cd1 100644 --- a/tests/e2e/Scopes/Scope.php +++ b/tests/e2e/Scopes/Scope.php @@ -52,4 +52,104 @@ abstract class Scope extends TestCase * @return array */ abstract public function getProject():array; -} + + /** + * @var array + */ + protected static $root = []; + + /** + * @return array + */ + public function getRoot(): array + { + if((self::$root)) { + return self::$root; + } + + $email = uniqid().'user@localhost.test'; + $password = 'password'; + $name = 'User Name'; + + $root = $this->client->call(Client::METHOD_POST, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]); + + $this->assertEquals(201, $root['headers']['status-code']); + + $session = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $session = $this->client->parseCookie($session['headers']['set-cookie'])['a_session_console']; + + self::$root = [ + '$uid' => $root['body']['$uid'], + 'name' => $root['body']['name'], + 'session' => $session, + ]; + + return self::$root; + } + + /** + * @var array + */ + protected static $user = []; + + /** + * @return array + */ + public function getUser(): array + { + if(isset(self::$user[$this->getProject()['$uid']])) { + return self::$user[$this->getProject()['$uid']]; + } + + $email = uniqid().'user@localhost.test'; + $password = 'password'; + $name = 'User Name'; + + $user = $this->client->call(Client::METHOD_POST, '/account', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'email' => $email, + 'password' => $password, + 'name' => $name, + ]); + + $this->assertEquals(201, $user['headers']['status-code']); + + $session = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], [ + 'email' => $email, + 'password' => $password, + ]); + + $session = $this->client->parseCookie($session['headers']['set-cookie'])['a_session_'.$this->getProject()['$uid']]; + + self::$user[$this->getProject()['$uid']] = [ + '$uid' => $user['body']['$uid'], + 'name' => $user['body']['name'], + 'session' => $session, + ]; + + return self::$user[$this->getProject()['$uid']]; + } +} \ No newline at end of file diff --git a/tests/e2e/Scopes/SideClient.php b/tests/e2e/Scopes/SideClient.php index 2e442ef7af..0a2654d9f3 100644 --- a/tests/e2e/Scopes/SideClient.php +++ b/tests/e2e/Scopes/SideClient.php @@ -6,6 +6,9 @@ trait SideClient { public function getHeaders():array { - return []; + return [ + 'origin' => 'http://localhost', + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $this->getUser()['session'], + ]; } } diff --git a/tests/e2e/Services/Account/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php index 77d60c72bc..d0b1973dff 100644 --- a/tests/e2e/Services/Account/AccountBase.php +++ b/tests/e2e/Services/Account/AccountBase.php @@ -15,11 +15,11 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_POST, '/account', [ + $response = $this->client->call(Client::METHOD_POST, '/account', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'password' => $password, 'name' => $name, @@ -37,11 +37,11 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_POST, '/account', [ + $response = $this->client->call(Client::METHOD_POST, '/account', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'password' => $password, 'name' => $name, @@ -68,11 +68,11 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'password' => $password, ]); @@ -85,33 +85,33 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email.'x', 'password' => $password, ]); $this->assertEquals($response['headers']['status-code'], 401); - $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'password' => $password.'x', ]); $this->assertEquals($response['headers']['status-code'], 401); - $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => '', 'password' => '', ]); @@ -136,12 +136,12 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/account', [ + $response = $this->client->call(Client::METHOD_GET, '/account', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ])); $this->assertEquals($response['headers']['status-code'], 200); $this->assertNotEmpty($response['body']); @@ -157,16 +157,14 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_GET, '/account', [ - 'origin' => 'http://localhost', + $response = $this->client->call(Client::METHOD_GET, '/account', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); $response = $this->client->call(Client::METHOD_GET, '/account', [ - 'origin' => 'http://localhost', 'content-type' => 'application/json', 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session.'xx', 'x-appwrite-project' => $this->getProject()['$uid'], @@ -187,12 +185,12 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/account/prefs', [ + $response = $this->client->call(Client::METHOD_GET, '/account/prefs', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ])); $this->assertEquals($response['headers']['status-code'], 200); $this->assertIsArray($response['body']); @@ -202,11 +200,11 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_GET, '/account/prefs', [ + $response = $this->client->call(Client::METHOD_GET, '/account/prefs', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); @@ -224,12 +222,12 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_GET, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ])); $this->assertEquals($response['headers']['status-code'], 200); $this->assertIsArray($response['body']); @@ -263,11 +261,11 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_GET, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_GET, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); @@ -285,12 +283,12 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/account/logs', [ + $response = $this->client->call(Client::METHOD_GET, '/account/logs', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ])); $this->assertEquals($response['headers']['status-code'], 200); $this->assertIsArray($response['body']); @@ -350,11 +348,11 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_GET, '/account/logs', [ + $response = $this->client->call(Client::METHOD_GET, '/account/logs', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); @@ -375,12 +373,12 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ 'name' => $newName ]); @@ -396,30 +394,30 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); - $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ ]); $this->assertEquals($response['headers']['status-code'], 400); - $response = $this->client->call(Client::METHOD_PATCH, '/account/name', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/name', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ 'name' => 'ocSRq1d3QphHivJyUmYY7WMnrxyjdk5YvVwcDqx2zS0coxESN8RmsQwLWw5Whnf0WbVohuFWTRAaoKgCOO0Y0M7LwgFnZmi8881Y7' ]); @@ -442,12 +440,12 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ 'password' => 'new-password', 'old-password' => $password, ]); @@ -461,11 +459,11 @@ trait AccountBase $this->assertEquals($response['body']['email'], $email); $this->assertEquals($response['body']['name'], 'New Name'); - $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'password' => 'new-password', ]); @@ -475,20 +473,20 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); - $response = $this->client->call(Client::METHOD_PATCH, '/account/password', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/password', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ ]); $this->assertEquals($response['headers']['status-code'], 400); @@ -509,12 +507,12 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ 'email' => $newEmail, 'password' => 'new-password', ]); @@ -531,20 +529,20 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); - $response = $this->client->call(Client::METHOD_PATCH, '/account/email', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/email', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ ]); $this->assertEquals($response['headers']['status-code'], 400); @@ -565,12 +563,12 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ 'prefs' => [ 'key1' => 'value1', 'key2' => 'value2', @@ -587,11 +585,11 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', [ + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); @@ -610,11 +608,11 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'password' => $password, ]); @@ -627,27 +625,27 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, 'x-appwrite-project' => $this->getProject()['$uid'], + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, ]); $this->assertEquals($response['headers']['status-code'], 200); - $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/'.$sessionNewUid, [ + $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions/'.$sessionNewUid, array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, + ])); $this->assertEquals($response['headers']['status-code'], 204); - $response = $this->client->call(Client::METHOD_GET, '/account', [ + $response = $this->client->call(Client::METHOD_GET, '/account', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ])); $this->assertEquals($response['headers']['status-code'], 200); @@ -657,8 +655,8 @@ trait AccountBase $response = $this->client->call(Client::METHOD_GET, '/account', [ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, 'x-appwrite-project' => $this->getProject()['$uid'], + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $sessionNew, ]); $this->assertEquals($response['headers']['status-code'], 401); @@ -677,11 +675,11 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'password' => $password, ]); @@ -733,24 +731,23 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_DELETE, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ])); $this->assertEquals($response['headers']['status-code'], 204); /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_GET, '/account', [ + $response = $this->client->call(Client::METHOD_GET, '/account', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', - 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, 'x-appwrite-project' => $this->getProject()['$uid'], - ]); + ])); $this->assertEquals($response['headers']['status-code'], 401); @@ -760,11 +757,11 @@ trait AccountBase $email = (isset($data['email'])) ? $data['email'] : ''; $password = (isset($data['password'])) ? $data['password'] : ''; - $response = $this->client->call(Client::METHOD_POST, '/account/sessions', [ + $response = $this->client->call(Client::METHOD_POST, '/account/sessions', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'password' => $password, ]); @@ -785,11 +782,11 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'url' => 'http://localhost/recovery', ]); @@ -810,33 +807,33 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'url' => 'localhost/recovery', ]); $this->assertEquals(400, $response['headers']['status-code']); - $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => $email, 'url' => 'http://remotehost/recovery', ]); $this->assertEquals(400, $response['headers']['status-code']); - $response = $this->client->call(Client::METHOD_POST, '/account/recovery', [ + $response = $this->client->call(Client::METHOD_POST, '/account/recovery', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'email' => 'not-found@localhost.test', 'url' => 'http://localhost/recovery', ]); @@ -860,11 +857,11 @@ trait AccountBase /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'userId' => $uid, 'token' => $recovery, 'password-a' => $newPassowrd, @@ -876,11 +873,11 @@ trait AccountBase /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'userId' => 'ewewe', 'token' => $recovery, 'password-a' => $newPassowrd, @@ -889,11 +886,11 @@ trait AccountBase $this->assertEquals(404, $response['headers']['status-code']); - $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'userId' => $uid, 'token' => 'sdasdasdasd', 'password-a' => $newPassowrd, @@ -902,11 +899,11 @@ trait AccountBase $this->assertEquals(401, $response['headers']['status-code']); - $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', [ + $response = $this->client->call(Client::METHOD_PUT, '/account/recovery', array_merge([ 'origin' => 'http://localhost', 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], - ], [ + ]), [ 'userId' => $uid, 'token' => $recovery, 'password-a' => $newPassowrd.'x', diff --git a/tests/e2e/Services/Storage/StorageBase.php b/tests/e2e/Services/Storage/StorageBase.php new file mode 100644 index 0000000000..a32111d13c --- /dev/null +++ b/tests/e2e/Services/Storage/StorageBase.php @@ -0,0 +1,196 @@ +client->call(Client::METHOD_POST, '/storage/files', array_merge([ + 'content-type' => 'multipart/form-data', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'files' => new CURLFile(realpath(__DIR__ . '/../../../resources/logo.png'), 'image/png', 'logo.png'), + 'read' => ['*'], + 'write' => ['*'], + 'folderId' => 'xyz', + ]); + + $this->assertEquals($file['headers']['status-code'], 201); + $this->assertNotEmpty($file['body'][0]['$uid']); + $this->assertEquals('files', $file['body'][0]['$collection']); + $this->assertIsInt($file['body'][0]['dateCreated']); + $this->assertEquals('logo.png', $file['body'][0]['name']); + $this->assertEquals('image/png', $file['body'][0]['mimeType']); + $this->assertEquals(47218, $file['body'][0]['sizeOriginal']); + $this->assertEquals(54944, $file['body'][0]['sizeActual']); + $this->assertEquals('gzip', $file['body'][0]['algorithm']); + $this->assertEquals('1', $file['body'][0]['fileOpenSSLVersion']); + $this->assertEquals('aes-128-gcm', $file['body'][0]['fileOpenSSLCipher']); + $this->assertNotEmpty($file['body'][0]['fileOpenSSLTag']); + $this->assertNotEmpty($file['body'][0]['fileOpenSSLIV']); + + /** + * Test for FAILURE + */ + return ['fileId' => $file['body'][0]['$uid']]; + } + + /** + * @depends testCreateFile + */ + public function testGetFile(array $data):array + { + /** + * Test for SUCCESS + */ + $file1 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($file1['headers']['status-code'], 200); + $this->assertNotEmpty($file1['body']['$uid']); + $this->assertIsInt($file1['body']['dateCreated']); + $this->assertEquals('logo.png', $file1['body']['name']); + $this->assertEquals('image/png', $file1['body']['mimeType']); + $this->assertEquals(47218, $file1['body']['sizeOriginal']); + //$this->assertEquals(54944, $file1['body']['sizeActual']); + //$this->assertEquals('gzip', $file1['body']['algorithm']); + //$this->assertEquals('1', $file1['body']['fileOpenSSLVersion']); + //$this->assertEquals('aes-128-gcm', $file1['body']['fileOpenSSLCipher']); + //$this->assertNotEmpty($file1['body']['fileOpenSSLTag']); + //$this->assertNotEmpty($file1['body']['fileOpenSSLIV']); + $this->assertIsArray($file1['body']['$permissions']['read']); + $this->assertIsArray($file1['body']['$permissions']['write']); + $this->assertCount(1, $file1['body']['$permissions']['read']); + $this->assertCount(1, $file1['body']['$permissions']['write']); + + $file2 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/preview', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $file2['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $file2['headers']['content-type']); + $this->assertNotEmpty($file2['body']); + + $file3 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/download', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $file3['headers']['status-code']); + $this->assertEquals('attachment; filename="logo.png"', $file3['headers']['content-disposition']); + $this->assertEquals('image/png; charset=UTF-8', $file3['headers']['content-type']); + $this->assertNotEmpty($file3['body']); + + $file4 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/view', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $file4['headers']['status-code']); + $this->assertEquals('image/png; charset=UTF-8', $file4['headers']['content-type']); + $this->assertNotEmpty($file4['body']); + + /** + * Test for FAILURE + */ + + return $data; + } + + /** + * @depends testGetFile + */ + public function testListFiles(array $data):array + { + /** + * Test for SUCCESS + */ + $files = $this->client->call(Client::METHOD_GET, '/storage/files', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $files['headers']['status-code']); + $this->assertGreaterThan(0, $files['body']['sum']); + $this->assertGreaterThan(0, count($files['body']['files'])); + + /** + * Test for FAILURE + */ + + return $data; + } + + /** + * @depends testListFiles + */ + public function testUpdateFile(array $data):array + { + /** + * Test for SUCCESS + */ + $file = $this->client->call(Client::METHOD_PUT, '/storage/files/' . $data['fileId'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'read' => ['*'], + 'write' => ['*'], + ]); + + $this->assertEquals(200, $file['headers']['status-code']); + $this->assertNotEmpty($file['body']['$uid']); + $this->assertIsInt($file['body']['dateCreated']); + $this->assertEquals('logo.png', $file['body']['name']); + $this->assertEquals('image/png', $file['body']['mimeType']); + $this->assertEquals(47218, $file['body']['sizeOriginal']); + //$this->assertEquals(54944, $file['body']['sizeActual']); + //$this->assertEquals('gzip', $file['body']['algorithm']); + //$this->assertEquals('1', $file['body']['fileOpenSSLVersion']); + //$this->assertEquals('aes-128-gcm', $file['body']['fileOpenSSLCipher']); + //$this->assertNotEmpty($file['body']['fileOpenSSLTag']); + //$this->assertNotEmpty($file['body']['fileOpenSSLIV']); + $this->assertIsArray($file['body']['$permissions']['read']); + $this->assertIsArray($file['body']['$permissions']['write']); + $this->assertCount(1, $file['body']['$permissions']['read']); + $this->assertCount(1, $file['body']['$permissions']['write']); + + /** + * Test for FAILURE + */ + + return $data; + } + + /** + * @depends testUpdateFile + */ + public function testDeleteFile(array $data):array + { + /** + * Test for SUCCESS + */ + $file = $this->client->call(Client::METHOD_DELETE, '/storage/files/' . $data['fileId'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(204, $file['headers']['status-code']); + $this->assertEmpty($file['body']); + + /** + * Test for FAILURE + */ + + return $data; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Storage/StorageConsoleClientTest.php b/tests/e2e/Services/Storage/StorageConsoleClientTest.php new file mode 100644 index 0000000000..b2c9582960 --- /dev/null +++ b/tests/e2e/Services/Storage/StorageConsoleClientTest.php @@ -0,0 +1,14 @@ +client->call(Client::METHOD_POST, '/storage/files', [ 'content-type' => 'multipart/form-data', 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], ], [ 'files' => new CURLFile(realpath(__DIR__ . '/../resources/logo.png'), 'image/png', 'logo.png'), 'read' => ['*'], @@ -50,10 +49,10 @@ class ProjectStorafeTest extends BaseProjects */ public function testFileReadSuccess(array $data): array { - $file1 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'], [ - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], - ]); + $file1 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); $this->assertEquals($file1['headers']['status-code'], 200); $this->assertNotEmpty($file1['body']['$uid']); @@ -72,29 +71,29 @@ class ProjectStorafeTest extends BaseProjects $this->assertCount(1, $file1['body']['$permissions']['read']); $this->assertCount(1, $file1['body']['$permissions']['write']); - $file2 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/preview', [ - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], - ]); + $file2 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/preview', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); $this->assertEquals(200, $file2['headers']['status-code']); $this->assertEquals('image/png; charset=UTF-8', $file2['headers']['content-type']); $this->assertNotEmpty($file2['body']); - $file3 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/download', [ - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], - ]); + $file3 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/download', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); $this->assertEquals(200, $file3['headers']['status-code']); $this->assertEquals('attachment; filename="logo.png"', $file3['headers']['content-disposition']); $this->assertEquals('image/png; charset=UTF-8', $file3['headers']['content-type']); $this->assertNotEmpty($file3['body']); - $file4 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/view', [ - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], - ]); + $file4 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/view', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); $this->assertEquals(200, $file4['headers']['status-code']); $this->assertEquals('image/png; charset=UTF-8', $file4['headers']['content-type']); @@ -108,10 +107,10 @@ class ProjectStorafeTest extends BaseProjects */ public function testFileListSuccess(array $data): array { - $files = $this->client->call(Client::METHOD_GET, '/storage/files', [ - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], - ]); + $files = $this->client->call(Client::METHOD_GET, '/storage/files', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); $this->assertEquals(200, $files['headers']['status-code']); $this->assertEquals(1, $files['body']['sum']); @@ -125,10 +124,10 @@ class ProjectStorafeTest extends BaseProjects */ public function testFileUpdateSuccess(array $data): array { - $file = $this->client->call(Client::METHOD_PUT, '/storage/files/' . $data['fileId'], [ - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], - ], [ + $file = $this->client->call(Client::METHOD_PUT, '/storage/files/' . $data['fileId'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ 'read' => ['*'], 'write' => ['*'], ]); @@ -158,10 +157,10 @@ class ProjectStorafeTest extends BaseProjects */ public function testFileDeleteSuccess(array $data): array { - $file = $this->client->call(Client::METHOD_DELETE, '/storage/files/' . $data['fileId'], [ - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], - ]); + $file = $this->client->call(Client::METHOD_DELETE, '/storage/files/' . $data['fileId'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); $this->assertEquals(204, $file['headers']['status-code']); $this->assertEmpty($file['body']); From ea7104890503a2043ef910ca5ef90a680c51e222 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 13 Jan 2020 10:46:09 +0200 Subject: [PATCH 045/237] Added DB tests - work in progress --- tests/e2e/Services/Database/DatabaseBase.php | 525 ++++++++++++++++++ .../Database/DatabaseConsoleClientTest.php | 14 + .../Database/DatabaseCustomClientTest.php | 14 + .../Database/DatabaseCustomServerTest.php | 14 + tests/old/ProjectDatabaseTest.php | 75 +-- 5 files changed, 592 insertions(+), 50 deletions(-) create mode 100644 tests/e2e/Services/Database/DatabaseBase.php create mode 100644 tests/e2e/Services/Database/DatabaseConsoleClientTest.php create mode 100644 tests/e2e/Services/Database/DatabaseCustomClientTest.php create mode 100644 tests/e2e/Services/Database/DatabaseCustomServerTest.php diff --git a/tests/e2e/Services/Database/DatabaseBase.php b/tests/e2e/Services/Database/DatabaseBase.php new file mode 100644 index 0000000000..bd9a5c8522 --- /dev/null +++ b/tests/e2e/Services/Database/DatabaseBase.php @@ -0,0 +1,525 @@ +client->call(Client::METHOD_POST, '/database', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'name' => 'Actors', + 'read' => ['*'], + 'write' => ['role:1', 'role:2'], + 'rules' => [ + [ + 'label' => 'First Name', + 'key' => 'firstName', + 'type' => 'text', + 'default' => '', + 'required' => true, + 'array' => false + ], + [ + 'label' => 'Last Name', + 'key' => 'lastName', + 'type' => 'text', + 'default' => '', + 'required' => true, + 'array' => false + ], + ], + ]); + + $this->assertEquals($actors['headers']['status-code'], 201); + $this->assertEquals($actors['body']['$collection'], 0); + $this->assertEquals($actors['body']['name'], 'Actors'); + $this->assertIsArray($actors['body']['$permissions']); + $this->assertIsArray($actors['body']['$permissions']['read']); + $this->assertIsArray($actors['body']['$permissions']['write']); + $this->assertCount(1, $actors['body']['$permissions']['read']); + $this->assertCount(2, $actors['body']['$permissions']['write']); + + $movies = $this->client->call(Client::METHOD_POST, '/database', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'name' => 'Movies', + 'read' => ['*'], + 'write' => ['role:1', 'role:2'], + 'rules' => [ + [ + 'label' => 'Name', + 'key' => 'name', + 'type' => 'text', + 'default' => '', + 'required' => true, + 'array' => false + ], + [ + 'label' => 'Release Year', + 'key' => 'releaseYear', + 'type' => 'numeric', + 'default' => 0, + 'required' => false, + 'array' => false + ], + [ + 'label' => 'Actors', + 'key' => 'actors', + 'type' => 'document', + 'default' => [], + 'required' => false, + 'array' => true, + 'list' => [$actors['body']['$uid']], + ], + ], + ]); + + $this->assertEquals($movies['headers']['status-code'], 201); + $this->assertEquals($movies['body']['$collection'], 0); + $this->assertEquals($movies['body']['name'], 'Movies'); + $this->assertIsArray($movies['body']['$permissions']); + $this->assertIsArray($movies['body']['$permissions']['read']); + $this->assertIsArray($movies['body']['$permissions']['write']); + $this->assertCount(1, $movies['body']['$permissions']['read']); + $this->assertCount(2, $movies['body']['$permissions']['write']); + + return array_merge(['moviesId' => $movies['body']['$uid'], 'actorsId' => $actors['body']['$uid']]); + } + + /** + * @depends testCreateCollection + */ + public function testCreateDocument(array $data):array + { + $document1 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Captain America', + 'releaseYear' => 1944, + 'actors' => [ + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Chris', + 'lastName' => 'Evans', + ], + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Samuel', + 'lastName' => 'Jackson', + ], + ] + ] + ]); + + $document2 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Spider-Man: Far From Home', + 'releaseYear' => 2019, + 'actors' => [ + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Tom', + 'lastName' => 'Holland', + ], + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Zendaya', + 'lastName' => 'Maree Stoermer', + ], + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Samuel', + 'lastName' => 'Jackson', + ], + ] + ] + ]); + + $document3 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Spider-Man: Homecoming', + 'releaseYear' => 2017, + 'actors' => [ + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Tom', + 'lastName' => 'Holland', + ], + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Zendaya', + 'lastName' => 'Maree Stoermer', + ], + ], + ] + ]); + + $document4 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'releaseYear' => 2020, // Missing title, expect an 400 error + ] + ]); + + $this->assertEquals($document1['headers']['status-code'], 201); + $this->assertEquals($document1['body']['$collection'], $data['moviesId']); + $this->assertEquals($document1['body']['name'], 'Captain America'); + $this->assertEquals($document1['body']['releaseYear'], 1944); + $this->assertIsArray($document1['body']['$permissions']); + $this->assertIsArray($document1['body']['$permissions']['read']); + $this->assertIsArray($document1['body']['$permissions']['write']); + $this->assertCount(0, $document1['body']['$permissions']['read']); + $this->assertCount(0, $document1['body']['$permissions']['write']); + $this->assertCount(2, $document1['body']['actors']); + + $this->assertEquals($document2['headers']['status-code'], 201); + $this->assertEquals($document2['body']['$collection'], $data['moviesId']); + $this->assertEquals($document2['body']['name'], 'Spider-Man: Far From Home'); + $this->assertEquals($document2['body']['releaseYear'], 2019); + $this->assertIsArray($document2['body']['$permissions']); + $this->assertIsArray($document2['body']['$permissions']['read']); + $this->assertIsArray($document2['body']['$permissions']['write']); + $this->assertCount(0, $document2['body']['$permissions']['read']); + $this->assertCount(0, $document2['body']['$permissions']['write']); + $this->assertCount(3, $document2['body']['actors']); + $this->assertEquals($document2['body']['actors'][0]['firstName'], 'Tom'); + $this->assertEquals($document2['body']['actors'][0]['lastName'], 'Holland'); + $this->assertEquals($document2['body']['actors'][1]['firstName'], 'Zendaya'); + $this->assertEquals($document2['body']['actors'][1]['lastName'], 'Maree Stoermer'); + $this->assertEquals($document2['body']['actors'][2]['firstName'], 'Samuel'); + $this->assertEquals($document2['body']['actors'][2]['lastName'], 'Jackson'); + + $this->assertEquals($document3['headers']['status-code'], 201); + $this->assertEquals($document3['body']['$collection'], $data['moviesId']); + $this->assertEquals($document3['body']['name'], 'Spider-Man: Homecoming'); + $this->assertEquals($document3['body']['releaseYear'], 2017); + $this->assertIsArray($document3['body']['$permissions']); + $this->assertIsArray($document3['body']['$permissions']['read']); + $this->assertIsArray($document3['body']['$permissions']['write']); + $this->assertCount(0, $document3['body']['$permissions']['read']); + $this->assertCount(0, $document3['body']['$permissions']['write']); + $this->assertCount(2, $document3['body']['actors']); + $this->assertEquals($document3['body']['actors'][0]['firstName'], 'Tom'); + $this->assertEquals($document3['body']['actors'][0]['lastName'], 'Holland'); + $this->assertEquals($document3['body']['actors'][1]['firstName'], 'Zendaya'); + $this->assertEquals($document3['body']['actors'][1]['lastName'], 'Maree Stoermer'); + + $this->assertEquals($document4['headers']['status-code'], 400); + + return $data; + } + + /** + * @depends testCreateDocument + */ + public function testListDocuments(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + ]); + + $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); + $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); + $this->assertEquals(2019, $documents['body']['documents'][2]['releaseYear']); + $this->assertCount(3, $documents['body']['documents']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'order-field' => 'releaseYear', + 'order-type' => 'DESC', + 'order-cast' => 'int', + ]); + + $this->assertEquals(1944, $documents['body']['documents'][2]['releaseYear']); + $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); + $this->assertEquals(2019, $documents['body']['documents'][0]['releaseYear']); + $this->assertCount(3, $documents['body']['documents']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testListDocumentsLimitAndOffset(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 1, + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + ]); + + $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); + $this->assertCount(1, $documents['body']['documents']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 2, + 'offset' => 1, + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + ]); + + $this->assertEquals(2017, $documents['body']['documents'][0]['releaseYear']); + $this->assertEquals(2019, $documents['body']['documents'][1]['releaseYear']); + $this->assertCount(2, $documents['body']['documents']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testListDocumentsFirstAndLast(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 1, + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + 'first' => true, + ]); + + $this->assertEquals(1944, $documents['body']['releaseYear']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 2, + 'offset' => 1, + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + 'last' => true, + ]); + + $this->assertEquals(2019, $documents['body']['releaseYear']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testDocumentsListSuccessSearch(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'Captain America', + ]); + + $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); + $this->assertCount(1, $documents['body']['documents']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'Homecoming', + ]); + + $this->assertEquals(2017, $documents['body']['documents'][0]['releaseYear']); + $this->assertCount(1, $documents['body']['documents']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'spider', + ]); + + $this->assertEquals(2019, $documents['body']['documents'][0]['releaseYear']); + $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); + $this->assertCount(2, $documents['body']['documents']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testListDocumentsFilters(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'filters' => [ + 'actors.firstName=Tom' + ], + ]); + + $this->assertCount(2, $documents['body']['documents']); + $this->assertEquals('Spider-Man: Far From Home', $documents['body']['documents'][0]['name']); + $this->assertEquals('Spider-Man: Homecoming', $documents['body']['documents'][1]['name']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'filters' => [ + 'releaseYear=1944' + ], + ]); + + $this->assertCount(1, $documents['body']['documents']); + $this->assertEquals('Captain America', $documents['body']['documents'][0]['name']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'filters' => [ + 'releaseYear!=1944' + ], + ]); + + $this->assertCount(2, $documents['body']['documents']); + $this->assertEquals('Spider-Man: Far From Home', $documents['body']['documents'][0]['name']); + $this->assertEquals('Spider-Man: Homecoming', $documents['body']['documents'][1]['name']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testUpdateDocument(array $data):array + { + $document = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Thor: Ragnaroc', + 'releaseYear' => 2017, + ] + ]); + + $id = $document['body']['$uid']; + $collection = $document['body']['$collection']; + + $this->assertEquals($document['headers']['status-code'], 201); + $this->assertEquals($document['body']['name'], 'Thor: Ragnaroc'); + $this->assertEquals($document['body']['releaseYear'], 2017); + + $document = $this->client->call(Client::METHOD_PATCH, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Thor: Ragnarok' + ] + ]); + + $this->assertEquals($document['headers']['status-code'], 200); + $this->assertEquals($document['body']['name'], 'Thor: Ragnarok'); + $this->assertEquals($document['body']['releaseYear'], 2017); + + $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $id = $document['body']['$uid']; + $collection = $document['body']['$collection']; + + $this->assertEquals($document['headers']['status-code'], 200); + $this->assertEquals($document['body']['name'], 'Thor: Ragnarok'); + $this->assertEquals($document['body']['releaseYear'], 2017); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testDeleteDocument(array $data):array + { + $document = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Thor: Ragnarok', + 'releaseYear' => 2017, + ] + ]); + + $id = $document['body']['$uid']; + $collection = $document['body']['$collection']; + + $this->assertEquals($document['headers']['status-code'], 201); + + $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($document['headers']['status-code'], 200); + + $document = $this->client->call(Client::METHOD_DELETE, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($document['headers']['status-code'], 204); + + $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($document['headers']['status-code'], 404); + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Database/DatabaseConsoleClientTest.php b/tests/e2e/Services/Database/DatabaseConsoleClientTest.php new file mode 100644 index 0000000000..62eb2a212a --- /dev/null +++ b/tests/e2e/Services/Database/DatabaseConsoleClientTest.php @@ -0,0 +1,14 @@ +client->call(Client::METHOD_POST, '/database', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'name' => 'Actors', 'read' => ['*'], @@ -55,8 +54,7 @@ class ProjectDatabaseTest extends BaseProjects $movies = $this->client->call(Client::METHOD_POST, '/database', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'name' => 'Movies', 'read' => ['*'], @@ -109,8 +107,7 @@ class ProjectDatabaseTest extends BaseProjects { $document1 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'data' => [ 'name' => 'Captain America', @@ -134,8 +131,7 @@ class ProjectDatabaseTest extends BaseProjects $document2 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'data' => [ 'name' => 'Spider-Man: Far From Home', @@ -165,8 +161,7 @@ class ProjectDatabaseTest extends BaseProjects $document3 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'data' => [ 'name' => 'Spider-Man: Homecoming', @@ -190,8 +185,7 @@ class ProjectDatabaseTest extends BaseProjects $document4 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'data' => [ 'releaseYear' => 2020, // Missing title, expect an 400 error @@ -253,8 +247,7 @@ class ProjectDatabaseTest extends BaseProjects { $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'order-field' => 'releaseYear', 'order-type' => 'ASC', @@ -268,8 +261,7 @@ class ProjectDatabaseTest extends BaseProjects $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'order-field' => 'releaseYear', 'order-type' => 'DESC', @@ -289,8 +281,7 @@ class ProjectDatabaseTest extends BaseProjects { $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'limit' => 1, 'order-field' => 'releaseYear', @@ -303,8 +294,7 @@ class ProjectDatabaseTest extends BaseProjects $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'limit' => 2, 'offset' => 1, @@ -325,8 +315,7 @@ class ProjectDatabaseTest extends BaseProjects { $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'limit' => 1, 'order-field' => 'releaseYear', @@ -339,8 +328,7 @@ class ProjectDatabaseTest extends BaseProjects $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'limit' => 2, 'offset' => 1, @@ -360,8 +348,7 @@ class ProjectDatabaseTest extends BaseProjects { $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'search' => 'Captain America', ]); @@ -371,8 +358,7 @@ class ProjectDatabaseTest extends BaseProjects $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'search' => 'Homecoming', ]); @@ -382,8 +368,7 @@ class ProjectDatabaseTest extends BaseProjects $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'search' => 'spider', ]); @@ -400,8 +385,7 @@ class ProjectDatabaseTest extends BaseProjects { $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'filters' => [ 'actors.firstName=Tom' @@ -414,8 +398,7 @@ class ProjectDatabaseTest extends BaseProjects $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'filters' => [ 'releaseYear=1944' @@ -427,8 +410,7 @@ class ProjectDatabaseTest extends BaseProjects $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'filters' => [ 'releaseYear!=1944' @@ -447,8 +429,7 @@ class ProjectDatabaseTest extends BaseProjects { $document = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'data' => [ 'name' => 'Thor: Ragnaroc', @@ -465,8 +446,7 @@ class ProjectDatabaseTest extends BaseProjects $document = $this->client->call(Client::METHOD_PATCH, '/database/' . $collection . '/documents/' . $id, [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'data' => [ 'name' => 'Thor: Ragnarok' @@ -479,8 +459,7 @@ class ProjectDatabaseTest extends BaseProjects $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $id = $document['body']['$uid']; @@ -499,8 +478,7 @@ class ProjectDatabaseTest extends BaseProjects { $document = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ], [ 'data' => [ 'name' => 'Thor: Ragnarok', @@ -515,24 +493,21 @@ class ProjectDatabaseTest extends BaseProjects $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($document['headers']['status-code'], 200); $document = $this->client->call(Client::METHOD_DELETE, '/database/' . $collection . '/documents/' . $id, [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($document['headers']['status-code'], 204); $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, [ 'content-type' => 'application/json', - 'x-appwrite-project' => $data['projectUid'], - 'x-appwrite-key' => $data['projectAPIKeySecret'], + 'x-appwrite-project' => $this->getProject()['$uid'], ]); $this->assertEquals($document['headers']['status-code'], 404); From d005ade2d835702ba5517f13d820204898e9312b Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 13 Jan 2020 14:49:17 +0200 Subject: [PATCH 046/237] Removed buggy abuse check --- app/controllers/api/account.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index f2975ef0ff..ea5597037e 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -436,8 +436,6 @@ $utopia->get('/v1/account/sessions/oauth/callback/:provider/:projectId') ->desc('OAuth Callback') ->label('error', __DIR__.'/../../views/general/error.phtml') ->label('scope', 'public') - //->label('abuse-limit', 50) - //->label('abuse-key', 'ip:{ip}') ->label('docs', false) ->param('projectId', '', function () { return new Text(1024); }, 'Project unique ID') ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth provider') From 178d45cabfa55cd3dd31e66e3d937ecc4949b627 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 13 Jan 2020 17:15:52 +0200 Subject: [PATCH 047/237] New OAuth e2e test --- app/controllers/api/account.php | 4 +- app/controllers/mock.php | 35 ++++++++++++++--- src/Auth/OAuth/Mock.php | 8 ++-- tests/e2e/Client.php | 1 + .../Account/AccountCustomClientTest.php | 38 +++++++++++++++++++ tests/e2e/Services/Health/HealthBase.php | 2 +- 6 files changed, 77 insertions(+), 11 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index ea5597037e..81936f7304 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -500,7 +500,7 @@ $utopia->get('/v1/account/sessions/oauth/:provider/redirect') if (!empty($state['failure']) && !$validateURL->isValid($state['failure'])) { throw new Exception('Invalid redirect URL for failure login', 400); } - + $state['failure'] = null; $accessToken = $oauth->getAccessToken($code); if (empty($accessToken)) { @@ -512,7 +512,7 @@ $utopia->get('/v1/account/sessions/oauth/:provider/redirect') } $oauthID = $oauth->getUserID($accessToken); - + if (empty($oauthID)) { if (!empty($state['failure'])) { $response->redirect($state['failure'], 301, 0); diff --git a/app/controllers/mock.php b/app/controllers/mock.php index 0ee8b54014..89d1d448d3 100644 --- a/app/controllers/mock.php +++ b/app/controllers/mock.php @@ -6,6 +6,7 @@ use Utopia\Validator\Numeric; use Utopia\Validator\Text; use Utopia\Validator\ArrayList; use Storage\Validators\File; +use Utopia\Response; use Utopia\Validator\Host; $result = []; @@ -219,17 +220,17 @@ $utopia->get('/v1/mock/tests/general/empty') } ); -$utopia->get('/v1/mock/tests/general/oauth/login') +$utopia->get('/v1/mock/tests/general/oauth') ->desc('Mock an OAuth login route') ->label('scope', 'public') ->label('docs', false) ->param('client_id', '', function () { return new Text(100); }, 'OAuth Client ID.') ->param('redirect_uri', '', function () { return new Host(['http://localhost']); }, 'OAuth Redirect URI.') // Important to deny an open redirect attack ->param('scope', '', function () { return new Text(100); }, 'OAuth scope list.') - ->param('state', '', function () { return new Text(100); }, 'OAuth state.') + ->param('state', '', function () { return new Text(1024); }, 'OAuth state.') ->action( function ($clientId, $redirectURI, $scope, $state) use ($response) { - $response->redirect($redirectURI); + $response->redirect($redirectURI.'?'.http_build_query(['code' => 'abcdef', 'state' => $state])); } ); @@ -247,7 +248,7 @@ $utopia->get('/v1/mock/tests/general/oauth/token') throw new Exception('Invalid client ID'); } - if($clientSecret != 'secret') { + if($clientSecret != '123456') { throw new Exception('Invalid client secret'); } @@ -273,11 +274,35 @@ $utopia->get('/v1/mock/tests/general/oauth/user') $response->json([ 'id' => 1, 'name' => 'User Name', - 'email' => 'user@localhost', + 'email' => 'user@localhost.test', ]); } ); +$utopia->get('/v1/mock/tests/general/oauth/success') + ->label('scope', 'public') + ->label('docs', false) + ->action( + function () use ($response) { + $response->json([ + 'result' => 'success', + ]); + } + ); + +$utopia->get('/v1/mock/tests/general/oauth/failure') + ->label('scope', 'public') + ->label('docs', false) + ->action( + function () use ($response) { + $response + ->setStatusCode(Response::STATUS_CODE_BAD_REQUEST) + ->json([ + 'result' => 'failure', + ]); + } + ); + $utopia->shutdown(function() use ($response, $request, &$result, $utopia) { $route = $utopia->match($request); diff --git a/src/Auth/OAuth/Mock.php b/src/Auth/OAuth/Mock.php index 004836e0e9..e374694df4 100644 --- a/src/Auth/OAuth/Mock.php +++ b/src/Auth/OAuth/Mock.php @@ -29,7 +29,7 @@ class Mock extends OAuth */ public function getLoginURL():string { - return 'http://localhost/'.$this->version.'/oauth?client_id='.urlencode($this->appID).'&redirect_uri='.urlencode($this->callback).'&scope=email&state='.urlencode(json_encode($this->state)); + return 'http://localhost/'.$this->version.'/mock/tests/general/oauth?client_id='.urlencode($this->appID).'&redirect_uri='.urlencode($this->callback).'&scope=email&state='.urlencode(json_encode($this->state)); } /** @@ -41,13 +41,15 @@ class Mock extends OAuth { $accessToken = $this->request( 'GET', - 'http://localhost/'.$this->version.'/oauth/token?'. + 'http://localhost/'.$this->version.'/mock/tests/general/oauth/token?'. 'client_id='.urlencode($this->appID). '&redirect_uri='.urlencode($this->callback). '&client_secret='.urlencode($this->appSecret). '&code='.urlencode($code) ); + var_dump($this->appSecret); + var_dump($accessToken); $accessToken = json_decode($accessToken, true); // if (isset($accessToken['access_token'])) { @@ -113,7 +115,7 @@ class Mock extends OAuth protected function getUser(string $accessToken):array { if (empty($this->user)) { - $user = $this->request('GET', 'http://localhost/'.$this->version.'/oauth/user?token='.urlencode($accessToken)); + $user = $this->request('GET', 'http://localhost/'.$this->version.'/mock/tests/general/oauth/user?token='.urlencode($accessToken)); $this->user = json_decode($user, true); } diff --git a/tests/e2e/Client.php b/tests/e2e/Client.php index 4511f78c98..5a84716b52 100644 --- a/tests/e2e/Client.php +++ b/tests/e2e/Client.php @@ -184,6 +184,7 @@ class Client curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HEADERFUNCTION, function ($curl, $header) use (&$responseHeaders) { diff --git a/tests/e2e/Services/Account/AccountCustomClientTest.php b/tests/e2e/Services/Account/AccountCustomClientTest.php index a2f615a16c..a0e600e909 100644 --- a/tests/e2e/Services/Account/AccountCustomClientTest.php +++ b/tests/e2e/Services/Account/AccountCustomClientTest.php @@ -2,6 +2,7 @@ namespace Tests\E2E\Services\Account; +use Tests\E2E\Client; use Tests\E2E\Scopes\Scope; use Tests\E2E\Scopes\ProjectCustom; use Tests\E2E\Scopes\SideClient; @@ -11,4 +12,41 @@ class AccountCustomClientTest extends Scope use AccountBase; use ProjectCustom; use SideClient; + + public function testCreateOAuthAccountSession():array + { + $provider = 'mock'; + $appId = '1'; + $secret = '123456'; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/projects/'.$this->getProject()['$uid'].'/oauth', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => 'console', + 'cookie' => 'a_session_console=' . $this->getRoot()['session'], + ]), [ + 'provider' => $provider, + 'appId' => $appId, + 'secret' => $secret, + ]); + + $this->assertEquals($response['headers']['status-code'], 200); + + $response = $this->client->call(Client::METHOD_GET, '/account/sessions/oauth/'.$provider, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]), [ + 'success' => 'http://localhost/v1/mock/tests/general/oauth/success', + 'failure' => 'http://localhost/v1/mock/tests/general/oauth/failure', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertEquals('success', $response['body']['result']); + + return []; + } } \ No newline at end of file diff --git a/tests/e2e/Services/Health/HealthBase.php b/tests/e2e/Services/Health/HealthBase.php index e579f46809..c4b730745c 100644 --- a/tests/e2e/Services/Health/HealthBase.php +++ b/tests/e2e/Services/Health/HealthBase.php @@ -102,7 +102,7 @@ trait HealthBase $this->assertEquals(200, $response['headers']['status-code']); $this->assertIsInt($response['body']['size']); - $this->assertLessThan(10, $response['body']['size']); + $this->assertLessThan(50, $response['body']['size']); /** * Test for FAILURE From 74655d52332dd6a63cc6220b3b6f56ef9955f572 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 13 Jan 2020 19:53:22 +0200 Subject: [PATCH 048/237] Updated DB tests --- tests/e2e/Services/Database/DatabaseBase.php | 36 ++++++++++++------- .../Database/DatabaseConsoleClientTest.php | 14 -------- 2 files changed, 24 insertions(+), 26 deletions(-) delete mode 100644 tests/e2e/Services/Database/DatabaseConsoleClientTest.php diff --git a/tests/e2e/Services/Database/DatabaseBase.php b/tests/e2e/Services/Database/DatabaseBase.php index bd9a5c8522..02bbfd83ae 100644 --- a/tests/e2e/Services/Database/DatabaseBase.php +++ b/tests/e2e/Services/Database/DatabaseBase.php @@ -123,7 +123,9 @@ trait DatabaseBase 'lastName' => 'Jackson', ], ] - ] + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], ]); $document2 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ @@ -153,7 +155,9 @@ trait DatabaseBase 'lastName' => 'Jackson', ], ] - ] + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], ]); $document3 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ @@ -177,7 +181,9 @@ trait DatabaseBase 'lastName' => 'Maree Stoermer', ], ], - ] + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], ]); $document4 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ @@ -186,7 +192,9 @@ trait DatabaseBase ], $this->getHeaders()), [ 'data' => [ 'releaseYear' => 2020, // Missing title, expect an 400 error - ] + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], ]); $this->assertEquals($document1['headers']['status-code'], 201); @@ -196,8 +204,8 @@ trait DatabaseBase $this->assertIsArray($document1['body']['$permissions']); $this->assertIsArray($document1['body']['$permissions']['read']); $this->assertIsArray($document1['body']['$permissions']['write']); - $this->assertCount(0, $document1['body']['$permissions']['read']); - $this->assertCount(0, $document1['body']['$permissions']['write']); + $this->assertCount(1, $document1['body']['$permissions']['read']); + $this->assertCount(1, $document1['body']['$permissions']['write']); $this->assertCount(2, $document1['body']['actors']); $this->assertEquals($document2['headers']['status-code'], 201); @@ -207,8 +215,8 @@ trait DatabaseBase $this->assertIsArray($document2['body']['$permissions']); $this->assertIsArray($document2['body']['$permissions']['read']); $this->assertIsArray($document2['body']['$permissions']['write']); - $this->assertCount(0, $document2['body']['$permissions']['read']); - $this->assertCount(0, $document2['body']['$permissions']['write']); + $this->assertCount(1, $document2['body']['$permissions']['read']); + $this->assertCount(1, $document2['body']['$permissions']['write']); $this->assertCount(3, $document2['body']['actors']); $this->assertEquals($document2['body']['actors'][0]['firstName'], 'Tom'); $this->assertEquals($document2['body']['actors'][0]['lastName'], 'Holland'); @@ -224,8 +232,8 @@ trait DatabaseBase $this->assertIsArray($document3['body']['$permissions']); $this->assertIsArray($document3['body']['$permissions']['read']); $this->assertIsArray($document3['body']['$permissions']['write']); - $this->assertCount(0, $document3['body']['$permissions']['read']); - $this->assertCount(0, $document3['body']['$permissions']['write']); + $this->assertCount(1, $document3['body']['$permissions']['read']); + $this->assertCount(1, $document3['body']['$permissions']['write']); $this->assertCount(2, $document3['body']['actors']); $this->assertEquals($document3['body']['actors'][0]['firstName'], 'Tom'); $this->assertEquals($document3['body']['actors'][0]['lastName'], 'Holland'); @@ -441,7 +449,9 @@ trait DatabaseBase 'data' => [ 'name' => 'Thor: Ragnaroc', 'releaseYear' => 2017, - ] + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], ]); $id = $document['body']['$uid']; @@ -491,7 +501,9 @@ trait DatabaseBase 'data' => [ 'name' => 'Thor: Ragnarok', 'releaseYear' => 2017, - ] + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], ]); $id = $document['body']['$uid']; diff --git a/tests/e2e/Services/Database/DatabaseConsoleClientTest.php b/tests/e2e/Services/Database/DatabaseConsoleClientTest.php deleted file mode 100644 index 62eb2a212a..0000000000 --- a/tests/e2e/Services/Database/DatabaseConsoleClientTest.php +++ /dev/null @@ -1,14 +0,0 @@ - Date: Mon, 13 Jan 2020 20:14:26 +0200 Subject: [PATCH 049/237] Updated DB tests --- tests/e2e/Services/Users/DatabaseBase.php | 537 ++++++++++++++++++ .../Users/DatabaseCustomClientTest.php | 14 + .../Users/DatabaseCustomServerTest.php | 14 + 3 files changed, 565 insertions(+) create mode 100644 tests/e2e/Services/Users/DatabaseBase.php create mode 100644 tests/e2e/Services/Users/DatabaseCustomClientTest.php create mode 100644 tests/e2e/Services/Users/DatabaseCustomServerTest.php diff --git a/tests/e2e/Services/Users/DatabaseBase.php b/tests/e2e/Services/Users/DatabaseBase.php new file mode 100644 index 0000000000..02bbfd83ae --- /dev/null +++ b/tests/e2e/Services/Users/DatabaseBase.php @@ -0,0 +1,537 @@ +client->call(Client::METHOD_POST, '/database', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'name' => 'Actors', + 'read' => ['*'], + 'write' => ['role:1', 'role:2'], + 'rules' => [ + [ + 'label' => 'First Name', + 'key' => 'firstName', + 'type' => 'text', + 'default' => '', + 'required' => true, + 'array' => false + ], + [ + 'label' => 'Last Name', + 'key' => 'lastName', + 'type' => 'text', + 'default' => '', + 'required' => true, + 'array' => false + ], + ], + ]); + + $this->assertEquals($actors['headers']['status-code'], 201); + $this->assertEquals($actors['body']['$collection'], 0); + $this->assertEquals($actors['body']['name'], 'Actors'); + $this->assertIsArray($actors['body']['$permissions']); + $this->assertIsArray($actors['body']['$permissions']['read']); + $this->assertIsArray($actors['body']['$permissions']['write']); + $this->assertCount(1, $actors['body']['$permissions']['read']); + $this->assertCount(2, $actors['body']['$permissions']['write']); + + $movies = $this->client->call(Client::METHOD_POST, '/database', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'x-appwrite-key' => $this->getProject()['apiKey'] + ]), [ + 'name' => 'Movies', + 'read' => ['*'], + 'write' => ['role:1', 'role:2'], + 'rules' => [ + [ + 'label' => 'Name', + 'key' => 'name', + 'type' => 'text', + 'default' => '', + 'required' => true, + 'array' => false + ], + [ + 'label' => 'Release Year', + 'key' => 'releaseYear', + 'type' => 'numeric', + 'default' => 0, + 'required' => false, + 'array' => false + ], + [ + 'label' => 'Actors', + 'key' => 'actors', + 'type' => 'document', + 'default' => [], + 'required' => false, + 'array' => true, + 'list' => [$actors['body']['$uid']], + ], + ], + ]); + + $this->assertEquals($movies['headers']['status-code'], 201); + $this->assertEquals($movies['body']['$collection'], 0); + $this->assertEquals($movies['body']['name'], 'Movies'); + $this->assertIsArray($movies['body']['$permissions']); + $this->assertIsArray($movies['body']['$permissions']['read']); + $this->assertIsArray($movies['body']['$permissions']['write']); + $this->assertCount(1, $movies['body']['$permissions']['read']); + $this->assertCount(2, $movies['body']['$permissions']['write']); + + return array_merge(['moviesId' => $movies['body']['$uid'], 'actorsId' => $actors['body']['$uid']]); + } + + /** + * @depends testCreateCollection + */ + public function testCreateDocument(array $data):array + { + $document1 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Captain America', + 'releaseYear' => 1944, + 'actors' => [ + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Chris', + 'lastName' => 'Evans', + ], + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Samuel', + 'lastName' => 'Jackson', + ], + ] + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], + ]); + + $document2 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Spider-Man: Far From Home', + 'releaseYear' => 2019, + 'actors' => [ + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Tom', + 'lastName' => 'Holland', + ], + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Zendaya', + 'lastName' => 'Maree Stoermer', + ], + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Samuel', + 'lastName' => 'Jackson', + ], + ] + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], + ]); + + $document3 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Spider-Man: Homecoming', + 'releaseYear' => 2017, + 'actors' => [ + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Tom', + 'lastName' => 'Holland', + ], + [ + '$collection' => $data['actorsId'], + '$permissions' => ['read' => [], 'write' => []], + 'firstName' => 'Zendaya', + 'lastName' => 'Maree Stoermer', + ], + ], + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], + ]); + + $document4 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'releaseYear' => 2020, // Missing title, expect an 400 error + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], + ]); + + $this->assertEquals($document1['headers']['status-code'], 201); + $this->assertEquals($document1['body']['$collection'], $data['moviesId']); + $this->assertEquals($document1['body']['name'], 'Captain America'); + $this->assertEquals($document1['body']['releaseYear'], 1944); + $this->assertIsArray($document1['body']['$permissions']); + $this->assertIsArray($document1['body']['$permissions']['read']); + $this->assertIsArray($document1['body']['$permissions']['write']); + $this->assertCount(1, $document1['body']['$permissions']['read']); + $this->assertCount(1, $document1['body']['$permissions']['write']); + $this->assertCount(2, $document1['body']['actors']); + + $this->assertEquals($document2['headers']['status-code'], 201); + $this->assertEquals($document2['body']['$collection'], $data['moviesId']); + $this->assertEquals($document2['body']['name'], 'Spider-Man: Far From Home'); + $this->assertEquals($document2['body']['releaseYear'], 2019); + $this->assertIsArray($document2['body']['$permissions']); + $this->assertIsArray($document2['body']['$permissions']['read']); + $this->assertIsArray($document2['body']['$permissions']['write']); + $this->assertCount(1, $document2['body']['$permissions']['read']); + $this->assertCount(1, $document2['body']['$permissions']['write']); + $this->assertCount(3, $document2['body']['actors']); + $this->assertEquals($document2['body']['actors'][0]['firstName'], 'Tom'); + $this->assertEquals($document2['body']['actors'][0]['lastName'], 'Holland'); + $this->assertEquals($document2['body']['actors'][1]['firstName'], 'Zendaya'); + $this->assertEquals($document2['body']['actors'][1]['lastName'], 'Maree Stoermer'); + $this->assertEquals($document2['body']['actors'][2]['firstName'], 'Samuel'); + $this->assertEquals($document2['body']['actors'][2]['lastName'], 'Jackson'); + + $this->assertEquals($document3['headers']['status-code'], 201); + $this->assertEquals($document3['body']['$collection'], $data['moviesId']); + $this->assertEquals($document3['body']['name'], 'Spider-Man: Homecoming'); + $this->assertEquals($document3['body']['releaseYear'], 2017); + $this->assertIsArray($document3['body']['$permissions']); + $this->assertIsArray($document3['body']['$permissions']['read']); + $this->assertIsArray($document3['body']['$permissions']['write']); + $this->assertCount(1, $document3['body']['$permissions']['read']); + $this->assertCount(1, $document3['body']['$permissions']['write']); + $this->assertCount(2, $document3['body']['actors']); + $this->assertEquals($document3['body']['actors'][0]['firstName'], 'Tom'); + $this->assertEquals($document3['body']['actors'][0]['lastName'], 'Holland'); + $this->assertEquals($document3['body']['actors'][1]['firstName'], 'Zendaya'); + $this->assertEquals($document3['body']['actors'][1]['lastName'], 'Maree Stoermer'); + + $this->assertEquals($document4['headers']['status-code'], 400); + + return $data; + } + + /** + * @depends testCreateDocument + */ + public function testListDocuments(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + ]); + + $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); + $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); + $this->assertEquals(2019, $documents['body']['documents'][2]['releaseYear']); + $this->assertCount(3, $documents['body']['documents']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'order-field' => 'releaseYear', + 'order-type' => 'DESC', + 'order-cast' => 'int', + ]); + + $this->assertEquals(1944, $documents['body']['documents'][2]['releaseYear']); + $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); + $this->assertEquals(2019, $documents['body']['documents'][0]['releaseYear']); + $this->assertCount(3, $documents['body']['documents']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testListDocumentsLimitAndOffset(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 1, + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + ]); + + $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); + $this->assertCount(1, $documents['body']['documents']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 2, + 'offset' => 1, + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + ]); + + $this->assertEquals(2017, $documents['body']['documents'][0]['releaseYear']); + $this->assertEquals(2019, $documents['body']['documents'][1]['releaseYear']); + $this->assertCount(2, $documents['body']['documents']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testListDocumentsFirstAndLast(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 1, + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + 'first' => true, + ]); + + $this->assertEquals(1944, $documents['body']['releaseYear']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 2, + 'offset' => 1, + 'order-field' => 'releaseYear', + 'order-type' => 'ASC', + 'order-cast' => 'int', + 'last' => true, + ]); + + $this->assertEquals(2019, $documents['body']['releaseYear']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testDocumentsListSuccessSearch(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'Captain America', + ]); + + $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); + $this->assertCount(1, $documents['body']['documents']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'Homecoming', + ]); + + $this->assertEquals(2017, $documents['body']['documents'][0]['releaseYear']); + $this->assertCount(1, $documents['body']['documents']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'spider', + ]); + + $this->assertEquals(2019, $documents['body']['documents'][0]['releaseYear']); + $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); + $this->assertCount(2, $documents['body']['documents']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testListDocumentsFilters(array $data):array + { + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'filters' => [ + 'actors.firstName=Tom' + ], + ]); + + $this->assertCount(2, $documents['body']['documents']); + $this->assertEquals('Spider-Man: Far From Home', $documents['body']['documents'][0]['name']); + $this->assertEquals('Spider-Man: Homecoming', $documents['body']['documents'][1]['name']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'filters' => [ + 'releaseYear=1944' + ], + ]); + + $this->assertCount(1, $documents['body']['documents']); + $this->assertEquals('Captain America', $documents['body']['documents'][0]['name']); + + $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'filters' => [ + 'releaseYear!=1944' + ], + ]); + + $this->assertCount(2, $documents['body']['documents']); + $this->assertEquals('Spider-Man: Far From Home', $documents['body']['documents'][0]['name']); + $this->assertEquals('Spider-Man: Homecoming', $documents['body']['documents'][1]['name']); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testUpdateDocument(array $data):array + { + $document = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Thor: Ragnaroc', + 'releaseYear' => 2017, + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], + ]); + + $id = $document['body']['$uid']; + $collection = $document['body']['$collection']; + + $this->assertEquals($document['headers']['status-code'], 201); + $this->assertEquals($document['body']['name'], 'Thor: Ragnaroc'); + $this->assertEquals($document['body']['releaseYear'], 2017); + + $document = $this->client->call(Client::METHOD_PATCH, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Thor: Ragnarok' + ] + ]); + + $this->assertEquals($document['headers']['status-code'], 200); + $this->assertEquals($document['body']['name'], 'Thor: Ragnarok'); + $this->assertEquals($document['body']['releaseYear'], 2017); + + $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $id = $document['body']['$uid']; + $collection = $document['body']['$collection']; + + $this->assertEquals($document['headers']['status-code'], 200); + $this->assertEquals($document['body']['name'], 'Thor: Ragnarok'); + $this->assertEquals($document['body']['releaseYear'], 2017); + + return []; + } + + /** + * @depends testCreateDocument + */ + public function testDeleteDocument(array $data):array + { + $document = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'data' => [ + 'name' => 'Thor: Ragnarok', + 'releaseYear' => 2017, + ], + 'read' => ['user:'.$this->getUser()['$uid']], + 'write' => ['user:'.$this->getUser()['$uid']], + ]); + + $id = $document['body']['$uid']; + $collection = $document['body']['$collection']; + + $this->assertEquals($document['headers']['status-code'], 201); + + $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($document['headers']['status-code'], 200); + + $document = $this->client->call(Client::METHOD_DELETE, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($document['headers']['status-code'], 204); + + $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($document['headers']['status-code'], 404); + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Users/DatabaseCustomClientTest.php b/tests/e2e/Services/Users/DatabaseCustomClientTest.php new file mode 100644 index 0000000000..5bb035ac1b --- /dev/null +++ b/tests/e2e/Services/Users/DatabaseCustomClientTest.php @@ -0,0 +1,14 @@ + Date: Mon, 13 Jan 2020 20:30:13 +0200 Subject: [PATCH 050/237] Created users tests --- tests/e2e/Services/Users/DatabaseBase.php | 537 ------------------ tests/e2e/Services/Users/UsersBase.php | 18 + ...ientTest.php => UsersCustomClientTest.php} | 6 +- ...rverTest.php => UsersCustomServerTest.php} | 6 +- 4 files changed, 24 insertions(+), 543 deletions(-) delete mode 100644 tests/e2e/Services/Users/DatabaseBase.php create mode 100644 tests/e2e/Services/Users/UsersBase.php rename tests/e2e/Services/Users/{DatabaseCustomClientTest.php => UsersCustomClientTest.php} (58%) rename tests/e2e/Services/Users/{DatabaseCustomServerTest.php => UsersCustomServerTest.php} (58%) diff --git a/tests/e2e/Services/Users/DatabaseBase.php b/tests/e2e/Services/Users/DatabaseBase.php deleted file mode 100644 index 02bbfd83ae..0000000000 --- a/tests/e2e/Services/Users/DatabaseBase.php +++ /dev/null @@ -1,537 +0,0 @@ -client->call(Client::METHOD_POST, '/database', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - 'x-appwrite-key' => $this->getProject()['apiKey'] - ]), [ - 'name' => 'Actors', - 'read' => ['*'], - 'write' => ['role:1', 'role:2'], - 'rules' => [ - [ - 'label' => 'First Name', - 'key' => 'firstName', - 'type' => 'text', - 'default' => '', - 'required' => true, - 'array' => false - ], - [ - 'label' => 'Last Name', - 'key' => 'lastName', - 'type' => 'text', - 'default' => '', - 'required' => true, - 'array' => false - ], - ], - ]); - - $this->assertEquals($actors['headers']['status-code'], 201); - $this->assertEquals($actors['body']['$collection'], 0); - $this->assertEquals($actors['body']['name'], 'Actors'); - $this->assertIsArray($actors['body']['$permissions']); - $this->assertIsArray($actors['body']['$permissions']['read']); - $this->assertIsArray($actors['body']['$permissions']['write']); - $this->assertCount(1, $actors['body']['$permissions']['read']); - $this->assertCount(2, $actors['body']['$permissions']['write']); - - $movies = $this->client->call(Client::METHOD_POST, '/database', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - 'x-appwrite-key' => $this->getProject()['apiKey'] - ]), [ - 'name' => 'Movies', - 'read' => ['*'], - 'write' => ['role:1', 'role:2'], - 'rules' => [ - [ - 'label' => 'Name', - 'key' => 'name', - 'type' => 'text', - 'default' => '', - 'required' => true, - 'array' => false - ], - [ - 'label' => 'Release Year', - 'key' => 'releaseYear', - 'type' => 'numeric', - 'default' => 0, - 'required' => false, - 'array' => false - ], - [ - 'label' => 'Actors', - 'key' => 'actors', - 'type' => 'document', - 'default' => [], - 'required' => false, - 'array' => true, - 'list' => [$actors['body']['$uid']], - ], - ], - ]); - - $this->assertEquals($movies['headers']['status-code'], 201); - $this->assertEquals($movies['body']['$collection'], 0); - $this->assertEquals($movies['body']['name'], 'Movies'); - $this->assertIsArray($movies['body']['$permissions']); - $this->assertIsArray($movies['body']['$permissions']['read']); - $this->assertIsArray($movies['body']['$permissions']['write']); - $this->assertCount(1, $movies['body']['$permissions']['read']); - $this->assertCount(2, $movies['body']['$permissions']['write']); - - return array_merge(['moviesId' => $movies['body']['$uid'], 'actorsId' => $actors['body']['$uid']]); - } - - /** - * @depends testCreateCollection - */ - public function testCreateDocument(array $data):array - { - $document1 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'data' => [ - 'name' => 'Captain America', - 'releaseYear' => 1944, - 'actors' => [ - [ - '$collection' => $data['actorsId'], - '$permissions' => ['read' => [], 'write' => []], - 'firstName' => 'Chris', - 'lastName' => 'Evans', - ], - [ - '$collection' => $data['actorsId'], - '$permissions' => ['read' => [], 'write' => []], - 'firstName' => 'Samuel', - 'lastName' => 'Jackson', - ], - ] - ], - 'read' => ['user:'.$this->getUser()['$uid']], - 'write' => ['user:'.$this->getUser()['$uid']], - ]); - - $document2 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'data' => [ - 'name' => 'Spider-Man: Far From Home', - 'releaseYear' => 2019, - 'actors' => [ - [ - '$collection' => $data['actorsId'], - '$permissions' => ['read' => [], 'write' => []], - 'firstName' => 'Tom', - 'lastName' => 'Holland', - ], - [ - '$collection' => $data['actorsId'], - '$permissions' => ['read' => [], 'write' => []], - 'firstName' => 'Zendaya', - 'lastName' => 'Maree Stoermer', - ], - [ - '$collection' => $data['actorsId'], - '$permissions' => ['read' => [], 'write' => []], - 'firstName' => 'Samuel', - 'lastName' => 'Jackson', - ], - ] - ], - 'read' => ['user:'.$this->getUser()['$uid']], - 'write' => ['user:'.$this->getUser()['$uid']], - ]); - - $document3 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'data' => [ - 'name' => 'Spider-Man: Homecoming', - 'releaseYear' => 2017, - 'actors' => [ - [ - '$collection' => $data['actorsId'], - '$permissions' => ['read' => [], 'write' => []], - 'firstName' => 'Tom', - 'lastName' => 'Holland', - ], - [ - '$collection' => $data['actorsId'], - '$permissions' => ['read' => [], 'write' => []], - 'firstName' => 'Zendaya', - 'lastName' => 'Maree Stoermer', - ], - ], - ], - 'read' => ['user:'.$this->getUser()['$uid']], - 'write' => ['user:'.$this->getUser()['$uid']], - ]); - - $document4 = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'data' => [ - 'releaseYear' => 2020, // Missing title, expect an 400 error - ], - 'read' => ['user:'.$this->getUser()['$uid']], - 'write' => ['user:'.$this->getUser()['$uid']], - ]); - - $this->assertEquals($document1['headers']['status-code'], 201); - $this->assertEquals($document1['body']['$collection'], $data['moviesId']); - $this->assertEquals($document1['body']['name'], 'Captain America'); - $this->assertEquals($document1['body']['releaseYear'], 1944); - $this->assertIsArray($document1['body']['$permissions']); - $this->assertIsArray($document1['body']['$permissions']['read']); - $this->assertIsArray($document1['body']['$permissions']['write']); - $this->assertCount(1, $document1['body']['$permissions']['read']); - $this->assertCount(1, $document1['body']['$permissions']['write']); - $this->assertCount(2, $document1['body']['actors']); - - $this->assertEquals($document2['headers']['status-code'], 201); - $this->assertEquals($document2['body']['$collection'], $data['moviesId']); - $this->assertEquals($document2['body']['name'], 'Spider-Man: Far From Home'); - $this->assertEquals($document2['body']['releaseYear'], 2019); - $this->assertIsArray($document2['body']['$permissions']); - $this->assertIsArray($document2['body']['$permissions']['read']); - $this->assertIsArray($document2['body']['$permissions']['write']); - $this->assertCount(1, $document2['body']['$permissions']['read']); - $this->assertCount(1, $document2['body']['$permissions']['write']); - $this->assertCount(3, $document2['body']['actors']); - $this->assertEquals($document2['body']['actors'][0]['firstName'], 'Tom'); - $this->assertEquals($document2['body']['actors'][0]['lastName'], 'Holland'); - $this->assertEquals($document2['body']['actors'][1]['firstName'], 'Zendaya'); - $this->assertEquals($document2['body']['actors'][1]['lastName'], 'Maree Stoermer'); - $this->assertEquals($document2['body']['actors'][2]['firstName'], 'Samuel'); - $this->assertEquals($document2['body']['actors'][2]['lastName'], 'Jackson'); - - $this->assertEquals($document3['headers']['status-code'], 201); - $this->assertEquals($document3['body']['$collection'], $data['moviesId']); - $this->assertEquals($document3['body']['name'], 'Spider-Man: Homecoming'); - $this->assertEquals($document3['body']['releaseYear'], 2017); - $this->assertIsArray($document3['body']['$permissions']); - $this->assertIsArray($document3['body']['$permissions']['read']); - $this->assertIsArray($document3['body']['$permissions']['write']); - $this->assertCount(1, $document3['body']['$permissions']['read']); - $this->assertCount(1, $document3['body']['$permissions']['write']); - $this->assertCount(2, $document3['body']['actors']); - $this->assertEquals($document3['body']['actors'][0]['firstName'], 'Tom'); - $this->assertEquals($document3['body']['actors'][0]['lastName'], 'Holland'); - $this->assertEquals($document3['body']['actors'][1]['firstName'], 'Zendaya'); - $this->assertEquals($document3['body']['actors'][1]['lastName'], 'Maree Stoermer'); - - $this->assertEquals($document4['headers']['status-code'], 400); - - return $data; - } - - /** - * @depends testCreateDocument - */ - public function testListDocuments(array $data):array - { - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'order-field' => 'releaseYear', - 'order-type' => 'ASC', - 'order-cast' => 'int', - ]); - - $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); - $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); - $this->assertEquals(2019, $documents['body']['documents'][2]['releaseYear']); - $this->assertCount(3, $documents['body']['documents']); - - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'order-field' => 'releaseYear', - 'order-type' => 'DESC', - 'order-cast' => 'int', - ]); - - $this->assertEquals(1944, $documents['body']['documents'][2]['releaseYear']); - $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); - $this->assertEquals(2019, $documents['body']['documents'][0]['releaseYear']); - $this->assertCount(3, $documents['body']['documents']); - - return []; - } - - /** - * @depends testCreateDocument - */ - public function testListDocumentsLimitAndOffset(array $data):array - { - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'limit' => 1, - 'order-field' => 'releaseYear', - 'order-type' => 'ASC', - 'order-cast' => 'int', - ]); - - $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); - $this->assertCount(1, $documents['body']['documents']); - - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'limit' => 2, - 'offset' => 1, - 'order-field' => 'releaseYear', - 'order-type' => 'ASC', - 'order-cast' => 'int', - ]); - - $this->assertEquals(2017, $documents['body']['documents'][0]['releaseYear']); - $this->assertEquals(2019, $documents['body']['documents'][1]['releaseYear']); - $this->assertCount(2, $documents['body']['documents']); - - return []; - } - - /** - * @depends testCreateDocument - */ - public function testListDocumentsFirstAndLast(array $data):array - { - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'limit' => 1, - 'order-field' => 'releaseYear', - 'order-type' => 'ASC', - 'order-cast' => 'int', - 'first' => true, - ]); - - $this->assertEquals(1944, $documents['body']['releaseYear']); - - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'limit' => 2, - 'offset' => 1, - 'order-field' => 'releaseYear', - 'order-type' => 'ASC', - 'order-cast' => 'int', - 'last' => true, - ]); - - $this->assertEquals(2019, $documents['body']['releaseYear']); - - return []; - } - - /** - * @depends testCreateDocument - */ - public function testDocumentsListSuccessSearch(array $data):array - { - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'search' => 'Captain America', - ]); - - $this->assertEquals(1944, $documents['body']['documents'][0]['releaseYear']); - $this->assertCount(1, $documents['body']['documents']); - - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'search' => 'Homecoming', - ]); - - $this->assertEquals(2017, $documents['body']['documents'][0]['releaseYear']); - $this->assertCount(1, $documents['body']['documents']); - - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'search' => 'spider', - ]); - - $this->assertEquals(2019, $documents['body']['documents'][0]['releaseYear']); - $this->assertEquals(2017, $documents['body']['documents'][1]['releaseYear']); - $this->assertCount(2, $documents['body']['documents']); - - return []; - } - - /** - * @depends testCreateDocument - */ - public function testListDocumentsFilters(array $data):array - { - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'filters' => [ - 'actors.firstName=Tom' - ], - ]); - - $this->assertCount(2, $documents['body']['documents']); - $this->assertEquals('Spider-Man: Far From Home', $documents['body']['documents'][0]['name']); - $this->assertEquals('Spider-Man: Homecoming', $documents['body']['documents'][1]['name']); - - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'filters' => [ - 'releaseYear=1944' - ], - ]); - - $this->assertCount(1, $documents['body']['documents']); - $this->assertEquals('Captain America', $documents['body']['documents'][0]['name']); - - $documents = $this->client->call(Client::METHOD_GET, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'filters' => [ - 'releaseYear!=1944' - ], - ]); - - $this->assertCount(2, $documents['body']['documents']); - $this->assertEquals('Spider-Man: Far From Home', $documents['body']['documents'][0]['name']); - $this->assertEquals('Spider-Man: Homecoming', $documents['body']['documents'][1]['name']); - - return []; - } - - /** - * @depends testCreateDocument - */ - public function testUpdateDocument(array $data):array - { - $document = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'data' => [ - 'name' => 'Thor: Ragnaroc', - 'releaseYear' => 2017, - ], - 'read' => ['user:'.$this->getUser()['$uid']], - 'write' => ['user:'.$this->getUser()['$uid']], - ]); - - $id = $document['body']['$uid']; - $collection = $document['body']['$collection']; - - $this->assertEquals($document['headers']['status-code'], 201); - $this->assertEquals($document['body']['name'], 'Thor: Ragnaroc'); - $this->assertEquals($document['body']['releaseYear'], 2017); - - $document = $this->client->call(Client::METHOD_PATCH, '/database/' . $collection . '/documents/' . $id, array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'data' => [ - 'name' => 'Thor: Ragnarok' - ] - ]); - - $this->assertEquals($document['headers']['status-code'], 200); - $this->assertEquals($document['body']['name'], 'Thor: Ragnarok'); - $this->assertEquals($document['body']['releaseYear'], 2017); - - $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders())); - - $id = $document['body']['$uid']; - $collection = $document['body']['$collection']; - - $this->assertEquals($document['headers']['status-code'], 200); - $this->assertEquals($document['body']['name'], 'Thor: Ragnarok'); - $this->assertEquals($document['body']['releaseYear'], 2017); - - return []; - } - - /** - * @depends testCreateDocument - */ - public function testDeleteDocument(array $data):array - { - $document = $this->client->call(Client::METHOD_POST, '/database/' . $data['moviesId'] . '/documents', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'data' => [ - 'name' => 'Thor: Ragnarok', - 'releaseYear' => 2017, - ], - 'read' => ['user:'.$this->getUser()['$uid']], - 'write' => ['user:'.$this->getUser()['$uid']], - ]); - - $id = $document['body']['$uid']; - $collection = $document['body']['$collection']; - - $this->assertEquals($document['headers']['status-code'], 201); - - $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders())); - - $this->assertEquals($document['headers']['status-code'], 200); - - $document = $this->client->call(Client::METHOD_DELETE, '/database/' . $collection . '/documents/' . $id, array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders())); - - $this->assertEquals($document['headers']['status-code'], 204); - - $document = $this->client->call(Client::METHOD_GET, '/database/' . $collection . '/documents/' . $id, array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders())); - - $this->assertEquals($document['headers']['status-code'], 404); - - return []; - } -} \ No newline at end of file diff --git a/tests/e2e/Services/Users/UsersBase.php b/tests/e2e/Services/Users/UsersBase.php new file mode 100644 index 0000000000..ee9a56957e --- /dev/null +++ b/tests/e2e/Services/Users/UsersBase.php @@ -0,0 +1,18 @@ + Date: Mon, 13 Jan 2020 20:55:57 +0200 Subject: [PATCH 051/237] Added users service e2e tests --- tests/e2e/Services/Users/UsersBase.php | 142 +++++++++++++++++- .../Services/Users/UsersCustomClientTest.php | 14 -- 2 files changed, 139 insertions(+), 17 deletions(-) delete mode 100644 tests/e2e/Services/Users/UsersCustomClientTest.php diff --git a/tests/e2e/Services/Users/UsersBase.php b/tests/e2e/Services/Users/UsersBase.php index ee9a56957e..fc65b0b510 100644 --- a/tests/e2e/Services/Users/UsersBase.php +++ b/tests/e2e/Services/Users/UsersBase.php @@ -6,13 +6,149 @@ use Tests\E2E\Client; trait UsersBase { - public function testCreateCollection():array + public function testCreateUser():array { /** * Test for SUCCESS */ - - return []; + $user = $this->client->call(Client::METHOD_POST, '/users', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'email' => 'users.service@example.com', + 'password' => 'password', + 'name' => 'Project User', + ]); + + $this->assertEquals($user['headers']['status-code'], 201); + $this->assertEquals($user['body']['name'], 'Project User'); + $this->assertEquals($user['body']['email'], 'users.service@example.com'); + $this->assertEquals($user['body']['status'], 0); + $this->assertGreaterThan(0, $user['body']['registration']); + $this->assertIsArray($user['body']['roles']); + + return ['userId' => $user['body']['$uid']]; } + /** + * @depends testCreateUser + */ + public function testGetUser(array $data):array + { + /** + * Test for SUCCESS + */ + $user = $this->client->call(Client::METHOD_GET, '/users/' . $data['userId'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($user['headers']['status-code'], 200); + $this->assertEquals($user['body']['name'], 'Project User'); + $this->assertEquals($user['body']['email'], 'users.service@example.com'); + $this->assertEquals($user['body']['status'], 0); + $this->assertGreaterThan(0, $user['body']['registration']); + $this->assertIsArray($user['body']['roles']); + + $sessions = $this->client->call(Client::METHOD_GET, '/users/' . $data['userId'] . '/sessions', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($sessions['headers']['status-code'], 200); + $this->assertIsArray($sessions['body']); + + $logs = $this->client->call(Client::METHOD_GET, '/users/' . $data['userId'] . '/logs', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($logs['headers']['status-code'], 200); + $this->assertIsArray($logs['body']); + + $users = $this->client->call(Client::METHOD_GET, '/users', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($users['headers']['status-code'], 200); + $this->assertIsArray($users['body']); + $this->assertIsArray($users['body']['users']); + $this->assertIsInt($users['body']['sum']); + $this->assertGreaterThan(0, $users['body']['sum']); + + $users = $this->client->call(Client::METHOD_GET, '/users', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'example.com' + ]); + + $this->assertEquals($users['headers']['status-code'], 200); + $this->assertIsArray($users['body']); + $this->assertIsArray($users['body']['users']); + $this->assertIsInt($users['body']['sum']); + $this->assertEquals(1, $users['body']['sum']); + $this->assertGreaterThan(0, $users['body']['sum']); + $this->assertCount(1, $users['body']['users']); + + return $data; + } + + /** + * @depends testGetUser + */ + public function testUpdateUserStatus(array $data):array + { + /** + * Test for SUCCESS + */ + $user = $this->client->call(Client::METHOD_PATCH, '/users/' . $data['userId'] . '/status', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'status' => 2, + ]); + + $this->assertEquals($user['headers']['status-code'], 200); + $this->assertEquals($user['body']['status'], 2); + + $user = $this->client->call(Client::METHOD_GET, '/users/' . $data['userId'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($user['headers']['status-code'], 200); + $this->assertEquals($user['body']['status'], 2); + + return $data; + } + + /** + * @depends testGetUser + */ + public function testUpdateUserPrefs(array $data):array + { + /** + * Test for SUCCESS + */ + $user = $this->client->call(Client::METHOD_PATCH, '/users/' . $data['userId'] . '/prefs', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'prefs' => [ + 'key1' => 'value1', + 'key2' => 'value2', + ], + ]); + + $this->assertEquals($user['headers']['status-code'], 200); + $this->assertEquals($user['body']['key1'], 'value1'); + $this->assertEquals($user['body']['key2'], 'value2'); + + return $data; + } + + // TODO add test for session delete + // TODO add test for all sessions delete } \ No newline at end of file diff --git a/tests/e2e/Services/Users/UsersCustomClientTest.php b/tests/e2e/Services/Users/UsersCustomClientTest.php deleted file mode 100644 index 6b0d4af238..0000000000 --- a/tests/e2e/Services/Users/UsersCustomClientTest.php +++ /dev/null @@ -1,14 +0,0 @@ - Date: Mon, 13 Jan 2020 21:20:16 +0200 Subject: [PATCH 052/237] Removed border --- public/dist/styles/default-ltr.css | 2 +- public/dist/styles/default-rtl.css | 2 +- public/styles/comps/cover.less | 2 +- public/styles/scopes/console.less | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/public/dist/styles/default-ltr.css b/public/dist/styles/default-ltr.css index f2253b8575..2b12c709d0 100644 --- a/public/dist/styles/default-ltr.css +++ b/public/dist/styles/default-ltr.css @@ -1 +1 @@ -.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file +.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file diff --git a/public/dist/styles/default-rtl.css b/public/dist/styles/default-rtl.css index 0433c5dca4..ff419c49a9 100644 --- a/public/dist/styles/default-rtl.css +++ b/public/dist/styles/default-rtl.css @@ -1 +1 @@ -.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative;border-bottom:solid 1px #dedede}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file +.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1100px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxcQAA8XEAAABWAADxegAA8XoAAABXAADxkwAA8ZMAAABYAADxnAAA8ZwAAABZAADxoAAA8aAAAABaAADxrQAA8a0AAABbAADxwAAA8cAAAABcAADxzQAA8c0AAABdAADx3AAA8dwAAABeAADx5QAA8eUAAABfAADx/gAA8f4AAABgAADyMQAA8jEAAABhAADyOgAA8joAAABiAADylgAA8pYAAABjAADyxgAA8sYAAABkAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8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AQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrEmRpc2NvcmQtbG9nby13aGl0ZQhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkCWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmct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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord-logo-white:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#c52653;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#c52653;border-color:#c52653}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:scroll;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file diff --git a/public/styles/comps/cover.less b/public/styles/comps/cover.less index d4fbf923b3..938832f65b 100644 --- a/public/styles/comps/cover.less +++ b/public/styles/comps/cover.less @@ -3,7 +3,7 @@ padding: 30px 50px; margin: 0 -50px; position: relative; - border-bottom: solid 1px #dedede; + //border-bottom: solid 1px #dedede; //box-shadow: 0 0 3px rgba(0, 0, 0, 0.05); //border-bottom: solid 2px #e3e9ec;; diff --git a/public/styles/scopes/console.less b/public/styles/scopes/console.less index 4a69d07eb4..158083f75c 100644 --- a/public/styles/scopes/console.less +++ b/public/styles/scopes/console.less @@ -670,7 +670,6 @@ margin: -30px -30px 30px -30px; padding: 30px; - &.android { background: #a4ca24; From ef597bbd9d4da5c177241e9eda8975c2c5183b14 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 13 Jan 2020 21:41:01 +0200 Subject: [PATCH 053/237] Updated discord logo --- public/images/oauth/discord.png | Bin 5930 -> 4166 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/oauth/discord.png b/public/images/oauth/discord.png index 08687e91ddadf8cbf4d209b0b5f173ae092f9154..b114055bfe938b1e20ad3725d8d6ca4fc5b0d089 100644 GIT binary patch literal 4166 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 QoB#j-07*qoM6N<$g62y0vj6}9 literal 5930 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 JH7fQI{{x$(EkpnS From c5df0627bdcd509dadfbca6689d06c941c74f2df Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 13 Jan 2020 22:59:53 +0200 Subject: [PATCH 054/237] Added missing state param --- src/Auth/OAuth/Discord.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Auth/OAuth/Discord.php b/src/Auth/OAuth/Discord.php index b23653e992..01a7013bb4 100644 --- a/src/Auth/OAuth/Discord.php +++ b/src/Auth/OAuth/Discord.php @@ -19,10 +19,12 @@ class Discord extends OAuth */ protected $user = []; - + /** + * @var array + */ protected $scope = [ - 'identify', - 'email' + 'identify', + 'email' ]; /** @@ -43,7 +45,8 @@ class Discord extends OAuth 'response_type' => 'code', 'client_id' => $this->appID, 'scope' => implode(' ', $this->scope), - 'redirect_uri' => $this->callback + 'state' => json_encode($this->state), + 'redirect_uri' => $this->callback, ]); return $url; @@ -70,10 +73,8 @@ class Discord extends OAuth ]) ); - $accessToken = json_decode($accessToken, true); - if (isset($accessToken['access_token'])) { return $accessToken['access_token']; } From d74269a5faae8995babdb6ad680d9482a307db1b Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 13 Jan 2020 23:12:07 +0200 Subject: [PATCH 055/237] Updated changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index b5cbc0d88f..c0c86ac000 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,7 @@ * Added new webhooks events * Normailized all webhooks event names * Merged Auth and Account service for making the API more REST compatible +* Added a new Discord OAuth adapter ## Bug Fixes From f68a13510648533b709632607bca9630d934535e Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 14 Jan 2020 11:22:56 +0200 Subject: [PATCH 056/237] Fixed UI sync issues --- app/views/console/home/index.phtml | 2 +- app/views/console/index.phtml | 2 +- app/views/console/keys/index.phtml | 6 +++--- app/views/console/users/index.phtml | 7 +++---- app/views/home/auth/join.phtml | 6 +++--- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/app/views/console/home/index.phtml b/app/views/console/home/index.phtml index 778730fe68..11c9af6003 100644 --- a/app/views/console/home/index.phtml +++ b/app/views/console/home/index.phtml @@ -6,7 +6,7 @@ $graph = $this->getParam('graph', false);

diff --git a/app/views/console/index.phtml b/app/views/console/index.phtml index b65ced3b9f..98fb8d25a0 100644 --- a/app/views/console/index.phtml +++ b/app/views/console/index.phtml @@ -24,7 +24,7 @@ $home = $this->getParam('home', ''); data-event="load,project-create" data-name="console-projects" data-success="trigger" - data-success-triggers="projects-load"> + data-success-param-trigger-events="projects-load">

-
getParam('scopes', []);

Update API Key

- diff --git a/app/views/console/users/index.phtml b/app/views/console/users/index.phtml index 1d4d33eaad..cc13e7452b 100644 --- a/app/views/console/users/index.phtml +++ b/app/views/console/users/index.phtml @@ -309,11 +309,11 @@ $providers = $this->getParam('providers', []);
  • -

    Providers

    - +

    OAuth Providers

    +
    @@ -365,7 +365,6 @@ $providers = $this->getParam('providers', []);
    <?php echo ucfirst($provider); ?> Logo - From acc12bf4d4125f49138dc4168cdddb47a59afdcf Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 14 Jan 2020 11:33:51 +0200 Subject: [PATCH 057/237] Fixed project logo not showing up --- public/dist/scripts/app-all.js | 2 +- public/dist/scripts/app.js | 2 +- public/scripts/views/forms/upload.js | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index f68cde9112..9ed39616d7 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -2649,7 +2649,7 @@ var units=si?["KB","MB","GB","TB","PB","EB","ZB","YB"]:["KiB","MiB","GiB","TiB", preview.innerHTML="";count.innerHTML="0 / "+max;files.map(function(obj){var file=document.createElement("li");var image=document.createElement("img");image.src=image.src=env.API+"/storage/files/"+ obj+"/preview?width="+ previewWidth+"&height="+ -previewHeight;file.className="file avatar";file.tabIndex=0;file.appendChild(image);count.innerHTML=files.length+" / "+max;preview.appendChild(file);if(files.length>=max){input.disabled=true;upload.classList.add("disabled");}else{input.disabled=false;upload.classList.remove("disabled");} +previewHeight+"&project=console";file.className="file avatar";file.tabIndex=0;file.appendChild(image);count.innerHTML=files.length+" / "+max;preview.appendChild(file);if(files.length>=max){input.disabled=true;upload.classList.add("disabled");}else{input.disabled=false;upload.classList.remove("disabled");} var remove=(function(obj){return function(event){output=Array.isArray(output)?output.filter(function(e){return e!==obj;}):[];render(output);};})(obj);file.addEventListener("click",remove);file.addEventListener("keypress",remove);element.value=multiple?JSON.stringify(output):output[0];});};input.addEventListener("change",function(){var message=alerts.add({text:labelLoading,class:""},0);var files=input.files;var read=JSON.parse(expression.parse(element.dataset["read"]||"[]"));var write=JSON.parse(expression.parse(element.dataset["write"]||"[]"));if(!multiple){output=[];} sdk.storage.createFile(files[0],read,write,1).then(function(response){response.map(function(obj){if(!Array.isArray(output)){throw new Error("Can't append new file to non array value");} output[output.length]=obj["$uid"];});onComplete(message);render(output);},function(error){alerts.add({text:"An error occurred!",class:""},3000);onComplete(message);});input.disabled=true;});element.addEventListener("change",function(){if(!element.value){return;} diff --git a/public/dist/scripts/app.js b/public/dist/scripts/app.js index 2b72ab4634..1e0d0d940e 100644 --- a/public/dist/scripts/app.js +++ b/public/dist/scripts/app.js @@ -375,7 +375,7 @@ var units=si?["KB","MB","GB","TB","PB","EB","ZB","YB"]:["KiB","MiB","GiB","TiB", preview.innerHTML="";count.innerHTML="0 / "+max;files.map(function(obj){var file=document.createElement("li");var image=document.createElement("img");image.src=image.src=env.API+"/storage/files/"+ obj+"/preview?width="+ previewWidth+"&height="+ -previewHeight;file.className="file avatar";file.tabIndex=0;file.appendChild(image);count.innerHTML=files.length+" / "+max;preview.appendChild(file);if(files.length>=max){input.disabled=true;upload.classList.add("disabled");}else{input.disabled=false;upload.classList.remove("disabled");} +previewHeight+"&project=console";file.className="file avatar";file.tabIndex=0;file.appendChild(image);count.innerHTML=files.length+" / "+max;preview.appendChild(file);if(files.length>=max){input.disabled=true;upload.classList.add("disabled");}else{input.disabled=false;upload.classList.remove("disabled");} var remove=(function(obj){return function(event){output=Array.isArray(output)?output.filter(function(e){return e!==obj;}):[];render(output);};})(obj);file.addEventListener("click",remove);file.addEventListener("keypress",remove);element.value=multiple?JSON.stringify(output):output[0];});};input.addEventListener("change",function(){var message=alerts.add({text:labelLoading,class:""},0);var files=input.files;var read=JSON.parse(expression.parse(element.dataset["read"]||"[]"));var write=JSON.parse(expression.parse(element.dataset["write"]||"[]"));if(!multiple){output=[];} sdk.storage.createFile(files[0],read,write,1).then(function(response){response.map(function(obj){if(!Array.isArray(output)){throw new Error("Can't append new file to non array value");} output[output.length]=obj["$uid"];});onComplete(message);render(output);},function(error){alerts.add({text:"An error occurred!",class:""},3000);onComplete(message);});input.disabled=true;});element.addEventListener("change",function(){if(!element.value){return;} diff --git a/public/scripts/views/forms/upload.js b/public/scripts/views/forms/upload.js index e91551afa3..a1a576850b 100644 --- a/public/scripts/views/forms/upload.js +++ b/public/scripts/views/forms/upload.js @@ -102,7 +102,8 @@ "/preview?width=" + previewWidth + "&height=" + - previewHeight; + previewHeight + + "&project=console"; file.className = "file avatar"; file.tabIndex = 0; From ba5f0c8b31ffe9ead80352d4de0698d9b05a1f73 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 14 Jan 2020 18:16:24 +0200 Subject: [PATCH 058/237] Added more metadata for new SDKs --- app/controllers/api/account.php | 3 ++- app/controllers/api/storage.php | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 81936f7304..648025a403 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -397,7 +397,8 @@ $utopia->get('/v1/account/sessions/oauth/:provider') ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccountSessionOAuth') ->label('sdk.description', '/docs/references/account/create-session-oauth.md') - ->label('sdk.location', true) + ->label('sdk.response.code', 301) + ->label('sdk.response.type', 'text/html') ->label('abuse-limit', 50) ->label('abuse-key', 'ip:{ip}') ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'OAuth Provider. Currently, supported providers are: ' . implode(', ', array_keys($providers))) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 911e58b649..b2fa86a381 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -173,6 +173,7 @@ $utopia->get('/v1/storage/files/:fileId/preview') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFilePreview') ->label('sdk.description', '/docs/references/storage/get-file-preview.md') + ->label('sdk.response.type', 'image/*') ->param('fileId', '', function () { return new UID(); }, 'File unique ID') ->param('width', 0, function () { return new Range(0, 4000); }, 'Resize preview image width, Pass an integer between 0 to 4000', true) ->param('height', 0, function () { return new Range(0, 4000); }, 'Resize preview image height, Pass an integer between 0 to 4000', true) @@ -284,6 +285,7 @@ $utopia->get('/v1/storage/files/:fileId/download') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFileDownload') ->label('sdk.description', '/docs/references/storage/get-file-download.md') + ->label('sdk.response.type', '*') ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->action( function ($fileId) use ($response, $request, $projectDB) { @@ -334,6 +336,7 @@ $utopia->get('/v1/storage/files/:fileId/view') ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFileView') ->label('sdk.description', '/docs/references/storage/get-file-view.md') + ->label('sdk.response.type', '*') ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->param('as', '', function () { return new WhiteList(['pdf', /*'html',*/ 'text']); }, 'Choose a file format to convert your file to. Currently you can only convert word and pdf files to pdf or txt. This option is currently experimental only, use at your own risk.', true) ->action( From d5044ce1d5fd9f557f9db53a47ce16b98bb896c2 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 14 Jan 2020 22:50:49 +0200 Subject: [PATCH 059/237] Added support for SameSite cookie option --- app/controllers/api/account.php | 17 +++++++++++++---- app/controllers/api/auth.php | 10 +++++----- app/controllers/api/teams.php | 5 ++++- app/init.php | 7 +++++-- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 648025a403..eb5c0dea97 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -384,6 +384,7 @@ $utopia->post('/v1/account/sessions') $response ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) ->setStatusCode(Response::STATUS_CODE_CREATED) ->json($session->getArrayCopy(['$uid', 'type', 'expire'])) ; @@ -612,9 +613,9 @@ $utopia->get('/v1/account/sessions/oauth/:provider/redirect') $response ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->redirect($state['success']) ; - - $response->redirect($state['success']); } ); @@ -827,6 +828,7 @@ $utopia->delete('/v1/account') $response ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) ->noContent() ; } @@ -862,7 +864,10 @@ $utopia->delete('/v1/account/sessions') ; if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too - $response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + $response + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ; } } @@ -902,7 +907,10 @@ $utopia->delete('/v1/account/sessions/:id') ; if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too - $response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + $response + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ; } } } @@ -938,6 +946,7 @@ $utopia->delete('/v1/account/sessions/current') $response ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) ->noContent() ; } diff --git a/app/controllers/api/auth.php b/app/controllers/api/auth.php index 2074c7a96e..82664d5be5 100644 --- a/app/controllers/api/auth.php +++ b/app/controllers/api/auth.php @@ -177,7 +177,7 @@ $utopia->post('/v1/auth/register') ; $response - ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $loginSecret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $loginSecret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null); if ($success) { $response->redirect($success); @@ -375,7 +375,7 @@ $utopia->post('/v1/auth/login') ; $response - ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null); if ($success) { $response->redirect($success); @@ -608,7 +608,7 @@ $utopia->get('/v1/auth/login/oauth/:provider/redirect') ; $response - ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) ; $response->redirect($state['success']); @@ -641,7 +641,7 @@ $utopia->delete('/v1/auth/logout') $audit->setParam('event', 'auth.logout'); $response - ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) ->json(array('result' => 'success')) ; } @@ -671,7 +671,7 @@ $utopia->delete('/v1/auth/logout/:id') ; if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete cookies - $response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + $response->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null); } } } diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 55b590a4e6..a4b25c78b9 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -594,7 +594,10 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ->setParam('event', 'auth.join') ; - $response->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE); + $response + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ; if ($success) { $response->redirect($success); diff --git a/app/init.php b/app/init.php index 46d659ea4d..54a0f7b040 100644 --- a/app/init.php +++ b/app/init.php @@ -56,7 +56,7 @@ define('COOKIE_DOMAIN', ) ? null : '.'.parse_url($scheme.'://'.$request->getServer('HTTP_HOST', ''), PHP_URL_HOST)); -define('COOKIE_SAMESITE', null); // Response::COOKIE_SAMESITE_NONE +define('COOKIE_SAMESITE', Response::COOKIE_SAMESITE_NONE); /* * Registry @@ -222,7 +222,10 @@ if (APP_MODE_ADMIN === $mode) { Auth::setCookieName('a_session_'.$console->getUid()); } -$session = Auth::decodeSession($request->getCookie(Auth::$cookieName, $request->getHeader('X-Appwrite-Key', ''))); +$session = Auth::decodeSession( + $request->getCookie(Auth::$cookieName, // Get sessions + $request->getCookie(Auth::$cookieName.'_legacy', // Get fallback session from old clients (no SameSite support) + $request->getHeader('X-Appwrite-Key', '')))); // Get API Key Auth::$unique = $session['id']; Auth::$secret = $session['secret']; From 1328034ccdb098cf3b652140ad8b33a89961e71f Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 14 Jan 2020 23:11:02 +0200 Subject: [PATCH 060/237] Fix for CI --- app/controllers/api/account.php | 12 ++++++------ app/controllers/api/teams.php | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index eb5c0dea97..0e80422f79 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -383,8 +383,8 @@ $utopia->post('/v1/account/sessions') ; $response - ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->setStatusCode(Response::STATUS_CODE_CREATED) ->json($session->getArrayCopy(['$uid', 'type', 'expire'])) ; @@ -612,8 +612,8 @@ $utopia->get('/v1/account/sessions/oauth/:provider/redirect') ; $response - ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->redirect($state['success']) ; } @@ -827,8 +827,8 @@ $utopia->delete('/v1/account') ; $response - ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->noContent() ; } @@ -865,8 +865,8 @@ $utopia->delete('/v1/account/sessions') if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too $response - ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ; } } @@ -908,8 +908,8 @@ $utopia->delete('/v1/account/sessions/:id') if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too $response - ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ; } } @@ -945,8 +945,8 @@ $utopia->delete('/v1/account/sessions/current') $audit->setParam('event', 'account.sessions.delete'); $response - ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->noContent() ; } diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index a4b25c78b9..e96f6bb87a 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -595,8 +595,8 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ; $response - ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ; if ($success) { From 3b908807ac44b406e1302f0791bb5ed1fa448b5d Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 15 Jan 2020 08:20:03 +0200 Subject: [PATCH 061/237] Updated changelog --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index c0c86ac000..40a8bd7e24 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ * Limited console dashboard to show max 5 alerts at the same time * Added new webhooks events * Normailized all webhooks event names +* Added support for SameSite cookie option with fallback cookie for old clients * Merged Auth and Account service for making the API more REST compatible * Added a new Discord OAuth adapter From e793f8bb5d5f38dc229e559ad2ce8b8b627dbb03 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 16 Jan 2020 16:05:48 +0200 Subject: [PATCH 062/237] Fixed some small bugs in teams service --- app/controllers/api/teams.php | 86 ++--------------------------------- 1 file changed, 3 insertions(+), 83 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index e96f6bb87a..85490a70f9 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -138,7 +138,7 @@ $utopia->post('/v1/teams') 'write' => ['team:{self}/owner'], ], 'name' => $name, - 'sum' => ($mode !== APP_MODE_ADMIN) ? 1 : 0, + 'sum' => ($user->getUid()) ? 1 : 0, 'dateCreated' => time(), ]); @@ -148,7 +148,7 @@ $utopia->post('/v1/teams') throw new Exception('Failed saving team to DB', 500); } - if ($mode !== APP_MODE_ADMIN) { // Don't add user on admin mode + if ($user->getUid()) { // Don't add user on server mode $membership = new Document([ '$collection' => Database::SYSTEM_COLLECTION_MEMBERSHIPS, '$permissions' => [ @@ -234,7 +234,7 @@ $utopia->delete('/v1/teams/:teamId') ]); foreach ($memberships as $member) { - if (!$projectDB->deleteDocument($member)) { + if (!$projectDB->deleteDocument($member->getUid())) { throw new Exception('Failed to remove membership for team from DB', 500); } } @@ -392,86 +392,6 @@ $utopia->post('/v1/teams/:teamId/memberships') } ); -$utopia->post('/v1/teams/:teamId/memberships/:inviteId/resend') - ->desc('Create Team Membership (Resend)') - ->label('scope', 'account') - ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'createTeamMembershipResend') - ->label('sdk.description', '/docs/references/teams/create-team-membership-resend.md') - ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') - ->param('inviteId', '', function () { return new UID(); }, 'Invite unique ID.') - ->param('redirect', '', function () use ($clients) { return new Host($clients); }, 'Reset page to redirect user back to your app from the invitation email.') - ->action( - function ($teamId, $inviteId, $redirect) use ($response, $register, $project, $user, $audit, $projectDB) { - $membership = $projectDB->getDocument($inviteId); - - if (empty($membership->getUid()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { - throw new Exception('Membership not found', 404); - } - - $team = $projectDB->getDocument($membership->getAttribute('teamId')); - - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { - throw new Exception('Team not found', 404); - } - - if ($team->getUid() !== $teamId) { - throw new Exception('Team IDs don\'t match', 404); - } - - $invitee = $projectDB->getDocument($membership->getAttribute('userId')); - - if (empty($invitee->getUid()) || Database::SYSTEM_COLLECTION_USERS != $invitee->getCollection()) { - throw new Exception('User not found', 404); - } - - $secret = Auth::tokenGenerator(); - - $membership = $projectDB->updateDocument(array_merge($membership->getArrayCopy(), ['secret' => Auth::hash($secret)])); - - if (false === $membership) { - throw new Exception('Failed updating membership to DB', 500); - } - - $redirect = Template::parseURL($redirect); - $redirect['query'] = Template::mergeQuery(((isset($redirect['query'])) ? $redirect['query'] : ''), ['inviteId' => $membership->getUid(), 'userId' => $membership->getAttribute('userId'), 'secret' => $secret]); - $redirect = Template::unParseURL($redirect); - - $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.invitation.body')); - $body - ->setParam('{{direction}}', Locale::getText('settings.direction')) - ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) - ->setParam('{{team}}', $team->getAttribute('name', '[TEAM-NAME]')) - ->setParam('{{owner}}', $user->getAttribute('name', '')) - ->setParam('{{redirect}}', $redirect) - ; - - $mail = $register->get('smtp'); /* @var $mail \PHPMailer\PHPMailer\PHPMailer */ - - $mail->addAddress($invitee->getAttribute('email'), $invitee->getAttribute('name')); - - $mail->Subject = sprintf(Locale::getText('auth.emails.invitation.title'), $team->getAttribute('name', '[TEAM-NAME]'), $project->getAttribute('name', ['[APP-NAME]'])); - $mail->Body = $body->render(); - $mail->AltBody = strip_tags($body->render()); - - try { - $mail->send(); - } catch (\Exception $error) { - throw new Exception('Error sending mail: ' . $error->getMessage(), 500); - } - - $audit - ->setParam('userId', $user->getUid()) - ->setParam('event', 'auth.invite.resend') - ; - - $response - // ->setStatusCode(Response::STATUS_CODE_CREATED) TODO change response of this endpoint - ->noContent() - ; - } - ); - $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ->desc('Update Team Membership Status') ->label('scope', 'auth') From f0edf47f4fb74fd421d6373d43a246deb11da8c6 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 16 Jan 2020 16:06:28 +0200 Subject: [PATCH 063/237] Added e2e tests to teams service --- tests/e2e/Scopes/Scope.php | 2 + tests/e2e/Services/Teams/TeamsBase.php | 264 ++++++++++++++++++ tests/e2e/Services/Teams/TeamsBaseClient.php | 37 +++ tests/e2e/Services/Teams/TeamsBaseServer.php | 33 +++ .../Services/Teams/TeamsConsoleClientTest.php | 15 + .../Services/Teams/TeamsCustomClientTest.php | 15 + .../Services/Teams/TeamsCustomServerTest.php | 16 ++ 7 files changed, 382 insertions(+) create mode 100644 tests/e2e/Services/Teams/TeamsBase.php create mode 100644 tests/e2e/Services/Teams/TeamsBaseClient.php create mode 100644 tests/e2e/Services/Teams/TeamsBaseServer.php create mode 100644 tests/e2e/Services/Teams/TeamsConsoleClientTest.php create mode 100644 tests/e2e/Services/Teams/TeamsCustomClientTest.php create mode 100644 tests/e2e/Services/Teams/TeamsCustomServerTest.php diff --git a/tests/e2e/Scopes/Scope.php b/tests/e2e/Scopes/Scope.php index d9b6881cd1..d31e5ed490 100644 --- a/tests/e2e/Scopes/Scope.php +++ b/tests/e2e/Scopes/Scope.php @@ -97,6 +97,7 @@ abstract class Scope extends TestCase self::$root = [ '$uid' => $root['body']['$uid'], 'name' => $root['body']['name'], + 'email' => $root['body']['email'], 'session' => $session, ]; @@ -147,6 +148,7 @@ abstract class Scope extends TestCase self::$user[$this->getProject()['$uid']] = [ '$uid' => $user['body']['$uid'], 'name' => $user['body']['name'], + 'email' => $user['body']['email'], 'session' => $session, ]; diff --git a/tests/e2e/Services/Teams/TeamsBase.php b/tests/e2e/Services/Teams/TeamsBase.php new file mode 100644 index 0000000000..f85c36d21c --- /dev/null +++ b/tests/e2e/Services/Teams/TeamsBase.php @@ -0,0 +1,264 @@ +client->call(Client::METHOD_POST, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'name' => 'Arsenal' + ]); + + $this->assertEquals(201, $response1['headers']['status-code']); + $this->assertNotEmpty($response1['body']['$uid']); + $this->assertEquals('Arsenal', $response1['body']['name']); + $this->assertGreaterThan(-1, $response1['body']['sum']); + $this->assertIsInt($response1['body']['sum']); + $this->assertIsInt($response1['body']['dateCreated']); + + $teamUid = $response1['body']['$uid']; + + $response2 = $this->client->call(Client::METHOD_POST, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'name' => 'Manchester United' + ]); + + $this->assertEquals(201, $response2['headers']['status-code']); + $this->assertNotEmpty($response2['body']['$uid']); + $this->assertEquals('Manchester United', $response2['body']['name']); + $this->assertGreaterThan(-1, $response2['body']['sum']); + $this->assertIsInt($response2['body']['sum']); + $this->assertIsInt($response2['body']['dateCreated']); + + $response3 = $this->client->call(Client::METHOD_POST, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'name' => 'Newcastle' + ]); + + $this->assertEquals(201, $response3['headers']['status-code']); + $this->assertNotEmpty($response3['body']['$uid']); + $this->assertEquals('Newcastle', $response3['body']['name']); + $this->assertGreaterThan(-1, $response3['body']['sum']); + $this->assertIsInt($response3['body']['sum']); + $this->assertIsInt($response3['body']['dateCreated']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_POST, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return ['teamUid' => $teamUid]; + } + + /** + * @depends testCreateTeam + */ + public function testGetTeam($data):array + { + $uid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$uid, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertEquals('Arsenal', $response['body']['name']); + $this->assertGreaterThan(-1, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertIsInt($response['body']['dateCreated']); + + /** + * Test for FAILURE + */ + + return []; + } + + /** + * @depends testCreateTeam + */ + public function testListTeams($data):array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertGreaterThan(0, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertCount(3, $response['body']['teams']); + + $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'limit' => 2, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertGreaterThan(0, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertCount(2, $response['body']['teams']); + + $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'offset' => 1, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertGreaterThan(0, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertCount(2, $response['body']['teams']); + + $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'Manchester', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertGreaterThan(0, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertCount(1, $response['body']['teams']); + $this->assertEquals('Manchester United', $response['body']['teams'][0]['name']); + + $response = $this->client->call(Client::METHOD_GET, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'search' => 'United', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertGreaterThan(0, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertCount(1, $response['body']['teams']); + $this->assertEquals('Manchester United', $response['body']['teams'][0]['name']); + + /** + * Test for FAILURE + */ + + return []; + } + + public function testUpdateTeam():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'name' => 'Demo' + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertEquals('Demo', $response['body']['name']); + $this->assertGreaterThan(-1, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertIsInt($response['body']['dateCreated']); + + $response = $this->client->call(Client::METHOD_PUT, '/teams/'.$response['body']['$uid'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'name' => 'Demo New' + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertEquals('Demo New', $response['body']['name']); + $this->assertGreaterThan(-1, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertIsInt($response['body']['dateCreated']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PUT, '/teams/'.$response['body']['$uid'], array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return []; + } + + public function testDeleteTeam():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'name' => 'Demo' + ]); + + $teamUid = $response['body']['$uid']; + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertEquals('Demo', $response['body']['name']); + $this->assertGreaterThan(-1, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertIsInt($response['body']['dateCreated']); + + $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(404, $response['headers']['status-code']); + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php new file mode 100644 index 0000000000..2f741ffaa8 --- /dev/null +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -0,0 +1,37 @@ +client->call(Client::METHOD_GET, '/teams/'.$uid.'/members', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body'][0]['$uid']); + $this->assertEquals($this->getUser()['$uid'], $response['body'][0]['$uid']); + $this->assertEquals($this->getUser()['name'], $response['body'][0]['name']); + $this->assertEquals($this->getUser()['email'], $response['body'][0]['email']); + $this->assertEquals('owner', $response['body'][0]['roles'][0]); + + /** + * Test for FAILURE + */ + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Teams/TeamsBaseServer.php b/tests/e2e/Services/Teams/TeamsBaseServer.php new file mode 100644 index 0000000000..98af82647b --- /dev/null +++ b/tests/e2e/Services/Teams/TeamsBaseServer.php @@ -0,0 +1,33 @@ +client->call(Client::METHOD_GET, '/teams/'.$uid.'/members', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(0, $response['body']); + + /** + * Test for FAILURE + */ + + return []; + } +} \ No newline at end of file diff --git a/tests/e2e/Services/Teams/TeamsConsoleClientTest.php b/tests/e2e/Services/Teams/TeamsConsoleClientTest.php new file mode 100644 index 0000000000..7ced83c4e4 --- /dev/null +++ b/tests/e2e/Services/Teams/TeamsConsoleClientTest.php @@ -0,0 +1,15 @@ + Date: Thu, 16 Jan 2020 16:10:33 +0200 Subject: [PATCH 064/237] Updated Changelog --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 40a8bd7e24..e46257b227 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,8 @@ * Added support for SameSite cookie option with fallback cookie for old clients * Merged Auth and Account service for making the API more REST compatible * Added a new Discord OAuth adapter +* Added a new Twitch OAuth adapter +* Added a new Spotify OAuth adapter ## Bug Fixes From 1732e377ff9d3dddb570535baa9150a0fef6b945 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 16 Jan 2020 17:22:11 +0200 Subject: [PATCH 065/237] Updated smtp image version --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 754338967a..22d9d4a731 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -68,7 +68,7 @@ services: command: 'mysqld --innodb-flush-method=fsync' smtp: - image: appwrite/smtp:1.0.0 + image: appwrite/smtp:1.0.1 restart: unless-stopped networks: - appwrite From 66a8f56db5995f56ae50999356d87befe98275de Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 16 Jan 2020 17:36:57 +0200 Subject: [PATCH 066/237] Updated change log --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index e46257b227..951459dbde 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,6 +13,8 @@ * Added a new Discord OAuth adapter * Added a new Twitch OAuth adapter * Added a new Spotify OAuth adapter +* Upgraded MariaDB image to version 1.0.2 +* Upgraded SMTP image to version 1.0.1 ## Bug Fixes From 3a68c963fededb6c5d4bc6cac3cbcfde5a4551b0 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 18 Jan 2020 16:00:15 +0200 Subject: [PATCH 067/237] wip --- tests/e2e/Services/Teams/TeamsBase.php | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/e2e/Services/Teams/TeamsBase.php b/tests/e2e/Services/Teams/TeamsBase.php index f85c36d21c..c6ad92e891 100644 --- a/tests/e2e/Services/Teams/TeamsBase.php +++ b/tests/e2e/Services/Teams/TeamsBase.php @@ -261,4 +261,46 @@ trait TeamsBase return []; } + + public function testCreateTeamMembership():array + { + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/teams', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'name' => 'Demo' + ]); + + $teamUid = $response['body']['$uid']; + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertEquals('Demo', $response['body']['name']); + $this->assertGreaterThan(-1, $response['body']['sum']); + $this->assertIsInt($response['body']['sum']); + $this->assertIsInt($response['body']['dateCreated']); + + $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(404, $response['headers']['status-code']); + + return []; + } } \ No newline at end of file From f034d1024dd42a2405c9457872fe9098f6436333 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 18 Jan 2020 16:47:08 +0200 Subject: [PATCH 068/237] wip --- app/controllers/api/teams.php | 17 +++++++++-------- tests/e2e/Services/Teams/TeamsBase.php | 15 ++++++++++++--- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 85490a70f9..5e0b9d9314 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -259,9 +259,9 @@ $utopia->post('/v1/teams/:teamId/memberships') ->param('email', '', function () { return new Email(); }, 'New team member email address.') ->param('name', '', function () { return new Text(100); }, 'New team member name.', true) ->param('roles', [], function () { return new ArrayList(new Text(128)); }, 'Invite roles array. Learn more about [roles and permissions](/docs/permissions).') - ->param('redirect', '', function () use ($clients) { return new Host($clients); }, 'Reset page to redirect user back to your app from the invitation email.') + ->param('url', '', function () use ($clients) { return new Host($clients); }, 'URL to redirect the user back to your app from the invitation email.') // TODO add our own built-in confirm page ->action( - function ($teamId, $email, $name, $roles, $redirect) use ($response, $register, $project, $user, $audit, $projectDB) { + function ($teamId, $email, $name, $roles, $url) use ($response, $register, $project, $user, $audit, $projectDB) { $name = (empty($name)) ? $email : $name; $team = $projectDB->getDocument($teamId); @@ -354,9 +354,9 @@ $utopia->post('/v1/teams/:teamId/memberships') throw new Exception('Failed saving membership to DB', 500); } - $redirect = Template::parseURL($redirect); - $redirect['query'] = Template::mergeQuery(((isset($redirect['query'])) ? $redirect['query'] : ''), ['inviteId' => $membership->getUid(), 'teamId' => $team->getUid(), 'userId' => $invitee->getUid(), 'secret' => $secret]); - $redirect = Template::unParseURL($redirect); + $url = Template::parseURL($url); + $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['inviteId' => $membership->getUid(), 'teamId' => $team->getUid(), 'userId' => $invitee->getUid(), 'secret' => $secret]); + $url = Template::unParseURL($url); $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.invitation.body')); $body @@ -364,7 +364,7 @@ $utopia->post('/v1/teams/:teamId/memberships') ->setParam('{{project}}', $project->getAttribute('name', ['[APP-NAME]'])) ->setParam('{{team}}', $team->getAttribute('name', '[TEAM-NAME]')) ->setParam('{{owner}}', $user->getAttribute('name', '')) - ->setParam('{{redirect}}', $redirect) + ->setParam('{{redirect}}', $url) ; $mail = $register->get('smtp'); /* @var $mail \PHPMailer\PHPMailer\PHPMailer */ @@ -387,8 +387,9 @@ $utopia->post('/v1/teams/:teamId/memberships') ; $response - //->setStatusCode(Response::STATUS_CODE_CREATED) TODO change response of this endpoint - ->noContent(); + ->setStatusCode(Response::STATUS_CODE_CREATED) // TODO change response of this endpoint + ->json($membership->getArrayCopy()) + ; } ); diff --git a/tests/e2e/Services/Teams/TeamsBase.php b/tests/e2e/Services/Teams/TeamsBase.php index c6ad92e891..6b1be692cf 100644 --- a/tests/e2e/Services/Teams/TeamsBase.php +++ b/tests/e2e/Services/Teams/TeamsBase.php @@ -262,16 +262,25 @@ trait TeamsBase return []; } - public function testCreateTeamMembership():array + /** + * @depends testCreateTeam + */ + public function testCreateTeamMembership($data):array { + $uid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; + $email = uniqid().'friend@localhost.test'; + /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_POST, '/teams', array_merge([ + $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], ], $this->getHeaders()), [ - 'name' => 'Demo' + 'email' => $email, + 'name' => 'Friend User', + 'roles' => ['admin', 'editor'], + 'url' => 'http://localhost:5000/join-us#title' ]); $teamUid = $response['body']['$uid']; From 81805d0c622460d1a2e4a8e0612c124ceb214c37 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 18 Jan 2020 18:03:17 +0200 Subject: [PATCH 069/237] Added tests --- app/controllers/api/teams.php | 20 ++++++++++++------ tests/e2e/Services/Teams/TeamsBase.php | 29 ++++++++++---------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 5e0b9d9314..969649dace 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -388,7 +388,15 @@ $utopia->post('/v1/teams/:teamId/memberships') $response ->setStatusCode(Response::STATUS_CODE_CREATED) // TODO change response of this endpoint - ->json($membership->getArrayCopy()) + ->json($membership->getArrayCopy([ + '$uid', + 'userId', + 'teamId', + 'roles', + 'invited', + 'joined', + 'confirm', + ])) ; } ); @@ -538,13 +546,13 @@ $utopia->delete('/v1/teams/:teamId/memberships/:inviteId') ->param('inviteId', '', function () { return new UID(); }, 'Invite unique ID') ->action( function ($teamId, $inviteId) use ($response, $projectDB, $audit) { - $invite = $projectDB->getDocument($inviteId); + $membership = $projectDB->getDocument($inviteId); - if (empty($invite->getUid()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $invite->getCollection()) { + if (empty($membership->getUid()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { throw new Exception('Invite not found', 404); } - if ($invite->getAttribute('teamId') !== $teamId) { + if ($membership->getAttribute('teamId') !== $teamId) { throw new Exception('Team IDs don\'t match', 404); } @@ -554,7 +562,7 @@ $utopia->delete('/v1/teams/:teamId/memberships/:inviteId') throw new Exception('Team not found', 404); } - if (!$projectDB->deleteDocument($invite->getUid())) { + if (!$projectDB->deleteDocument($membership->getUid())) { throw new Exception('Failed to remove membership from DB', 500); } @@ -567,7 +575,7 @@ $utopia->delete('/v1/teams/:teamId/memberships/:inviteId') } $audit - ->setParam('userId', $invite->getAttribute('userId')) + ->setParam('userId', $membership->getAttribute('userId')) ->setParam('event', 'auth.leave') ; diff --git a/tests/e2e/Services/Teams/TeamsBase.php b/tests/e2e/Services/Teams/TeamsBase.php index 6b1be692cf..f8bf4d0469 100644 --- a/tests/e2e/Services/Teams/TeamsBase.php +++ b/tests/e2e/Services/Teams/TeamsBase.php @@ -283,32 +283,25 @@ trait TeamsBase 'url' => 'http://localhost:5000/join-us#title' ]); - $teamUid = $response['body']['$uid']; + if ($response['headers']['status-code'] !== 201) {var_dump($response);} $this->assertEquals(201, $response['headers']['status-code']); $this->assertNotEmpty($response['body']['$uid']); - $this->assertEquals('Demo', $response['body']['name']); - $this->assertGreaterThan(-1, $response['body']['sum']); - $this->assertIsInt($response['body']['sum']); - $this->assertIsInt($response['body']['dateCreated']); - - $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid, array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders())); - - $this->assertEquals(204, $response['headers']['status-code']); - $this->assertEmpty($response['body']); + $this->assertNotEmpty($response['body']['userId']); + $this->assertNotEmpty($response['body']['teamId']); + $this->assertCount(2, $response['body']['roles']); + $this->assertIsInt($response['body']['joined']); + $this->assertEquals(false, $response['body']['confirm']); /** * Test for FAILURE */ - $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid, array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders())); + // $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$uid'], + // ], $this->getHeaders())); - $this->assertEquals(404, $response['headers']['status-code']); + // $this->assertEquals(404, $response['headers']['status-code']); return []; } From 9df37a193c16e1f5bf1ecf95f0a95ebc2a824b91 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 18 Jan 2020 21:07:02 +0200 Subject: [PATCH 070/237] Fixed prefs validation --- app/controllers/api/account.php | 22 ++++++------- tests/e2e/Services/Account/AccountBase.php | 38 ++++++++++++++++++++-- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 0e80422f79..73ed4aeaa9 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -5,6 +5,7 @@ global $utopia, $register, $request, $response, $user, $audit, use Utopia\Exception; use Utopia\Response; +use Utopia\Validator\Assoc; use Utopia\Validator\Text; use Utopia\Validator\Email; use Utopia\Validator\WhiteList; @@ -70,14 +71,11 @@ $utopia->get('/v1/account/prefs') function () use ($response, $user) { $prefs = $user->getAttribute('prefs', '{}'); - if (empty($prefs)) { - $prefs = '[]'; - } - try { $prefs = json_decode($prefs, true); + $prefs = ($prefs) ? $prefs : []; } catch (\Exception $error) { - throw new Exception('Failed to parse preferences', 500); + throw new Exception('Failed to parse prefs', 500); } $response->json($prefs); @@ -755,12 +753,15 @@ $utopia->patch('/v1/account/prefs') ->label('scope', 'account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePrefs') - ->param('prefs', '', function () { return new \Utopia\Validator\Mock();}, 'Prefs key-value JSON object string.') + ->param('prefs', '', function () { return new Assoc();}, 'Prefs key-value JSON object.') ->label('sdk.description', '/docs/references/account/update-prefs.md') ->action( function ($prefs) use ($response, $user, $projectDB, $audit) { + $old = json_decode($user->getAttribute('prefs', '{}'), true); + $old = ($old) ? $old : []; + $user = $projectDB->updateDocument(array_merge($user->getArrayCopy(), [ - 'prefs' => json_encode(array_merge(json_decode($user->getAttribute('prefs', '{}'), true), $prefs)), + 'prefs' => json_encode(array_merge($old, $prefs)), ])); if (false === $user) { @@ -774,14 +775,11 @@ $utopia->patch('/v1/account/prefs') $prefs = $user->getAttribute('prefs', '{}'); - if (empty($prefs)) { - $prefs = '[]'; - } - try { $prefs = json_decode($prefs, true); + $prefs = ($prefs) ? $prefs : []; } catch (\Exception $error) { - throw new Exception('Failed to parse preferences', 500); + throw new Exception('Failed to parse prefs', 500); } $response->json($prefs); diff --git a/tests/e2e/Services/Account/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php index d0b1973dff..1e7eb884fa 100644 --- a/tests/e2e/Services/Account/AccountBase.php +++ b/tests/e2e/Services/Account/AccountBase.php @@ -593,6 +593,40 @@ trait AccountBase $this->assertEquals($response['headers']['status-code'], 401); + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ + 'prefs' => '{}' + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ + 'prefs' => '[]' + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + + $response = $this->client->call(Client::METHOD_PATCH, '/account/prefs', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + 'cookie' => 'a_session_'.$this->getProject()['$uid'].'=' . $session, + ]), [ + 'prefs' => '{"test": "value"}' + ]); + + $this->assertEquals($response['headers']['status-code'], 400); + return $data; } @@ -774,7 +808,7 @@ trait AccountBase /** * @depends testDeleteAccountSession */ - public function testCreateAccountRecovery($data):array + public function xtestCreateAccountRecovery($data):array { $email = (isset($data['email'])) ? $data['email'] : ''; $name = (isset($data['name'])) ? $data['name'] : ''; @@ -848,7 +882,7 @@ trait AccountBase /** * @depends testCreateAccountRecovery */ - public function testUpdateAccountRecovery($data):array + public function xtestUpdateAccountRecovery($data):array { $uid = (isset($data['uid'])) ? $data['uid'] : ''; $recovery = (isset($data['recovery'])) ? $data['recovery'] : ''; From 0beff2771b0830b5e4b8240e9bed65c3440c6228 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 18 Jan 2020 22:02:40 +0200 Subject: [PATCH 071/237] Updated change log --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index 951459dbde..203fdb6d4c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -23,6 +23,7 @@ * Fixed code location of project not found error * Fixed bug where tags element would ignore tab key for parsing new tags * Fixed OAuth login error saying project UID is missing when its not +* Fixed wrong input validation for user preferences # Version 0.4.0 (PRE-RELEASE) From e745a8e5b5c89bfca768398fda3b5cffeb845725 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 18 Jan 2020 22:02:47 +0200 Subject: [PATCH 072/237] Updated teams tests --- app/controllers/api/teams.php | 60 +++++++------------- tests/e2e/Services/Teams/TeamsBase.php | 44 -------------- tests/e2e/Services/Teams/TeamsBaseClient.php | 44 ++++++++++++++ 3 files changed, 63 insertions(+), 85 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 969649dace..139de4c84a 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -412,23 +412,15 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ->param('inviteId', '', function () { return new UID(); }, 'Invite unique ID') ->param('userId', '', function () { return new UID(); }, 'User unique ID') ->param('secret', '', function () { return new Text(256); }, 'Secret Key') - ->param('success', null, function () use ($clients) { return new Host($clients); }, 'Redirect when registration succeed', true) - ->param('failure', null, function () use ($clients) { return new Host($clients); }, 'Redirect when registration failed', true) ->action( - function ($teamId, $inviteId, $userId, $secret, $success, $failure) use ($response, $request, $user, $audit, $projectDB) { - $invite = $projectDB->getDocument($inviteId); - - if (empty($invite->getUid()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $invite->getCollection()) { - if ($failure) { - $response->redirect($failure); - - return; - } + function ($teamId, $inviteId, $userId, $secret) use ($response, $request, $user, $audit, $projectDB) { + $membership = $projectDB->getDocument($inviteId); + if (empty($membership->getUid()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { throw new Exception('Invite not found', 404); } - if ($invite->getAttribute('teamId')->getUid() !== $teamId) { + if ($membership->getAttribute('teamId')->getUid() !== $teamId) { throw new Exception('Team IDs don\'t match', 404); } @@ -438,23 +430,11 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') throw new Exception('Team not found', 404); } - if (Auth::hash($secret) !== $invite->getAttribute('secret')) { - if ($failure) { - $response->redirect($failure); - - return; - } - + if (Auth::hash($secret) !== $membership->getAttribute('secret')) { throw new Exception('Secret key not valid', 401); } - if ($userId != $invite->getAttribute('userId')) { - if ($failure) { - $response->redirect($failure); - - return; - } - + if ($userId != $membership->getAttribute('userId')) { throw new Exception('Invite not belong to current user ('.$user->getAttribute('email').')', 401); } @@ -469,24 +449,19 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ]); } - if ($invite->getAttribute('userId') !== $user->getUid()) { - if ($failure) { - $response->redirect($failure); - - return; - } - + if ($membership->getAttribute('userId') !== $user->getUid()) { throw new Exception('Invite not belong to current user ('.$user->getAttribute('email').')', 401); } - $invite // Attach user to team + $membership // Attach user to team ->setAttribute('joined', time()) ->setAttribute('confirm', true) ; $user ->setAttribute('confirm', true) - ->setAttribute('memberships', $invite, Document::SET_TYPE_APPEND); + ->setAttribute('memberships', $membership, Document::SET_TYPE_APPEND) + ; // Log user in $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; @@ -526,13 +501,16 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') $response ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ->json($membership->getArrayCopy([ + '$uid', + 'userId', + 'teamId', + 'roles', + 'invited', + 'joined', + 'confirm', + ])) ; - - if ($success) { - $response->redirect($success); - } - - $response->json(array('result' => 'success')); } ); diff --git a/tests/e2e/Services/Teams/TeamsBase.php b/tests/e2e/Services/Teams/TeamsBase.php index f8bf4d0469..f85c36d21c 100644 --- a/tests/e2e/Services/Teams/TeamsBase.php +++ b/tests/e2e/Services/Teams/TeamsBase.php @@ -261,48 +261,4 @@ trait TeamsBase return []; } - - /** - * @depends testCreateTeam - */ - public function testCreateTeamMembership($data):array - { - $uid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; - $email = uniqid().'friend@localhost.test'; - - /** - * Test for SUCCESS - */ - $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ - 'content-type' => 'application/json', - 'x-appwrite-project' => $this->getProject()['$uid'], - ], $this->getHeaders()), [ - 'email' => $email, - 'name' => 'Friend User', - 'roles' => ['admin', 'editor'], - 'url' => 'http://localhost:5000/join-us#title' - ]); - - if ($response['headers']['status-code'] !== 201) {var_dump($response);} - - $this->assertEquals(201, $response['headers']['status-code']); - $this->assertNotEmpty($response['body']['$uid']); - $this->assertNotEmpty($response['body']['userId']); - $this->assertNotEmpty($response['body']['teamId']); - $this->assertCount(2, $response['body']['roles']); - $this->assertIsInt($response['body']['joined']); - $this->assertEquals(false, $response['body']['confirm']); - - /** - * Test for FAILURE - */ - // $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$uid'], - // ], $this->getHeaders())); - - // $this->assertEquals(404, $response['headers']['status-code']); - - return []; - } } \ No newline at end of file diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index 2f741ffaa8..1040d0501d 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -34,4 +34,48 @@ trait TeamsBaseClient return []; } + + /** + * @depends testCreateTeam + */ + public function testCreateTeamMembership($data):array + { + $uid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; + $email = uniqid().'friend@localhost.test'; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'email' => $email, + 'name' => 'Friend User', + 'roles' => ['admin', 'editor'], + 'url' => 'http://localhost:5000/join-us#title' + ]); + + if ($response['headers']['status-code'] !== 201) {var_dump($response);} + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertNotEmpty($response['body']['userId']); + $this->assertNotEmpty($response['body']['teamId']); + $this->assertCount(2, $response['body']['roles']); + $this->assertIsInt($response['body']['joined']); + $this->assertEquals(false, $response['body']['confirm']); + + /** + * Test for FAILURE + */ + // $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ + // 'content-type' => 'application/json', + // 'x-appwrite-project' => $this->getProject()['$uid'], + // ], $this->getHeaders())); + + // $this->assertEquals(404, $response['headers']['status-code']); + + return []; + } } \ No newline at end of file From 7799ef47ec954320c27cc1c70e0a39fb4d43ea82 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 10:05:31 +0200 Subject: [PATCH 073/237] File upload route (POST /v1/storage/files) now accept a single file per request --- CHANGES.md | 1 + app/controllers/api/storage.php | 181 ++++++++++----------- tests/e2e/Services/Storage/StorageBase.php | 28 ++-- 3 files changed, 101 insertions(+), 109 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 203fdb6d4c..7de7d2ea6b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ * Added a new Spotify OAuth adapter * Upgraded MariaDB image to version 1.0.2 * Upgraded SMTP image to version 1.0.1 +* File upload route (POST /v1/storage/files) now accept a single file per request ## Bug Fixes diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index b2fa86a381..77e2960536 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -406,13 +406,13 @@ $utopia->post('/v1/storage/files') ->label('sdk.method', 'createFile') ->label('sdk.description', '/docs/references/storage/create-file.md') ->label('sdk.consumes', 'multipart/form-data') - ->param('files', [], function () { return new File(); }, 'Binary Files.', false) + ->param('file', [], function () { return new File(); }, 'Binary Files.', false) ->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.') // ->param('folderId', '', function () { return new UID(); }, 'Folder to associate files with.', true) ->action( - function ($files, $read, $write, $folderId = '') use ($request, $response, $user, $projectDB, $webhook, $audit, $usage) { - $files = $request->getFiles('files'); + function ($file, $read, $write, $folderId = '') use ($request, $response, $user, $projectDB, $webhook, $audit, $usage) { + $file = $request->getFiles('file'); $read = (empty($read)) ? ['user:'.$user->getUid()] : $read; $write = (empty($write)) ? ['user:'.$user->getUid()] : $write; @@ -423,27 +423,23 @@ $utopia->post('/v1/storage/files') $fileSize = new FileSize(2097152 * 2); // 4MB $upload = new Upload(); - if (empty($files)) { - throw new Exception('No files sent', 400); + if (empty($file)) { + throw new Exception('No file sent', 400); } - // Make sure we handle single file and multiple files the same way - $files['name'] = (is_array($files['name'])) ? $files['name'] : [$files['name']]; - $files['tmp_name'] = (is_array($files['tmp_name'])) ? $files['tmp_name'] : [$files['tmp_name']]; - $files['size'] = (is_array($files['size'])) ? $files['size'] : [$files['size']]; + // Make sure we handle a single file and multiple files the same way + $file['name'] = (is_array($file['name']) && isset($file['name'][0])) ? $file['name'][0] : $file['name']; + $file['tmp_name'] = (is_array($file['tmp_name']) && isset($file['tmp_name'][0])) ? $file['tmp_name'][0] : $file['tmp_name']; + $file['size'] = (is_array($file['size']) && isset($file['size'][0])) ? $file['size'][0] : $file['size']; - // Check if file type is allowed - //foreach ($files['tmp_name'] as $tmpName) { - //if (!$fileType->isValid($tmpName)) { + // Check if file type is allowed (feature for project settings?) + //if (!$fileType->isValid($file['tmp_name'])) { //throw new Exception('File type not allowed', 400); //} - //} // Check if file size is exceeding allowed limit - foreach ($files['size'] as $tmpSize) { - if (!$fileSize->isValid($tmpSize)) { - throw new Exception('File size not allowed', 400); - } + if (!$fileSize->isValid($file['size'])) { + throw new Exception('File size not allowed', 400); } $antiVirus = new Network('clamav', 3310); @@ -454,88 +450,83 @@ $utopia->post('/v1/storage/files') $list = []; $device = Storage::getDevice('local'); - foreach ($files['tmp_name'] as $i => $tmpName) { - if (!$upload->isValid($tmpName)) { - throw new Exception('Invalid file', 403); - } - - // Save to storage - $name = $files['name'][$i]; - $size = $device->getFileSize($tmpName); - $path = $device->getPath(uniqid().'.'.pathinfo($name, PATHINFO_EXTENSION)); - - if (!$device->upload($tmpName, $path)) { // TODO deprecate 'upload' and replace with 'move' - throw new Exception('Failed moving file', 500); - } - - $mimeType = $device->getFileMimeType($path); // Get mime-type before compression and encryption - - // Check if file size is exceeding allowed limit - if (!$antiVirus->fileScan($path)) { - $device->delete($path); - throw new Exception('Invalid file', 403); - } - - // Compression - $compressor = new GZIP(); - $data = $device->read($path); - $data = $compressor->compress($data); - $key = $request->getServer('_APP_OPENSSL_KEY_V1'); - $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)) { - throw new Exception('Failed to save file', 500); - } - - $sizeActual = $device->getFileSize($path); - - $file = $projectDB->createDocument([ - '$collection' => Database::SYSTEM_COLLECTION_FILES, - '$permissions' => [ - 'read' => $read, - 'write' => $write, - ], - 'dateCreated' => time(), - 'folderId' => $folderId, - 'name' => $name, - 'path' => $path, - 'signature' => $device->getFileHash($path), - 'mimeType' => $mimeType, - 'sizeOriginal' => $size, - 'sizeActual' => $sizeActual, - 'algorithm' => $compressor->getName(), - 'token' => bin2hex(random_bytes(64)), - 'comment' => '', - 'fileOpenSSLVersion' => '1', - 'fileOpenSSLCipher' => OpenSSL::CIPHER_AES_128_GCM, - 'fileOpenSSLTag' => bin2hex($tag), - 'fileOpenSSLIV' => bin2hex($iv), - ]); - - if (false === $file) { - throw new Exception('Failed saving file to DB', 500); - } - - $webhook - ->setParam('payload', $file->getArrayCopy()) - ; - - $audit - ->setParam('event', 'storage.files.create') - ->setParam('resource', 'storage/files/'.$file->getUid()) - ; - - $usage - ->setParam('storage', $sizeActual) - ; - - $list[] = $file->getArrayCopy(); + if (!$upload->isValid($file['tmp_name'])) { + throw new Exception('Invalid file', 403); } + // Save to storage + $size = $device->getFileSize($file['tmp_name']); + $path = $device->getPath(uniqid().'.'.pathinfo($file['name'], PATHINFO_EXTENSION)); + + if (!$device->upload($file['tmp_name'], $path)) { // TODO deprecate 'upload' and replace with 'move' + throw new Exception('Failed moving file', 500); + } + + $mimeType = $device->getFileMimeType($path); // Get mime-type before compression and encryption + + // Check if file size is exceeding allowed limit + if (!$antiVirus->fileScan($path)) { + $device->delete($path); + throw new Exception('Invalid file', 403); + } + + // Compression + $compressor = new GZIP(); + $data = $device->read($path); + $data = $compressor->compress($data); + $key = $request->getServer('_APP_OPENSSL_KEY_V1'); + $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)) { + throw new Exception('Failed to save file', 500); + } + + $sizeActual = $device->getFileSize($path); + + $file = $projectDB->createDocument([ + '$collection' => Database::SYSTEM_COLLECTION_FILES, + '$permissions' => [ + 'read' => $read, + 'write' => $write, + ], + 'dateCreated' => time(), + 'folderId' => $folderId, + 'name' => $file['name'], + 'path' => $path, + 'signature' => $device->getFileHash($path), + 'mimeType' => $mimeType, + 'sizeOriginal' => $size, + 'sizeActual' => $sizeActual, + 'algorithm' => $compressor->getName(), + 'token' => bin2hex(random_bytes(64)), + 'comment' => '', + 'fileOpenSSLVersion' => '1', + 'fileOpenSSLCipher' => OpenSSL::CIPHER_AES_128_GCM, + 'fileOpenSSLTag' => bin2hex($tag), + 'fileOpenSSLIV' => bin2hex($iv), + ]); + + if (false === $file) { + throw new Exception('Failed saving file to DB', 500); + } + + $webhook + ->setParam('payload', $file->getArrayCopy()) + ; + + $audit + ->setParam('event', 'storage.files.create') + ->setParam('resource', 'storage/files/'.$file->getUid()) + ; + + $usage + ->setParam('storage', $sizeActual) + ; + $response ->setStatusCode(Response::STATUS_CODE_CREATED) - ->json($list) + ->json($file->getArrayCopy()) ; } ); diff --git a/tests/e2e/Services/Storage/StorageBase.php b/tests/e2e/Services/Storage/StorageBase.php index a32111d13c..bbedc68390 100644 --- a/tests/e2e/Services/Storage/StorageBase.php +++ b/tests/e2e/Services/Storage/StorageBase.php @@ -16,30 +16,30 @@ trait StorageBase 'content-type' => 'multipart/form-data', 'x-appwrite-project' => $this->getProject()['$uid'], ], $this->getHeaders()), [ - 'files' => new CURLFile(realpath(__DIR__ . '/../../../resources/logo.png'), 'image/png', 'logo.png'), + 'file' => new CURLFile(realpath(__DIR__ . '/../../../resources/logo.png'), 'image/png', 'logo.png'), 'read' => ['*'], 'write' => ['*'], 'folderId' => 'xyz', ]); $this->assertEquals($file['headers']['status-code'], 201); - $this->assertNotEmpty($file['body'][0]['$uid']); - $this->assertEquals('files', $file['body'][0]['$collection']); - $this->assertIsInt($file['body'][0]['dateCreated']); - $this->assertEquals('logo.png', $file['body'][0]['name']); - $this->assertEquals('image/png', $file['body'][0]['mimeType']); - $this->assertEquals(47218, $file['body'][0]['sizeOriginal']); - $this->assertEquals(54944, $file['body'][0]['sizeActual']); - $this->assertEquals('gzip', $file['body'][0]['algorithm']); - $this->assertEquals('1', $file['body'][0]['fileOpenSSLVersion']); - $this->assertEquals('aes-128-gcm', $file['body'][0]['fileOpenSSLCipher']); - $this->assertNotEmpty($file['body'][0]['fileOpenSSLTag']); - $this->assertNotEmpty($file['body'][0]['fileOpenSSLIV']); + $this->assertNotEmpty($file['body']['$uid']); + $this->assertEquals('files', $file['body']['$collection']); + $this->assertIsInt($file['body']['dateCreated']); + $this->assertEquals('logo.png', $file['body']['name']); + $this->assertEquals('image/png', $file['body']['mimeType']); + $this->assertEquals(47218, $file['body']['sizeOriginal']); + $this->assertEquals(54944, $file['body']['sizeActual']); + $this->assertEquals('gzip', $file['body']['algorithm']); + $this->assertEquals('1', $file['body']['fileOpenSSLVersion']); + $this->assertEquals('aes-128-gcm', $file['body']['fileOpenSSLCipher']); + $this->assertNotEmpty($file['body']['fileOpenSSLTag']); + $this->assertNotEmpty($file['body']['fileOpenSSLIV']); /** * Test for FAILURE */ - return ['fileId' => $file['body'][0]['$uid']]; + return ['fileId' => $file['body']['$uid']]; } /** From 3ee4328fa2a1d9786140e445340d91bba1ef9544 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 12:43:06 +0200 Subject: [PATCH 074/237] More teams service tests --- tests/e2e/Services/Teams/TeamsBaseClient.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index 1040d0501d..c10062be0e 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -56,8 +56,6 @@ trait TeamsBaseClient 'url' => 'http://localhost:5000/join-us#title' ]); - if ($response['headers']['status-code'] !== 201) {var_dump($response);} - $this->assertEquals(201, $response['headers']['status-code']); $this->assertNotEmpty($response['body']['$uid']); $this->assertNotEmpty($response['body']['userId']); @@ -69,12 +67,18 @@ trait TeamsBaseClient /** * Test for FAILURE */ - // $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ - // 'content-type' => 'application/json', - // 'x-appwrite-project' => $this->getProject()['$uid'], - // ], $this->getHeaders())); - // $this->assertEquals(404, $response['headers']['status-code']); + $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'email' => 'dasdkaskdjaskdjasjkd', + 'name' => 'Friend User', + 'roles' => ['admin', 'editor'], + 'url' => 'http://localhost:5000/join-us#title' + ]); + + $this->assertEquals(400, $response['headers']['status-code']); return []; } From 066e3e23c37a35d76538024eb79c94f947ad9682 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 12:43:14 +0200 Subject: [PATCH 075/237] Updated changelog --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 7de7d2ea6b..ba69817755 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -13,6 +13,8 @@ * Added a new Discord OAuth adapter * Added a new Twitch OAuth adapter * Added a new Spotify OAuth adapter +* Added a new Yahoo OAuth adapter +* Added a new Salesforce OAuth adapter * Upgraded MariaDB image to version 1.0.2 * Upgraded SMTP image to version 1.0.1 * File upload route (POST /v1/storage/files) now accept a single file per request From 9c97b96ab47c637abd67fe18cc055c3accb0988f Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 14:22:45 +0200 Subject: [PATCH 076/237] 'token' is now 'secret' for better consistency --- app/controllers/api/account.php | 16 ++++++++-------- tests/e2e/Services/Account/AccountBase.php | 10 +++++----- tests/old/AccountTest.php | 10 +++++----- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 73ed4aeaa9..bc00b7cb42 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1003,7 +1003,7 @@ $utopia->post('/v1/account/recovery') } $url = Template::parseURL($url); - $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $profile->getUid(), 'token' => $secret]); + $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $profile->getUid(), 'secret' => $secret]); $url = Template::unParseURL($url); $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.recovery.body')); @@ -1050,11 +1050,11 @@ $utopia->put('/v1/account/recovery') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{param-userId}') ->param('userId', '', function () { return new UID(); }, 'User account UID address.') - ->param('token', '', function () { return new Text(256); }, 'Valid reset token.') + ->param('secret', '', function () { return new Text(256); }, 'Valid reset token.') ->param('password-a', '', function () { return new Password(); }, 'New password.') ->param('password-b', '', function () {return new Password(); }, 'New password again.') ->action( - function ($userId, $token, $passwordA, $passwordB) use ($response, $projectDB, $audit) { + function ($userId, $secret, $passwordA, $passwordB) use ($response, $projectDB, $audit) { if ($passwordA !== $passwordB) { throw new Exception('Passwords must match', 400); } @@ -1072,7 +1072,7 @@ $utopia->put('/v1/account/recovery') throw new Exception('User not found', 404); // TODO maybe hide this } - $recovery = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_RECOVERY, $token); + $recovery = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_RECOVERY, $secret); if (!$recovery) { throw new Exception('Invalid recovery token', 401); @@ -1150,7 +1150,7 @@ $utopia->put('/v1/account/recovery') } $url = Template::parseURL($url); - $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $user->getUid(), 'token' => $verificationSecret]); + $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $user->getUid(), 'secret' => $verificationSecret]); $url = Template::unParseURL($url); $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('auth.emails.verification.body')); @@ -1197,9 +1197,9 @@ $utopia->put('/v1/account/verification') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{param-userId}') ->param('userId', '', function () { return new UID(); }, 'User account UID address.') - ->param('token', '', function () { return new Text(256); }, 'Valid reset token.') ->param('password-b', '', function () {return new Password(); }, 'New password again.') + ->param('secret', '', function () { return new Text(256); }, 'Valid reset token.') ->param('password-b', '', function () {return new Password(); }, 'New password again.') ->action( - function ($userId, $token) use ($response, $user, $projectDB, $audit) { + function ($userId, $secret) use ($response, $user, $projectDB, $audit) { $profile = $projectDB->getCollection([ // Get user by email address 'limit' => 1, 'first' => true, @@ -1213,7 +1213,7 @@ $utopia->put('/v1/account/verification') throw new Exception('User not found', 404); // TODO maybe hide this } - $verification = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_VERIFICATION, $token); + $verification = Auth::tokenVerify($profile->getAttribute('tokens', []), Auth::TOKEN_TYPE_VERIFICATION, $secret); if (!$verification) { throw new Exception('Invalid verification token', 401); diff --git a/tests/e2e/Services/Account/AccountBase.php b/tests/e2e/Services/Account/AccountBase.php index 1e7eb884fa..0d913ea446 100644 --- a/tests/e2e/Services/Account/AccountBase.php +++ b/tests/e2e/Services/Account/AccountBase.php @@ -836,7 +836,7 @@ trait AccountBase $this->assertEquals($name, $lastEmail['to'][0]['name']); $this->assertEquals('Password Reset', $lastEmail['subject']); - $recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&token=', 0) + 7, 256); + $recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&secret=', 0) + 8, 256); /** * Test for FAILURE @@ -897,7 +897,7 @@ trait AccountBase 'x-appwrite-project' => $this->getProject()['$uid'], ]), [ 'userId' => $uid, - 'token' => $recovery, + 'secret' => $recovery, 'password-a' => $newPassowrd, 'password-b' => $newPassowrd, ]); @@ -913,7 +913,7 @@ trait AccountBase 'x-appwrite-project' => $this->getProject()['$uid'], ]), [ 'userId' => 'ewewe', - 'token' => $recovery, + 'secret' => $recovery, 'password-a' => $newPassowrd, 'password-b' => $newPassowrd, ]); @@ -926,7 +926,7 @@ trait AccountBase 'x-appwrite-project' => $this->getProject()['$uid'], ]), [ 'userId' => $uid, - 'token' => 'sdasdasdasd', + 'secret' => 'sdasdasdasd', 'password-a' => $newPassowrd, 'password-b' => $newPassowrd, ]); @@ -939,7 +939,7 @@ trait AccountBase 'x-appwrite-project' => $this->getProject()['$uid'], ]), [ 'userId' => $uid, - 'token' => $recovery, + 'secret' => $recovery, 'password-a' => $newPassowrd.'x', 'password-b' => $newPassowrd, ]); diff --git a/tests/old/AccountTest.php b/tests/old/AccountTest.php index f9a16c9be6..739250dce9 100644 --- a/tests/old/AccountTest.php +++ b/tests/old/AccountTest.php @@ -815,7 +815,7 @@ class AccountTest extends Base $this->assertEquals($name, $lastEmail['to'][0]['name']); $this->assertEquals('Password Reset', $lastEmail['subject']); - $recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&token=', 0) + 7, 256); + $recovery = substr($lastEmail['text'], strpos($lastEmail['text'], '&userId=', 0) + 8, 256); /** * Test for FAILURE @@ -876,7 +876,7 @@ class AccountTest extends Base 'x-appwrite-project' => 'console', ], [ 'userId' => $uid, - 'token' => $recovery, + 'secret' => $recovery, 'password-a' => $newPassowrd, 'password-b' => $newPassowrd, ]); @@ -892,7 +892,7 @@ class AccountTest extends Base 'x-appwrite-project' => 'console', ], [ 'userId' => 'ewewe', - 'token' => $recovery, + 'secret' => $recovery, 'password-a' => $newPassowrd, 'password-b' => $newPassowrd, ]); @@ -905,7 +905,7 @@ class AccountTest extends Base 'x-appwrite-project' => 'console', ], [ 'userId' => $uid, - 'token' => 'sdasdasdasd', + 'secret' => 'sdasdasdasd', 'password-a' => $newPassowrd, 'password-b' => $newPassowrd, ]); @@ -918,7 +918,7 @@ class AccountTest extends Base 'x-appwrite-project' => 'console', ], [ 'userId' => $uid, - 'token' => $recovery, + 'secret' => $recovery, 'password-a' => $newPassowrd.'x', 'password-b' => $newPassowrd, ]); From 5e4c124caee1d44e3f79e3f75887101887e7d515 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 14:22:54 +0200 Subject: [PATCH 077/237] New invite tests --- app/controllers/api/teams.php | 12 +- tests/e2e/Services/Teams/TeamsBase.php | 3 +- tests/e2e/Services/Teams/TeamsBaseClient.php | 133 ++++++++++++++++++- 3 files changed, 138 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 139de4c84a..b148ea649c 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -403,7 +403,7 @@ $utopia->post('/v1/teams/:teamId/memberships') $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ->desc('Update Team Membership Status') - ->label('scope', 'auth') + ->label('scope', 'public') ->label('sdk.namespace', 'teams') ->label('sdk.method', 'updateTeamMembershipStatus') ->label('sdk.description', '/docs/references/teams/update-team-membership-status.md') @@ -420,11 +420,15 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') throw new Exception('Invite not found', 404); } - if ($membership->getAttribute('teamId')->getUid() !== $teamId) { + if ($membership->getAttribute('teamId') !== $teamId) { throw new Exception('Team IDs don\'t match', 404); } + Authorization::disable(); + $team = $projectDB->getDocument($teamId); + + Authorization::enable(); if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); @@ -485,10 +489,14 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') throw new Exception('Failed saving user to DB', 500); } + Authorization::disable(); + $team = $projectDB->updateDocument(array_merge($team->getArrayCopy(), [ 'sum' => $team->getAttribute('sum', 0) + 1, ])); + Authorization::enable(); + if (false === $team) { throw new Exception('Failed saving team to DB', 500); } diff --git a/tests/e2e/Services/Teams/TeamsBase.php b/tests/e2e/Services/Teams/TeamsBase.php index f85c36d21c..a2f292bc24 100644 --- a/tests/e2e/Services/Teams/TeamsBase.php +++ b/tests/e2e/Services/Teams/TeamsBase.php @@ -26,6 +26,7 @@ trait TeamsBase $this->assertIsInt($response1['body']['dateCreated']); $teamUid = $response1['body']['$uid']; + $teamName = $response1['body']['name']; $response2 = $this->client->call(Client::METHOD_POST, '/teams', array_merge([ 'content-type' => 'application/json', @@ -66,7 +67,7 @@ trait TeamsBase $this->assertEquals(400, $response['headers']['status-code']); - return ['teamUid' => $teamUid]; + return ['teamUid' => $teamUid, 'teamName' => $teamName]; } /** diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index c10062be0e..4c7f14df3d 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -11,12 +11,12 @@ trait TeamsBaseClient */ public function testGetTeamMembers($data):array { - $uid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; + $teamUid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/teams/'.$uid.'/members', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/members', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], ], $this->getHeaders())); @@ -32,7 +32,7 @@ trait TeamsBaseClient * Test for FAILURE */ - return []; + return $data; } /** @@ -40,13 +40,14 @@ trait TeamsBaseClient */ public function testCreateTeamMembership($data):array { - $uid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; + $teamUid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; + $teamName = (isset($data['teamName'])) ? $data['teamName'] : ''; $email = uniqid().'friend@localhost.test'; /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ + $response = $this->client->call(Client::METHOD_POST, '/teams/'.$teamUid.'/memberships', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], ], $this->getHeaders()), [ @@ -64,11 +65,20 @@ trait TeamsBaseClient $this->assertIsInt($response['body']['joined']); $this->assertEquals(false, $response['body']['confirm']); + $lastEmail = $this->getLastEmail(); + + $this->assertEquals($email, $lastEmail['to'][0]['address']); + $this->assertEquals('Friend User', $lastEmail['to'][0]['name']); + $this->assertEquals('Invitation to '.$teamName.' Team at '.$this->getProject()['name'], $lastEmail['subject']); + + $secret = substr($lastEmail['text'], strpos($lastEmail['text'], '&secret=', 0) + 8, 256); + $inviteUid = substr($lastEmail['text'], strpos($lastEmail['text'], '?inviteId=', 0) + 10, 13); + $userUid = substr($lastEmail['text'], strpos($lastEmail['text'], '&userId=', 0) + 8, 13); + /** * Test for FAILURE */ - - $response = $this->client->call(Client::METHOD_POST, '/teams/'.$uid.'/memberships', array_merge([ + $response = $this->client->call(Client::METHOD_POST, '/teams/'.$teamUid.'/memberships', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], ], $this->getHeaders()), [ @@ -80,6 +90,115 @@ trait TeamsBaseClient $this->assertEquals(400, $response['headers']['status-code']); + $response = $this->client->call(Client::METHOD_POST, '/teams/'.$teamUid.'/memberships', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'email' => $email, + 'name' => 'Friend User', + 'roles' => 'bad string', + 'url' => 'http://localhost:5000/join-us#title' + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_POST, '/teams/'.$teamUid.'/memberships', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'email' => $email, + 'name' => 'Friend User', + 'roles' => ['admin', 'editor'], + 'url' => 'http://example.com/join-us#title' // bad url + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + return [ + 'teamUid' => $teamUid, + 'secret' => $secret, + 'inviteUid' => $inviteUid, + 'userUid' => $userUid, + ]; + } + + /** + * @depends testCreateTeamMembership + */ + public function testUpdateTeamMembership($data):array + { + $teamUid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; + $secret = (isset($data['secret'])) ? $data['secret'] : ''; + $inviteUid = (isset($data['inviteUid'])) ? $data['inviteUid'] : ''; + $userUid = (isset($data['userUid'])) ? $data['userUid'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$inviteUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]), [ + 'secret' => $secret, + 'userId' => $userUid, + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$uid']); + $this->assertNotEmpty($response['body']['userId']); + $this->assertNotEmpty($response['body']['teamId']); + $this->assertCount(2, $response['body']['roles']); + $this->assertIsInt($response['body']['joined']); + $this->assertEquals(true, $response['body']['confirm']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$inviteUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]), [ + 'secret' => 'sdasdasd', + 'userId' => $userUid, + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$inviteUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]), [ + 'secret' => '', + 'userId' => $userUid, + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$inviteUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]), [ + 'secret' => $secret, + 'userId' => 'sdasd', + ]); + + $this->assertEquals(401, $response['headers']['status-code']); + + $response = $this->client->call(Client::METHOD_PATCH, '/teams/'.$teamUid.'/memberships/'.$inviteUid.'/status', array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ]), [ + 'secret' => $secret, + 'userId' => '', + ]); + + $this->assertEquals(400, $response['headers']['status-code']); + return []; } } \ No newline at end of file From 55c89d47e84ea1d0af67c176fc08688dfb8fe478 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 15:36:30 +0200 Subject: [PATCH 078/237] Completed teams service e2e tests --- tests/e2e/Services/Teams/TeamsBaseClient.php | 35 ++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index 4c7f14df3d..0201ccb33c 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -199,6 +199,41 @@ trait TeamsBaseClient $this->assertEquals(400, $response['headers']['status-code']); + return $data; + } + + /** + * @depends testUpdateTeamMembership + */ + public function testDeleteTeamMembership($data):array + { + $teamUid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; + $inviteUid = (isset($data['inviteUid'])) ? $data['inviteUid'] : ''; + + /** + * Test for SUCCESS + */ + $response = $this->client->call(Client::METHOD_DELETE, '/teams/'.$teamUid.'/memberships/'.$inviteUid, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + /** + * Test for FAILURE + */ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships/'.$inviteUid, array_merge([ + 'origin' => 'http://localhost', + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertCount(1, $response['body']); + return []; } } \ No newline at end of file From 16362e85e5a2b360242611f3c4eaed9a67ea67b9 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 22:02:50 +0200 Subject: [PATCH 079/237] Updated teams service --- app/controllers/api/teams.php | 120 ++++++++++--------- tests/e2e/Services/Teams/TeamsBaseClient.php | 5 +- tests/e2e/Services/Teams/TeamsBaseServer.php | 6 +- 3 files changed, 69 insertions(+), 62 deletions(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index b148ea649c..5609a3ee49 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -67,58 +67,6 @@ $utopia->get('/v1/teams/:teamId') } ); -$utopia->get('/v1/teams/:teamId/members') - ->desc('Get Team Members') - ->label('scope', 'teams.read') - ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'getTeamMembers') - ->label('sdk.description', '/docs/references/teams/get-team-members.md') - ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') - ->action( - function ($teamId) use ($response, $projectDB) { - $team = $projectDB->getDocument($teamId); - - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { - throw new Exception('Team not found', 404); - } - - $memberships = $projectDB->getCollection([ - 'limit' => 50, - 'offset' => 0, - 'filters' => [ - '$collection='.Database::SYSTEM_COLLECTION_MEMBERSHIPS, - 'teamId='.$teamId, - ], - ]); - - $users = []; - - foreach ($memberships as $member) { - if (empty($member->getAttribute('userId', null))) { - continue; - } - - $temp = $projectDB->getDocument($member->getAttribute('userId', null))->getArrayCopy(['$uid', 'email', 'name']); - - $temp['inviteId'] = $member->getUid(); - $temp['roles'] = $member->getAttribute('roles', []); - $temp['confirm'] = $member->getAttribute('confirm', false); - $temp['joined'] = $member->getAttribute('joined', 0); - $users[] = $temp; - } - - usort($users, function ($a, $b) { - if ($a['joined'] === 0 || $b['joined'] === 0) { - return $b['joined'] - $a['joined']; - } - - return $a['joined'] - $b['joined']; - }); - - $response->json($users); - } - ); - $utopia->post('/v1/teams') ->desc('Create Team') ->label('scope', 'teams.write') @@ -247,7 +195,61 @@ $utopia->delete('/v1/teams/:teamId') } ); -// Memberships +$utopia->get('/v1/teams/:teamId/memberships') + ->desc('Get Team Memberships') + ->label('scope', 'teams.read') + ->label('sdk.namespace', 'teams') + ->label('sdk.method', 'getTeamMemberships') + ->label('sdk.description', '/docs/references/teams/get-team-members.md') + ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') + ->action( + function ($teamId) use ($response, $projectDB) { + $team = $projectDB->getDocument($teamId); + + if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + throw new Exception('Team not found', 404); + } + + $memberships = $projectDB->getCollection([ + 'limit' => 50, + 'offset' => 0, + 'filters' => [ + '$collection='.Database::SYSTEM_COLLECTION_MEMBERSHIPS, + 'teamId='.$teamId, + ], + ]); + + $users = []; + + foreach ($memberships as $membership) { + if (empty($membership->getAttribute('userId', null))) { + continue; + } + + $temp = $projectDB->getDocument($membership->getAttribute('userId', null))->getArrayCopy(['email', 'name']); + + $users[] = array_merge($temp, $membership->getArrayCopy([ + '$uid', + 'userId', + 'teamId', + 'roles', + 'invited', + 'joined', + 'confirm', + ])); + } + + usort($users, function ($a, $b) { + if ($a['joined'] === 0 || $b['joined'] === 0) { + return $b['joined'] - $a['joined']; + } + + return $a['joined'] - $b['joined']; + }); + + $response->json($users); + } + ); $utopia->post('/v1/teams/:teamId/memberships') ->desc('Create Team Membership') @@ -388,7 +390,7 @@ $utopia->post('/v1/teams/:teamId/memberships') $response ->setStatusCode(Response::STATUS_CODE_CREATED) // TODO change response of this endpoint - ->json($membership->getArrayCopy([ + ->json(array_merge($membership->getArrayCopy([ '$uid', 'userId', 'teamId', @@ -396,6 +398,9 @@ $utopia->post('/v1/teams/:teamId/memberships') 'invited', 'joined', 'confirm', + ]), [ + 'email' => $email, + 'name' => $name, ])) ; } @@ -496,7 +501,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ])); Authorization::enable(); - + if (false === $team) { throw new Exception('Failed saving team to DB', 500); } @@ -509,7 +514,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') $response ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getUid(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) - ->json($membership->getArrayCopy([ + ->json(array_merge($membership->getArrayCopy([ '$uid', 'userId', 'teamId', @@ -517,6 +522,9 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') 'invited', 'joined', 'confirm', + ]), [ + 'email' => $user->getAttribute('email'), + 'name' => $user->getAttribute('name'), ])) ; } diff --git a/tests/e2e/Services/Teams/TeamsBaseClient.php b/tests/e2e/Services/Teams/TeamsBaseClient.php index 0201ccb33c..eebd0ddb6c 100644 --- a/tests/e2e/Services/Teams/TeamsBaseClient.php +++ b/tests/e2e/Services/Teams/TeamsBaseClient.php @@ -9,21 +9,20 @@ trait TeamsBaseClient /** * @depends testCreateTeam */ - public function testGetTeamMembers($data):array + public function testGetTeamMemberships($data):array { $teamUid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/members', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$teamUid.'/memberships', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], ], $this->getHeaders())); $this->assertEquals(200, $response['headers']['status-code']); $this->assertNotEmpty($response['body'][0]['$uid']); - $this->assertEquals($this->getUser()['$uid'], $response['body'][0]['$uid']); $this->assertEquals($this->getUser()['name'], $response['body'][0]['name']); $this->assertEquals($this->getUser()['email'], $response['body'][0]['email']); $this->assertEquals('owner', $response['body'][0]['roles'][0]); diff --git a/tests/e2e/Services/Teams/TeamsBaseServer.php b/tests/e2e/Services/Teams/TeamsBaseServer.php index 98af82647b..a0ea126e36 100644 --- a/tests/e2e/Services/Teams/TeamsBaseServer.php +++ b/tests/e2e/Services/Teams/TeamsBaseServer.php @@ -9,18 +9,18 @@ trait TeamsBaseServer /** * @depends testCreateTeam */ - public function testGetTeamMembers($data):array + public function testGetTeamMemberships($data):array { $uid = (isset($data['teamUid'])) ? $data['teamUid'] : ''; /** * Test for SUCCESS */ - $response = $this->client->call(Client::METHOD_GET, '/teams/'.$uid.'/members', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/teams/'.$uid.'/memberships', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$uid'], ], $this->getHeaders())); - + $this->assertEquals(200, $response['headers']['status-code']); $this->assertCount(0, $response['body']); From a1023a683dd8b47be067cae010c14c9e8b30ba2f Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 22:24:08 +0200 Subject: [PATCH 080/237] Keep entities under projects --- app/controllers/api/keys.php | 135 ------------------ app/controllers/api/platforms.php | 145 ------------------- app/controllers/api/tasks.php | 229 ------------------------------ app/controllers/api/webhooks.php | 193 ------------------------- 4 files changed, 702 deletions(-) delete mode 100644 app/controllers/api/keys.php delete mode 100644 app/controllers/api/platforms.php delete mode 100644 app/controllers/api/tasks.php delete mode 100644 app/controllers/api/webhooks.php diff --git a/app/controllers/api/keys.php b/app/controllers/api/keys.php deleted file mode 100644 index 177b767a43..0000000000 --- a/app/controllers/api/keys.php +++ /dev/null @@ -1,135 +0,0 @@ -get('/v1/keys') - ->desc('List Keys') - ->label('scope', 'keys.read') - ->label('sdk.namespace', 'keys') - ->label('sdk.method', 'listKeys') - ->action( - function () use ($response, $consoleDB, $project) { - $response->json($project->getAttribute('keys', [])); //FIXME make sure array objects return correctly - } - ); - -$utopia->get('/v1/keys/:keyId') - ->desc('Get Key') - ->label('scope', 'keys.read') - ->label('sdk.namespace', 'keys') - ->label('sdk.method', 'getKey') - ->param('keyId', null, function () { return new UID(); }, 'Key unique ID.') - ->action( - function ($keyId) use ($response, $consoleDB, $project) { - $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/keys') - ->desc('Create Key') - ->label('scope', 'keys.write') - ->label('sdk.namespace', 'keys') - ->label('sdk.method', 'createKey') - ->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 ($name, $scopes) use ($response, $consoleDB, $project) { - $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/keys/:keyId') - ->desc('Update Key') - ->label('scope', 'keys.write') - ->label('sdk.namespace', 'keys') - ->label('sdk.method', 'updateKey') - ->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 ($keyId, $name, $scopes) use ($response, $consoleDB, $project) { - $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/keys/:keyId') - ->desc('Delete Key') - ->label('scope', 'keys.write') - ->label('sdk.namespace', 'keys') - ->label('sdk.method', 'deleteKey') - ->param('keyId', null, function () { return new UID(); }, 'Key unique ID.') - ->action( - function ($keyId) use ($response, $consoleDB, $project) { - $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(); - } - ); \ No newline at end of file diff --git a/app/controllers/api/platforms.php b/app/controllers/api/platforms.php deleted file mode 100644 index ec0b978837..0000000000 --- a/app/controllers/api/platforms.php +++ /dev/null @@ -1,145 +0,0 @@ -get('/v1/platforms') - ->desc('List Platforms') - ->label('scope', 'platforms.read') - ->label('sdk.namespace', 'platforms') - ->label('sdk.method', 'listPlatforms') - ->action( - function () use ($request, $response, $consoleDB, $project) { - $response->json($project->getAttribute('platforms', [])); - } - ); - -$utopia->get('/v1/platforms/:platformId') - ->desc('Get Platform') - ->label('scope', 'platforms.read') - ->label('sdk.namespace', 'platforms') - ->label('sdk.method', 'getPlatform') - ->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.') - ->action( - function ($platformId) use ($request, $response, $consoleDB, $project) { - $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/platforms') - ->desc('Create Platform') - ->label('scope', 'platforms.write') - ->label('sdk.namespace', 'platforms') - ->label('sdk.method', 'createPlatform') - ->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 ($type, $name, $key, $store, $url) use ($response, $consoleDB, $project) { - $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/platforms/:platformId') - ->desc('Update Platform') - ->label('scope', 'platforms.write') - ->label('sdk.namespace', 'platforms') - ->label('sdk.method', 'updatePlatform') - ->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 ($platformId, $name, $key, $store, $url) use ($response, $consoleDB, $project) { - $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/platforms/:platformId') - ->desc('Delete Platform') - ->label('scope', 'platforms.write') - ->label('sdk.namespace', 'platforms') - ->label('sdk.method', 'deletePlatform') - ->param('platformId', null, function () { return new UID(); }, 'Platform unique ID.') - ->action( - function ($platformId) use ($response, $consoleDB, $project) { - $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(); - } - ); diff --git a/app/controllers/api/tasks.php b/app/controllers/api/tasks.php deleted file mode 100644 index c7ea8c19b6..0000000000 --- a/app/controllers/api/tasks.php +++ /dev/null @@ -1,229 +0,0 @@ -get('/v1/tasks') - ->desc('List Tasks') - ->label('scope', 'tasks.read') - ->label('sdk.namespace', 'tasks') - ->label('sdk.method', 'listTasks') - ->action( - function () use ($request, $response, $consoleDB, $project) { - $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/tasks/:taskId') - ->desc('Get Task') - ->label('scope', 'tasks.read') - ->label('sdk.namespace', 'tasks') - ->label('sdk.method', 'getTask') - ->param('taskId', null, function () { return new UID(); }, 'Task unique ID.') - ->action( - function ($taskId) use ($request, $response, $consoleDB, $project) { - $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/tasks') - ->desc('Create Task') - ->label('scope', 'tasks.write') - ->label('sdk.namespace', 'tasks') - ->label('sdk.method', 'createTask') - ->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 ($name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass) use ($request, $response, $consoleDB, $project) { - $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/tasks/:taskId') - ->desc('Update Task') - ->label('scope', 'tasks.write') - ->label('sdk.namespace', 'tasks') - ->label('sdk.method', 'updateTask') - ->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 ($taskId, $name, $status, $schedule, $security, $httpMethod, $httpUrl, $httpHeaders, $httpUser, $httpPass) use ($request, $response, $consoleDB, $project) { - $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/tasks/:taskId') - ->desc('Delete Task') - ->label('scope', 'tasks.write') - ->label('sdk.namespace', 'tasks') - ->label('sdk.method', 'deleteTask') - ->param('taskId', null, function () { return new UID(); }, 'Task unique ID.') - ->action( - function ($taskId) use ($response, $consoleDB, $project) { - $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(); - } - ); \ No newline at end of file diff --git a/app/controllers/api/webhooks.php b/app/controllers/api/webhooks.php deleted file mode 100644 index 78362e1a2e..0000000000 --- a/app/controllers/api/webhooks.php +++ /dev/null @@ -1,193 +0,0 @@ -get('/v1/webhooks') - ->desc('List Webhooks') - ->label('scope', 'webhooks.read') - ->label('sdk.namespace', 'webhooks') - ->label('sdk.method', 'listWebhooks') - ->action( - function () use ($request, $response, $consoleDB, $project) { - $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/webhooks/:webhookId') - ->desc('Get Webhook') - ->label('scope', 'webhooks.read') - ->label('sdk.namespace', 'webhooks') - ->label('sdk.method', 'getWebhook') - ->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.') - ->action( - function ($webhookId) use ($request, $response, $consoleDB, $project) { - $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/webhooks') - ->desc('Create Webhook') - ->label('scope', 'webhooks.write') - ->label('sdk.namespace', 'webhooks') - ->label('sdk.method', 'createWebhook') - ->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 ($name, $events, $url, $security, $httpUser, $httpPass) use ($request, $response, $consoleDB, $project) { - $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/webhooks/:webhookId') - ->desc('Update Webhook') - ->label('scope', 'webhooks.write') - ->label('sdk.namespace', 'webhooks') - ->label('sdk.method', 'updateWebhook') - ->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 ($webhookId, $name, $events, $url, $security, $httpUser, $httpPass) use ($request, $response, $consoleDB, $project) { - $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/webhooks/:webhookId') - ->desc('Delete Webhook') - ->label('scope', 'webhooks.write') - ->label('sdk.namespace', 'webhooks') - ->label('sdk.method', 'deleteWebhook') - ->param('webhookId', null, function () { return new UID(); }, 'Webhook unique ID.') - ->action( - function ($webhookId) use ($response, $consoleDB, $project) { - $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(); - } - ); \ No newline at end of file From f10f03f1d27e1330ad875c193f27bc81c33eba34 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 19 Jan 2020 22:38:00 +0200 Subject: [PATCH 081/237] Fixed prefs input for users service --- app/controllers/api/users.php | 18 ++++++++---------- tests/e2e/Services/Users/UsersBase.php | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 04f660cdb7..2bd916f706 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -6,6 +6,7 @@ use Auth\Auth; use Auth\Validator\Password; use Utopia\Exception; use Utopia\Response; +use Utopia\Validator\Assoc; use Utopia\Validator\WhiteList; use Utopia\Validator\Email; use Utopia\Validator\Text; @@ -130,12 +131,9 @@ $utopia->get('/v1/users/:userId/prefs') $prefs = $user->getAttribute('prefs', ''); - if (empty($prefs)) { - $prefs = '[]'; - } - try { $prefs = json_decode($prefs, true); + $prefs = ($prefs) ? $prefs : []; } catch (\Exception $error) { throw new Exception('Failed to parse prefs', 500); } @@ -387,7 +385,7 @@ $utopia->patch('/v1/users/:userId/prefs') ->label('sdk.method', 'updateUserPrefs') ->label('sdk.description', '/docs/references/users/update-user-prefs.md') ->param('userId', '', function () { return new UID(); }, 'User unique ID.') - ->param('prefs', '', function () { return new \Utopia\Validator\Mock(); }, 'Prefs key-value JSON object string.') + ->param('prefs', '', function () { return new Assoc();}, 'Prefs key-value JSON object.') ->action( function ($userId, $prefs) use ($response, $projectDB, $providers) { $user = $projectDB->getDocument($userId); @@ -396,8 +394,11 @@ $utopia->patch('/v1/users/:userId/prefs') throw new Exception('User not found', 404); } + $old = json_decode($user->getAttribute('prefs', '{}'), true); + $old = ($old) ? $old : []; + $user = $projectDB->updateDocument(array_merge($user->getArrayCopy(), [ - 'prefs' => json_encode(array_merge(json_decode($user->getAttribute('prefs', '{}'), true), $prefs)), + 'prefs' => json_encode(array_merge($old, $prefs)), ])); if (false === $user) { @@ -406,12 +407,9 @@ $utopia->patch('/v1/users/:userId/prefs') $prefs = $user->getAttribute('prefs', ''); - if (empty($prefs)) { - $prefs = '[]'; - } - try { $prefs = json_decode($prefs, true); + $prefs = ($prefs) ? $prefs : []; } catch (\Exception $error) { throw new Exception('Failed to parse prefs', 500); } diff --git a/tests/e2e/Services/Users/UsersBase.php b/tests/e2e/Services/Users/UsersBase.php index fc65b0b510..0b305ac02f 100644 --- a/tests/e2e/Services/Users/UsersBase.php +++ b/tests/e2e/Services/Users/UsersBase.php @@ -146,6 +146,25 @@ trait UsersBase $this->assertEquals($user['body']['key1'], 'value1'); $this->assertEquals($user['body']['key2'], 'value2'); + /** + * Test for FAILURE + */ + $user = $this->client->call(Client::METHOD_PATCH, '/users/' . $data['userId'] . '/prefs', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders()), [ + 'prefs' => 'bad-string', + ]); + + $this->assertEquals($user['headers']['status-code'], 400); + + $user = $this->client->call(Client::METHOD_PATCH, '/users/' . $data['userId'] . '/prefs', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$uid'], + ], $this->getHeaders())); + + $this->assertEquals($user['headers']['status-code'], 400); + return $data; } From a2f84c3beab33d03b04a525e882126fff695022d Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 23 Jan 2020 00:24:55 +0200 Subject: [PATCH 082/237] Updated change log --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index ba69817755..504fa6fbb2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,9 @@ * Added a new Spotify OAuth adapter * Added a new Yahoo OAuth adapter * Added a new Salesforce OAuth adapter +* Added a new Yandex OAuth adapter +* Added a new Paypal OAuth adapter +* Added a new Bitly OAuth adapter * Upgraded MariaDB image to version 1.0.2 * Upgraded SMTP image to version 1.0.1 * File upload route (POST /v1/storage/files) now accept a single file per request From 3733d4d82650876708d93c50bb441c46e07fa0ae Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 23 Jan 2020 00:50:01 +0200 Subject: [PATCH 083/237] Removed title case --- app/controllers/api/account.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index bc00b7cb42..18a4d5325a 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -699,8 +699,8 @@ $utopia->patch('/v1/account/email') ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateEmail') ->label('sdk.description', '/docs/references/account/update-email.md') - ->param('email', '', function () { return new Email(); }, 'Email Address') - ->param('password', '', function () { return new Password(); }, 'User Password') + ->param('email', '', function () { return new Email(); }, 'Email address') + ->param('password', '', function () { return new Password(); }, 'User password') ->action( function ($email, $password) use ($response, $user, $projectDB, $audit, $oauthKeys) { if (!Auth::passwordVerify($password, $user->getAttribute('password'))) { // Double check user password From 3b3c55130f88cba6e186dd31fb46cc0c7929d0cb Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 23 Jan 2020 01:31:48 +0200 Subject: [PATCH 084/237] Updated duplicated membership error --- app/controllers/api/teams.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 5609a3ee49..637fb26494 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -321,7 +321,7 @@ $utopia->post('/v1/teams/:teamId/memberships') foreach ($memberships as $member) { if ($member->getAttribute('userId') == $invitee->getUid()) { - throw new Exception('User has already been invited or is already a member of this team', 400); + throw new Exception('User has already been invited or is already a member of this team', 409); } if ($member->getAttribute('userId') == $user->getUid() && in_array('owner', $member->getAttribute('roles', []))) { From 0c6deb6c0c38c9adbec3c539ed06c45027dbc69c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 23 Jan 2020 01:32:10 +0200 Subject: [PATCH 085/237] Updated docs --- app/controllers/api/account.php | 2 +- docs/references/teams/create-team-membership-resend.md | 1 - docs/references/teams/create-team-membership.md | 2 +- docs/references/teams/delete-team-membership.md | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 docs/references/teams/create-team-membership-resend.md diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 18a4d5325a..6b2812e6f3 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -213,7 +213,7 @@ $utopia->get('/v1/account/logs') ); $utopia->post('/v1/account') - ->desc('Create a new account') + ->desc('Create Account') ->label('webhook', 'account.create') ->label('scope', 'public') ->label('sdk.namespace', 'account') diff --git a/docs/references/teams/create-team-membership-resend.md b/docs/references/teams/create-team-membership-resend.md deleted file mode 100644 index 8ba2a913d3..0000000000 --- a/docs/references/teams/create-team-membership-resend.md +++ /dev/null @@ -1 +0,0 @@ -Use this endpoint to resend your invitation email for a user to join a team. \ No newline at end of file diff --git a/docs/references/teams/create-team-membership.md b/docs/references/teams/create-team-membership.md index a3826109b8..dbe8f168b9 100644 --- a/docs/references/teams/create-team-membership.md +++ b/docs/references/teams/create-team-membership.md @@ -1,5 +1,5 @@ Use this endpoint to invite a new member to your team. An email with a link to join the team will be sent to the new member email address. If member doesn't exists in the project it will be automatically created. -Use the redirect parameter to redirect the user from the invitation email back to your app. When the user is redirected, use the /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the user to the team. +Use the 'url' parameter to redirect the user from the invitation email back to your app. When the user is redirected, use the [Update Team Membership Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join the user to the team. Please note that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/teams/delete-team-membership.md b/docs/references/teams/delete-team-membership.md index e8c97e63ee..e2c884a3e7 100644 --- a/docs/references/teams/delete-team-membership.md +++ b/docs/references/teams/delete-team-membership.md @@ -1 +1 @@ -This endpoint allows a user to leave a team or for a team owner to delete the membership of any other team member. \ No newline at end of file +This endpoint allows a user to leave a team or for a team owner to delete the membership of any other team member. You can also use this endpoint to delete a user membership even if he didn't accept it. \ No newline at end of file From 7d308a55f602c55f5c08f94bb84c709a0d7ee47d Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 23 Jan 2020 08:27:19 +0200 Subject: [PATCH 086/237] Updated docs --- app/controllers/api/users.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 2bd916f706..87c6bd6dbf 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -115,7 +115,7 @@ $utopia->get('/v1/users/:userId') ); $utopia->get('/v1/users/:userId/prefs') - ->desc('Get User Prefs') + ->desc('Get User Preferences') ->label('scope', 'users.read') ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUserPrefs') @@ -379,7 +379,7 @@ $utopia->patch('/v1/users/:userId/status') ); $utopia->patch('/v1/users/:userId/prefs') - ->desc('Update User Prefs') + ->desc('Update User Preferences') ->label('scope', 'users.write') ->label('sdk.namespace', 'users') ->label('sdk.method', 'updateUserPrefs') From e80de1340a44106330c5a44817d7cc961ddf59dd Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 23 Jan 2020 10:32:23 +0200 Subject: [PATCH 087/237] Updated GEO DB --- app/controllers/api/account.php | 4 ++-- app/controllers/api/locale.php | 2 +- app/controllers/api/users.php | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 6b2812e6f3..c49d0df448 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -91,7 +91,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/DBIP/dbip-country-lite-2020-01.mmdb'); $sessions = []; $current = Auth::tokenVerify($tokens, Auth::TOKEN_TYPE_LOGIN, Auth::$secret); $index = 0; @@ -173,7 +173,7 @@ $utopia->get('/v1/account/logs') 'account.sessions.delete', ]); - $reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb'); + $reader = new Reader(__DIR__.'/../db/DBIP/dbip-country-lite-2020-01.mmdb'); $output = []; foreach ($logs as $i => &$log) { diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index b220e32195..162f88b7a7 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -18,7 +18,7 @@ $utopia->get('/v1/locale') function () use ($response, $request, $utopia) { $eu = include __DIR__.'/../../config/eu.php'; $currencies = include __DIR__.'/../../config/currencies.php'; - $reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb'); + $reader = new Reader(__DIR__.'/../db/DBIP/dbip-country-lite-2020-01.mmdb'); $output = []; $ip = $request->getIP(); $time = (60 * 60 * 24 * 45); // 45 days cache diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 87c6bd6dbf..a12147b7d6 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -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/DBIP/dbip-country-lite-2020-01.mmdb'); $sessions = []; $index = 0; $countries = Locale::getText('countries'); @@ -228,7 +228,7 @@ $utopia->get('/v1/users/:userId/logs') $logs = $audit->getLogsByUser($user->getUid()); - $reader = new Reader(__DIR__.'/../../db/GeoLite2/GeoLite2-Country.mmdb'); + $reader = new Reader(__DIR__.'/../db/DBIP/dbip-country-lite-2020-01.mmdb'); $output = []; foreach ($logs as $i => &$log) { From 7a29bf79852b505a0c5630135b50bdd774a7559c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 23 Jan 2020 21:46:03 +0200 Subject: [PATCH 088/237] Fixed GEO IP DB path --- app/controllers/api/account.php | 2 +- app/controllers/api/locale.php | 2 +- app/controllers/api/users.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index c49d0df448..c9a2005c10 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -173,7 +173,7 @@ $utopia->get('/v1/account/logs') 'account.sessions.delete', ]); - $reader = new Reader(__DIR__.'/../db/DBIP/dbip-country-lite-2020-01.mmdb'); + $reader = new Reader(__DIR__.'/../../db/DBIP/dbip-country-lite-2020-01.mmdb'); $output = []; foreach ($logs as $i => &$log) { diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index 162f88b7a7..0c5de69a1c 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -18,7 +18,7 @@ $utopia->get('/v1/locale') function () use ($response, $request, $utopia) { $eu = include __DIR__.'/../../config/eu.php'; $currencies = include __DIR__.'/../../config/currencies.php'; - $reader = new Reader(__DIR__.'/../db/DBIP/dbip-country-lite-2020-01.mmdb'); + $reader = new Reader(__DIR__.'/../../db/DBIP/dbip-country-lite-2020-01.mmdb'); $output = []; $ip = $request->getIP(); $time = (60 * 60 * 24 * 45); // 45 days cache diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index a12147b7d6..00e49eea57 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -158,7 +158,7 @@ $utopia->get('/v1/users/:userId/sessions') } $tokens = $user->getAttribute('tokens', []); - $reader = new Reader(__DIR__.'/../db/DBIP/dbip-country-lite-2020-01.mmdb'); + $reader = new Reader(__DIR__.'/../../db/DBIP/dbip-country-lite-2020-01.mmdb'); $sessions = []; $index = 0; $countries = Locale::getText('countries'); @@ -228,7 +228,7 @@ $utopia->get('/v1/users/:userId/logs') $logs = $audit->getLogsByUser($user->getUid()); - $reader = new Reader(__DIR__.'/../db/DBIP/dbip-country-lite-2020-01.mmdb'); + $reader = new Reader(__DIR__.'/../../db/DBIP/dbip-country-lite-2020-01.mmdb'); $output = []; foreach ($logs as $i => &$log) { From 6803a47491f6268a3f34d1397455579a87d5caef Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 23 Jan 2020 21:56:06 +0200 Subject: [PATCH 089/237] Updated GEO DB path --- app/controllers/api/account.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index c9a2005c10..126549110d 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -91,7 +91,7 @@ $utopia->get('/v1/account/sessions') ->action( function () use ($response, $user) { $tokens = $user->getAttribute('tokens', []); - $reader = new Reader(__DIR__.'/../db/DBIP/dbip-country-lite-2020-01.mmdb'); + $reader = new Reader(__DIR__.'/../../db/DBIP/dbip-country-lite-2020-01.mmdb'); $sessions = []; $current = Auth::tokenVerify($tokens, Auth::TOKEN_TYPE_LOGIN, Auth::$secret); $index = 0; From 4fead6006e0fe0e23164816316dd1463323c03c8 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 24 Jan 2020 00:33:44 +0200 Subject: [PATCH 090/237] Switched routes order --- app/controllers/api/account.php | 82 ++++++++++++++++----------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 126549110d..4804c2f789 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -832,47 +832,6 @@ $utopia->delete('/v1/account') } ); -$utopia->delete('/v1/account/sessions') - ->desc('Delete All Account Sessions') - ->label('scope', 'account') - ->label('webhook', 'account.sessions.delete') - ->label('sdk.namespace', 'account') - ->label('sdk.method', 'deleteAccountSessions') - ->label('sdk.description', '/docs/references/account/delete-sessions.md') - ->label('abuse-limit', 100) - ->action( - function () use ($response, $request, $user, $projectDB, $audit, $webhook) { - $tokens = $user->getAttribute('tokens', []); - - foreach ($tokens as $token) { /* @var $token Document */ - if (!$projectDB->deleteDocument($token->getUid())) { - throw new Exception('Failed to remove token from DB', 500); - } - - $audit - ->setParam('event', 'account.sessions.delete') - ->setParam('resource', '/user/'.$user->getUid()) - ; - - $webhook - ->setParam('payload', [ - 'name' => $user->getAttribute('name', ''), - 'email' => $user->getAttribute('email', ''), - ]) - ; - - if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too - $response - ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) - ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) - ; - } - } - - $response->noContent(); - } - ); - $utopia->delete('/v1/account/sessions/:id') ->desc('Delete Account Session') ->label('scope', 'account') @@ -950,6 +909,47 @@ $utopia->delete('/v1/account/sessions/current') } ); + $utopia->delete('/v1/account/sessions') + ->desc('Delete All Account Sessions') + ->label('scope', 'account') + ->label('webhook', 'account.sessions.delete') + ->label('sdk.namespace', 'account') + ->label('sdk.method', 'deleteAccountSessions') + ->label('sdk.description', '/docs/references/account/delete-sessions.md') + ->label('abuse-limit', 100) + ->action( + function () use ($response, $request, $user, $projectDB, $audit, $webhook) { + $tokens = $user->getAttribute('tokens', []); + + foreach ($tokens as $token) { /* @var $token Document */ + if (!$projectDB->deleteDocument($token->getUid())) { + throw new Exception('Failed to remove token from DB', 500); + } + + $audit + ->setParam('event', 'account.sessions.delete') + ->setParam('resource', '/user/'.$user->getUid()) + ; + + $webhook + ->setParam('payload', [ + 'name' => $user->getAttribute('name', ''), + 'email' => $user->getAttribute('email', ''), + ]) + ; + + if ($token->getAttribute('secret') == Auth::hash(Auth::$secret)) { // If current session delete the cookies too + $response + ->addCookie(Auth::$cookieName.'_legacy', '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, '', time() - 3600, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) + ; + } + } + + $response->noContent(); + } + ); + $utopia->post('/v1/account/recovery') ->desc('Password Recovery') ->label('scope', 'public') From 3ee0d0503e13f0577aee6983f5b176809c6a9f8c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 24 Jan 2020 07:21:51 +0200 Subject: [PATCH 091/237] Updated docs --- README.md | 2 +- docs/references/storage/get-file-preview.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e0b05e6d20..75ed5ac0d6 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ Getting started with Appwrite is as easy as creating a new project, choosing you ### Services -* [**Account**](https://appwrite.io/docs/account) - Manage current user authentication and account. Track and manage the user sessions, devices, sigin methods, and security audit log. +* [**Account**](https://appwrite.io/docs/account) - Manage current user authentication and account. Track and manage the user sessions, devices, sigin methods, and security logs. * [**Users**](https://appwrite.io/docs/users) - Manage and list all project users when in admin mode. * [**Teams**](https://appwrite.io/docs/teams) - Manage and group users in teams. Manage memberships, invites and user roles within a team. * [**Database**](https://appwrite.io/docs/database) - Manage database collections and documents. Read, create, update and delete documents and filter lists of documents collections using an advanced filter with graph-like capabilities. diff --git a/docs/references/storage/get-file-preview.md b/docs/references/storage/get-file-preview.md index fd818d92cf..a6f4a6186d 100644 --- a/docs/references/storage/get-file-preview.md +++ b/docs/references/storage/get-file-preview.md @@ -1 +1 @@ -Get file preview image. Currently, this method supports preview for image files (jpg, png, and gif), other supported formats, like pdf, docs, slides, and spreadsheets will return file icon image. You can also pass query string arguments for cutting and resizing your preview image. \ No newline at end of file +Get a file preview image. Currently, this method supports preview for image files (jpg, png, and gif), other supported formats, like pdf, docs, slides, and spreadsheets, will return the file icon image. You can also pass query string arguments for cutting and resizing your preview image. \ No newline at end of file From 934d09377599c84bf4fd4381cdcfed1b7301867c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 24 Jan 2020 22:33:10 +0200 Subject: [PATCH 092/237] Updated docs --- docs/references/account/create-session.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references/account/create-session.md b/docs/references/account/create-session.md index e3e221ad7d..d41f1d858c 100644 --- a/docs/references/account/create-session.md +++ b/docs/references/account/create-session.md @@ -1,4 +1,4 @@ -Allow the user to login into his account by providing a valid email and password combination. Use the success and failure arguments to provide a redirect URL\'s back to your app when login is completed. +Allow the user to login into his account by providing a valid email and password combination. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. From 4848b0925265e0c5ec622179b3fb6a1c85841168 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Fri, 24 Jan 2020 23:38:07 +0200 Subject: [PATCH 093/237] Updated docs --- docs/services/locale.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/services/locale.md b/docs/services/locale.md index 1ee3b66969..4874f47fea 100644 --- a/docs/services/locale.md +++ b/docs/services/locale.md @@ -2,4 +2,4 @@ The locale service allows you to customize your app based on your users' locatio The user service supports multiple locales. This feature allows you to fetch countries and continents information in your app language. To switch locales, all you need to do is pass the 'X-Appwrite-Locale' header or set the 'setLocale' method using any of our available SDKs. [View here the list of available locales](https://github.com/appwrite/appwrite/blob/master/app/config/locales.php). -IP Geolocation by DB-IP \ No newline at end of file +[IP Geolocation by DB-IP](https://db-ip.com) \ No newline at end of file From 879827d000c24961904e4a9fbdefafb18ac09c32 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 26 Jan 2020 07:13:01 +0200 Subject: [PATCH 094/237] Added platforms env var --- app/controllers/web/home.php | 3 ++- app/views/layouts/default.phtml | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/controllers/web/home.php b/app/controllers/web/home.php index 45e564b80f..65db66db1b 100644 --- a/app/controllers/web/home.php +++ b/app/controllers/web/home.php @@ -2,7 +2,7 @@ include_once __DIR__ . '/../shared/web.php'; -global $utopia, $response, $request, $layout, $version, $providers, $sdks; +global $utopia, $response, $request, $layout, $version, $providers, $sdks, $platforms; use Utopia\View; @@ -17,6 +17,7 @@ $layout ->setParam('title', APP_NAME) ->setParam('description', '') ->setParam('class', 'home') + ->setParam('platforms', $platforms) ->setParam('header', [$header]) ->setParam('footer', [$footer]) ; diff --git a/app/views/layouts/default.phtml b/app/views/layouts/default.phtml index dbfa838a00..4a326ef50d 100644 --- a/app/views/layouts/default.phtml +++ b/app/views/layouts/default.phtml @@ -6,6 +6,7 @@ $protocol = $this->getParam('protocol', ''); $domain = $this->getParam('domain', ''); $api = $this->getParam('api', ''); $project = $this->getParam('project', 'console'); +$platforms = $this->getParam('platforms', []); $version = $this->getParam('version', '0.0.0'); $isDev = $this->getParam('isDev', false); $litespeed = $this->getParam('litespeed', true); @@ -60,6 +61,7 @@ $canonical = $this->getParam('canonical', ''); HOME: 'escape($this->getParam('home')); ?>', API: '/v1', PROJECT: '', + PLATFORMS: '', LOCALE: 'escape(Locale::getText('settings.locale')); ?>', PREFIX: 'escape($this->getParam('prefix')); ?>', ROLES: getParam('roles', [])); ?>, From 35a246074a06f223232e1956e814483cb65efb1b Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 26 Jan 2020 18:55:50 +0200 Subject: [PATCH 095/237] Updated changelog --- CHANGES.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 504fa6fbb2..5c1ccece70 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,7 +9,6 @@ * Added new webhooks events * Normailized all webhooks event names * Added support for SameSite cookie option with fallback cookie for old clients -* Merged Auth and Account service for making the API more REST compatible * Added a new Discord OAuth adapter * Added a new Twitch OAuth adapter * Added a new Spotify OAuth adapter @@ -31,6 +30,10 @@ * Fixed OAuth login error saying project UID is missing when its not * Fixed wrong input validation for user preferences +## Breaking Changes + +* Merged Auth and Account service route to make the API REST compatible + # Version 0.4.0 (PRE-RELEASE) ## Features From 2c8b3803512d8221c3622350aef6e12d75026985 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 27 Jan 2020 08:13:41 +0200 Subject: [PATCH 096/237] Updated icons --- public/dist/styles/default-ltr.css | 2 +- public/dist/styles/default-rtl.css | 2 +- public/styles/fontello/config.json | 238 +---------------------------- public/styles/icons.less | 7 +- 4 files changed, 13 insertions(+), 236 deletions(-) diff --git a/public/dist/styles/default-ltr.css b/public/dist/styles/default-ltr.css index 3256ddcc36..2dd37bf9fb 100644 --- a/public/dist/styles/default-ltr.css +++ b/public/dist/styles/default-ltr.css @@ -1 +1 @@ -.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-end-negative{margin-right:-30px!important}.margin-start-negative{margin-left:-30px!important}.margin-end-negative-small{margin-right:-15px!important}.margin-start-negative-small{margin-left:-15px!important}.margin-end-negative-tiny{margin-right:-5px!important}.margin-start-negative-tiny{margin-left:-5px!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1000px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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AVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrCGxpbmstZXh0DmdpdGh1Yi1jaXJjbGVkBmZpbHRlcgRkb2NzC2xpc3QtYnVsbGV0DWxpc3QtbnVtYmVyZWQJdW5kZXJsaW5lBHNvcnQIbGlua2VkaW4Fc21pbGUIa2V5Ym9hcmQEY29kZQZzaGllbGQSYW5nbGUtY2lyY2xlZC1sZWZ0E2FuZ2xlLWNpcmNsZWQtcmlnaHQJYml0YnVja2V0B3dpbmRvd3MKd2hlZWxjaGFpcgRiYW5rBmdvb2dsZQ9idWlsZGluZy1maWxsZWQIZGF0YWJhc2UIbGlmZWJ1b3kGaGVhZGVyCmJpbm9jdWxhcnMKY2hhcnQtYXJlYQlwaW50ZXJlc3QGbWVkaXVtBmdpdGxhYgh0ZWxlZ3JhbQAAAAAAAQAB//8ADwAAAAAAAAAAAAAAAAAAAAAAGAAYABgAGAOB/zoDgf86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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-angle-circled-left:before{content:'\f137'}.icon-angle-circled-right:before{content:'\f138'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#ff729b;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#ff729b;border-color:#ff729b}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:auto;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang-label);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file +.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-end-negative{margin-right:-30px!important}.margin-start-negative{margin-left:-30px!important}.margin-end-negative-small{margin-right:-15px!important}.margin-start-negative-small{margin-left:-15px!important}.margin-end-negative-tiny{margin-right:-5px!important}.margin-start-negative-tiny{margin-left:-5px!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1000px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxNwAA8TcAAABWAADxOAAA8TgAAABXAADxcQAA8XEAAABYAADxegAA8XoAAABZAADxkwAA8ZMAAABaAADxnAAA8ZwAAABbAADxoAAA8aAAAABcAADxrQAA8a0AAABdAADxwAAA8cAAAABeAADxzQAA8c0AAABfAADx3AAA8dwAAABgAADx5QAA8eUAAABhAADx/gAA8f4AAABiAADyMQAA8jEAAABjAADyOgAA8joAAABkAADylgAA8pYAAABlAADyxgAA8sYAAABmAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMl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MgAwACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAAR1c2VyBmZvbGRlcgRsaXN0BWxvZ2luA2NvZwd0d2l0dGVyC2FydGljbGUtYWx0BmNhbmNlbARob21lCGRvd24tZGlyCGZhY2Vib29rCGFzdGVyaXNrBnVwbG9hZAlzdG9wd2F0Y2gGZXhwb3J0BWhlYXJ0BHBsdXMGdXAtZGlyBG1lbnUJbGVmdC1vcGVuCnJpZ2h0LW9wZW4FaW5ib3gGd3JlbmNoB2NvbW1lbnQNc3RhY2tvdmVyZmxvdwhxdWVzdGlvbgpvay1jaXJjbGVkB3dhcm5pbmcEbWFpbARsaW5rB2tleS1pbnYFdHJhc2gIZG93bmxvYWQHZ2xhc3NlcwZxcmNvZGUHc2h1ZmZsZQNleWUEbG9jawZzZWFyY2gEYmVsbAV1c2Vycwhsb2NhdGlvbglicmllZmNhc2UJaW5zdGFncmFtBWNsb2NrBXBob25lCGNhbGVuZGFyBXByaW50BGVkaXQEYm9sZAZpdGFsaWMGcm9ja2V0CHdoYXRzYXBwBWRvdC0zDGluZm8tY2lyY2xlZAh2aWRlb2NhbQtxdW90ZS1yaWdodAdwaWN0dXJlB3BhbGV0dGUEbGFtcAlib29rLW9wZW4Cb2sIY2hhdC1hbHQHYXJjaGl2ZQRwbGF5BXBhdXNlCWRvd24tb3Blbgd1cC1vcGVuBW1pbnVzCGV4Y2hhbmdlB25ldHdvcmsMaWNvbi1kaXNjb3JkCGxpbmstZXh0DmdpdGh1Yi1jaXJjbGVkBmZpbHRlcgRkb2NzC2xpc3QtYnVsbGV0DWxpc3QtbnVtYmVyZWQJdW5kZXJsaW5lBHNvcnQIbGlua2VkaW4Fc21pbGUIa2V5Ym9hcmQEY29kZQZzaGllbGQSYW5nbGUtY2lyY2xlZC1sZWZ0E2FuZ2xlLWNpcmNsZWQtcmlnaHQJYml0YnVja2V0B3dpbmRvd3MKd2hlZWxjaGFpcgRiYW5rBmdvb2dsZQ9idWlsZGluZy1maWxsZWQIZGF0YWJhc2UIbGlmZWJ1b3kGaGVhZGVyCmJpbm9jdWxhcnMKY2hhcnQtYXJlYQlwaW50ZXJlc3QGbWVkaXVtBmdpdGxhYgh0ZWxlZ3JhbQAAAAAAAAEAAf//AA8AAAAAAAAAAAAAAAAAAAAAABgAGAAYABgDgf86A4H/OrAALCCwAFVYRVkgIEu4AA5RS7AGU1pYsDQbsChZYGYgilVYsAIlYbkIAAgAY2MjYhshIbAAWbAAQyNEsgABAENgQi2wASywIGBmLbACLCBkILDAULAEJlqyKAEKQ0VjRVJbWCEjIRuKWCCwUFBYIbBAWRsgsDhQWCGwOFlZILEBCkNFY0VhZLAoUFghsQEKQ0VjRSCwMFBYIbAwWRsgsMBQWCBmIIqKYSCwClBYYBsgsCBQWCGwCmAbILA2UFghsDZgG2BZWVkbsAErWVkjsABQWGVZWS2wAywgRSCwBCVhZCCwBUNQWLAFI0KwBiNCGyEhWbABYC2wBCwjISMhIGSxBWJCILAGI0KxAQpDRWOxAQpDsAFgRWOwAyohILAGQyCKIIqwASuxMAUlsAQmUVhgUBthUllYI1khILBAU1iwASsbIbBAWSOwAFBYZVktsAUssAdDK7IAAgBDYEItsAYssAcjQiMgsAAjQmGwAmJmsAFjsAFgsAUqLbAH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RyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-angle-circled-left:before{content:'\f137'}.icon-angle-circled-right:before{content:'\f138'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#ff729b;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#ff729b;border-color:#ff729b}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:auto;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang-label);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file diff --git a/public/dist/styles/default-rtl.css b/public/dist/styles/default-rtl.css index b457767a1c..aac3c609a7 100644 --- a/public/dist/styles/default-rtl.css +++ b/public/dist/styles/default-rtl.css @@ -1 +1 @@ -.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-end-negative{margin-left:-30px!important}.margin-start-negative{margin-right:-30px!important}.margin-end-negative-small{margin-left:-15px!important}.margin-start-negative-small{margin-right:-15px!important}.margin-end-negative-tiny{margin-left:-5px!important}.margin-start-negative-tiny{margin-right:-5px!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1000px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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AVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrCGxpbmstZXh0DmdpdGh1Yi1jaXJjbGVkBmZpbHRlcgRkb2NzC2xpc3QtYnVsbGV0DWxpc3QtbnVtYmVyZWQJdW5kZXJsaW5lBHNvcnQIbGlua2VkaW4Fc21pbGUIa2V5Ym9hcmQEY29kZQZzaGllbGQSYW5nbGUtY2lyY2xlZC1sZWZ0E2FuZ2xlLWNpcmNsZWQtcmlnaHQJYml0YnVja2V0B3dpbmRvd3MKd2hlZWxjaGFpcgRiYW5rBmdvb2dsZQ9idWlsZGluZy1maWxsZWQIZGF0YWJhc2UIbGlmZWJ1b3kGaGVhZGVyCmJpbm9jdWxhcnMKY2hhcnQtYXJlYQlwaW50ZXJlc3QGbWVkaXVtBmdpdGxhYgh0ZWxlZ3JhbQAAAAAAAQAB//8ADwAAAAAAAAAAAAAAAAAAAAAAGAAYABgAGAOB/zoDgf86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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-angle-circled-left:before{content:'\f137'}.icon-angle-circled-right:before{content:'\f138'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#ff729b;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#ff729b;border-color:#ff729b}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:auto;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang-label);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file +.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-end-negative{margin-left:-30px!important}.margin-start-negative{margin-right:-30px!important}.margin-end-negative-small{margin-left:-15px!important}.margin-start-negative-small{margin-right:-15px!important}.margin-end-negative-tiny{margin-left:-5px!important}.margin-start-negative-tiny{margin-right:-5px!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1000px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxNwAA8TcAAABWAADxOAAA8TgAAABXAADxcQAA8XEAAABYAADxegAA8XoAAABZAADxkwAA8ZMAAABaAADxnAAA8ZwAAABbAADxoAAA8aAAAABcAADxrQAA8a0AAABdAADxwAAA8cAAAABeAADxzQAA8c0AAABfAADx3AAA8dwAAABgAADx5QAA8eUAAABhAADx/gAA8f4AAABiAADyMQAA8jEAAABjAADyOgAA8joAAABkAADylgAA8pYAAABlAADyxgAA8sYAAABmAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMl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MgAwACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAAR1c2VyBmZvbGRlcgRsaXN0BWxvZ2luA2NvZwd0d2l0dGVyC2FydGljbGUtYWx0BmNhbmNlbARob21lCGRvd24tZGlyCGZhY2Vib29rCGFzdGVyaXNrBnVwbG9hZAlzdG9wd2F0Y2gGZXhwb3J0BWhlYXJ0BHBsdXMGdXAtZGlyBG1lbnUJbGVmdC1vcGVuCnJpZ2h0LW9wZW4FaW5ib3gGd3JlbmNoB2NvbW1lbnQNc3RhY2tvdmVyZmxvdwhxdWVzdGlvbgpvay1jaXJjbGVkB3dhcm5pbmcEbWFpbARsaW5rB2tleS1pbnYFdHJhc2gIZG93bmxvYWQHZ2xhc3NlcwZxcmNvZGUHc2h1ZmZsZQNleWUEbG9jawZzZWFyY2gEYmVsbAV1c2Vycwhsb2NhdGlvbglicmllZmNhc2UJaW5zdGFncmFtBWNsb2NrBXBob25lCGNhbGVuZGFyBXByaW50BGVkaXQEYm9sZAZpdGFsaWMGcm9ja2V0CHdoYXRzYXBwBWRvdC0zDGluZm8tY2lyY2xlZAh2aWRlb2NhbQtxdW90ZS1yaWdodAdwaWN0dXJlB3BhbGV0dGUEbGFtcAlib29rLW9wZW4Cb2sIY2hhdC1hbHQHYXJjaGl2ZQRwbGF5BXBhdXNlCWRvd24tb3Blbgd1cC1vcGVuBW1pbnVzCGV4Y2hhbmdlB25ldHdvcmsMaWNvbi1kaXNjb3JkCGxpbmstZXh0DmdpdGh1Yi1jaXJjbGVkBmZpbHRlcgRkb2NzC2xpc3QtYnVsbGV0DWxpc3QtbnVtYmVyZWQJdW5kZXJsaW5lBHNvcnQIbGlua2VkaW4Fc21pbGUIa2V5Ym9hcmQEY29kZQZzaGllbGQSYW5nbGUtY2lyY2xlZC1sZWZ0E2FuZ2xlLWNpcmNsZWQtcmlnaHQJYml0YnVja2V0B3dpbmRvd3MKd2hlZWxjaGFpcgRiYW5rBmdvb2dsZQ9idWlsZGluZy1maWxsZWQIZGF0YWJhc2UIbGlmZWJ1b3kGaGVhZGVyCmJpbm9jdWxhcnMKY2hhcnQtYXJlYQlwaW50ZXJlc3QGbWVkaXVtBmdpdGxhYgh0ZWxlZ3JhbQAAAAAAAAEAAf//AA8AAAAAAAAAAAAAAAAAAAAAABgAGAAYABgDgf86A4H/OrAALCCwAFVYRVkgIEu4AA5RS7AGU1pYsDQbsChZYGYgilVYsAIlYbkIAAgAY2MjYhshIbAAWbAAQyNEsgABAENgQi2wASywIGBmLbACLCBkILDAULAEJlqyKAEKQ0VjRVJbWCEjIRuKWCCwUFBYIbBAWRsgsDhQWCGwOFlZILEBCkNFY0VhZLAoUFghsQEKQ0VjRSCwMFBYIbAwWRsgsMBQWCBmIIqKYSCwClBYYBsgsCBQWCGwCmAbILA2UFghsDZgG2BZWVkbsAErWVkjsABQWGVZWS2wAywgRSCwBCVhZCCwBUNQWLAFI0KwBiNCGyEhWbABYC2wBCwjISMhIGSxBWJCILAGI0KxAQpDRWOxAQpDsAFgRWOwAyohILAGQyCKIIqwASuxMAUlsAQmUVhgUBthUllYI1khILBAU1iwASsbIbBAWSOwAFBYZVktsAUssAdDK7IAAgBDYEItsAYssAcjQiMgsAAjQmGwAmJmsAFjsAFgsAUqLbAH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RyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-angle-circled-left:before{content:'\f137'}.icon-angle-circled-right:before{content:'\f138'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#ff729b;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#ff729b;border-color:#ff729b}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:auto;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang-label);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file diff --git a/public/styles/fontello/config.json b/public/styles/fontello/config.json index f306dcc052..5eb26b647b 100644 --- a/public/styles/fontello/config.json +++ b/public/styles/fontello/config.json @@ -613,241 +613,17 @@ "src": "fontawesome" }, { - "uid": "f5896a5c224ad6c2a1fb92456bb8a211", - "css": "c", - "code": 59461, + "uid": "00d86f3e46c3c3d768e7246eb0eadd7f", + "css": "icon-discord", + "code": 59463, "src": "custom_icons", - "selected": false, + "selected": true, "svg": { - "path": "M901.6 239.8L524.2 22.7C518 18.7 509.4 17.2 500 17.2 490.6 17.2 482 19.5 475.8 22.7L100.8 240.6C87.5 248.4 78.1 268 78.1 282.8V718C78.1 726.6 79.7 736.7 85.9 745.3L920.3 260.9C915.6 251.6 908.6 244.5 901.6 239.8ZM83.6 744.5C87.5 750.8 93 756.3 98.4 759.4L475 977.3C481.3 981.3 489.8 982.8 499.2 982.8 508.6 982.8 517.2 980.5 523.4 977.3L898.4 759.4C911.7 751.6 921.1 732 921.1 717.2V282C921.1 275 920.3 267.2 916.4 260.2L83.6 744.5ZM666.4 594.5C633.6 652.3 571.1 691.4 500 691.4 394.5 691.4 308.6 605.5 308.6 500S394.5 308.6 500 308.6C571.1 308.6 633.6 347.7 666.4 406.3L768 347.7C714.8 254.7 614.8 191.4 500 191.4 329.7 191.4 191.4 329.7 191.4 500S329.7 808.6 500 808.6C614.1 808.6 714.1 746.1 767.2 653.9L666.4 594.5Z", - "width": 1000 + "path": "M435 432.9C411.3 432.9 392.5 453.8 392.5 479.2S411.7 525.4 435 525.4C458.8 525.4 477.5 504.6 477.5 479.2 477.9 453.8 458.8 432.9 435 432.9ZM587.1 432.9C563.3 432.9 544.6 453.8 544.6 479.2S563.8 525.4 587.1 525.4C610.8 525.4 629.6 504.6 629.6 479.2S610.8 432.9 587.1 432.9ZM789.6 83.3H231.3C184.2 83.3 145.8 121.7 145.8 169.2V732.5C145.8 780 184.2 818.3 231.3 818.3H703.8L681.7 741.3 735 790.8 785.4 837.5 875 916.7V169.2C875 121.7 836.7 83.3 789.6 83.3ZM628.8 627.5S613.8 609.6 601.3 593.8C655.8 578.3 676.7 544.2 676.7 544.2 659.6 555.4 643.3 563.3 628.8 568.8 607.9 577.5 587.9 583.3 568.3 586.7 528.3 594.2 491.7 592.1 460.4 586.3 436.7 581.7 416.3 575 399.2 568.3 389.6 564.6 379.2 560 368.8 554.2 367.5 553.3 366.3 552.9 365 552.1 364.2 551.7 363.8 551.3 363.3 550.8 355.8 546.7 351.7 543.8 351.7 543.8S371.7 577.1 424.6 592.9C412.1 608.8 396.7 627.5 396.7 627.5 304.6 624.6 269.6 564.2 269.6 564.2 269.6 430 329.6 321.3 329.6 321.3 389.6 276.3 446.7 277.5 446.7 277.5L450.8 282.5C375.8 304.2 341.3 337.1 341.3 337.1S350.4 332.1 365.8 325C410.4 305.4 445.8 300 460.4 298.8 462.9 298.3 465 297.9 467.5 297.9 492.9 294.6 521.7 293.8 551.7 297.1 591.3 301.7 633.8 313.3 677.1 337.1 677.1 337.1 644.2 305.8 573.3 284.2L579.2 277.5S636.3 276.3 696.3 321.3C696.3 321.3 756.3 430 756.3 564.2 756.3 564.2 720.8 624.6 628.8 627.5Z", + "width": 1021 }, "search": [ - "c" - ] - }, - { - "uid": "ea1f7c6eac18e3327c42e44fcb6961cb", - "css": "dotnet", - "code": 59393, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M353.8 387.2C388.3 492.7 401.4 680.9 502.3 680.9 510 680.9 517.7 680.2 525.5 678.7 433.8 657.3 422.9 471.1 367 374.7 362.6 378.7 358.2 382.9 353.8 387.2M367 374.7C422.9 471.1 433.8 657.3 525.5 678.7 532.7 677.4 540 675.4 547.2 672.9 464.9 632.5 442.1 451.7 378.5 364.7 374.7 367.9 370.8 371.2 367 374.7M447.6 317.4C440 317.4 432.2 318.1 424.4 319.6 403.9 323.5 383.2 332.2 362.3 345.5 368 351.2 373.4 357.6 378.5 364.7 399.8 347 420.9 334 442 326.1 449.9 323.2 457.8 321 465.6 319.6 460 318.1 454 317.4 447.6 317.4M611.5 635.7C619.9 629 628.3 621.6 636.8 613.5 601.7 508.5 589.2 317.5 487.6 317.5 480.3 317.5 473 318.2 465.6 319.6 558.2 342.6 570.1 543.9 611.5 635.7M465.7 319.6C460 318.1 454 317.4 447.6 317.4L487.6 317.5C480.3 317.5 473 318.2 465.7 319.6M609.7 658C605.7 654.2 601.9 650 598.2 645.6 581.1 657.7 564.1 666.9 547.2 672.9 553.2 675.8 559.5 678 566.2 679.3 571.4 680.4 576.8 680.9 582.4 680.9 601.4 680.9 616.4 678.7 629.2 672.6 622.2 668.8 615.7 663.8 609.7 658M442 326.2C524.9 369.5 532.1 565.9 598.2 645.6 602.7 642.5 607.1 639.2 611.4 635.7 570 543.9 558.2 342.6 465.7 319.6 457.8 321 449.9 323.2 442 326.2M378.5 364.7C442.1 451.7 464.9 632.5 547.2 672.9 564.1 666.9 581.1 657.7 598.2 645.6 532.1 565.9 524.9 369.5 442 326.2 420.9 334 399.8 347 378.5 364.7M313.1 384.6C303.2 407.2 293 436.8 280.7 475.4 305.2 441 329.6 411.3 353.8 387.2 350.5 376.9 346.9 367.4 343 359 333.1 366.6 323.1 375.1 313.1 384.6M351.9 352.5C348.9 354.6 346 356.7 343 359 346.9 367.4 350.5 376.9 353.8 387.2 358.2 382.9 362.6 378.7 367 374.7 362.3 366.6 357.3 359.2 351.9 352.5M362.3 345.5C358.8 347.7 355.4 350.1 351.8 352.5 357.3 359.2 362.3 366.6 367 374.7 370.8 371.2 374.7 367.9 378.5 364.7 373.4 357.6 368 351.2 362.3 345.5M927.7 309.3C880.9 490.1 782.9 635.4 700.8 672H700.7L696.2 673.9 695.7 674.1 694.4 674.6 693.9 674.8 691.8 675.5 691 675.8 690 676.2 689 676.5 688.1 676.8 686.4 677.3 685.6 677.5 684.4 677.9 683.6 678.1 682.3 678.4 680.8 678.8C684.5 680.1 688.3 680.8 692.5 680.8 770.4 680.8 848.9 541.3 978.7 309.3H927.7L927.7 309.3ZM263.8 324.7L263.9 324.6 264.1 324.5H264.2L265.5 324 265.7 323.9 266.1 323.7 267.4 323.2H267.5L270.5 322.2 270.9 322.1 272.2 321.7 272.8 321.5 274.1 321.1 274.6 321 278.9 319.9 279.4 319.8 280.7 319.5 281.3 319.3 282.6 319.1H282.9L285.5 318.6H286L287.2 318.4 287.9 318.3 289 318.1 289.6 318 292.4 317.7C289.7 317.5 287 317.3 284.1 317.3 196.5 317.3 75.7 480 21.3 690.6H31.8C49.2 659.6 64.8 630.2 79.1 602.6 117.2 453.4 194.8 351.6 263.8 324.7M313.1 384.6C323.1 375.1 333.1 366.6 343 359 340.8 354.1 338.4 349.5 335.9 345.3 327.9 355 320.6 367.8 313.1 384.6M320.4 325.9C326.1 330.7 331.2 337.3 335.9 345.3 337.4 343.4 338.9 341.8 340.4 340.2 333.9 334.1 326.9 329.1 319.2 325.4L320.2 325.8 320.4 325.9M79.1 602.6C159.1 448.6 196.9 351.1 263.8 324.7 194.9 351.7 117.2 453.4 79.1 602.6M340.4 340.2C338.9 341.8 337.4 343.4 335.9 345.3 338.4 349.5 340.7 354 343 359 346 356.7 348.9 354.6 351.8 352.5 348.2 348 344.4 343.9 340.4 340.2M115.4 690L114 690.1H113.7L112.5 690.3H112.3L109.3 690.5H109C189.9 688.2 226.9 647.7 245.3 588.9 259.2 544.4 270.7 506.8 280.7 475.4 246.8 523.1 212.8 579.9 178.5 643.6 162 674.3 136.9 687.2 115.4 689.9M115.4 689.9C136.9 687.2 162 674.4 178.5 643.7 212.8 580 246.8 523.1 280.7 475.4 293 436.7 303.2 407.1 313.1 384.6 245.6 448.8 177.9 555.7 115.4 689.9M79.1 602.6C64.8 630.2 49.2 659.6 31.8 690.7H62.3C66.3 659.8 72 630.4 79.1 602.7M289.6 318L289 318.2 287.8 318.3 287.2 318.4 286 318.7 285.5 318.8 282.9 319.2H282.6L281.3 319.5 280.7 319.7 279.4 319.9 278.9 320 274.6 321.1 274.1 321.3 272.8 321.7 272.2 321.8 270.9 322.2 270.4 322.3 267.5 323.4 266.1 323.9 265.6 324.1 264.3 324.6 263.9 324.8C197 351.1 159.1 448.6 79.2 602.7 72.1 630.5 66.3 659.9 62.3 690.7H66.6L95.9 690.6H109.4L112.3 690.4H112.5L113.8 690.3H114L115.5 690.1C178 555.9 245.7 449 313.2 384.8 320.7 368 328 355.1 336 345.4 331.3 337.5 326.2 330.9 320.4 326.1L320.3 326 319.3 325.5 318.4 325 317.5 324.6 316.4 324.1 315.5 323.8 313.8 323 313 322.7 311.7 322.2 311 322 309.1 321.3H309L306.9 320.7 306.4 320.6 304.6 320.1 304.2 320C302.7 319.6 301.3 319.3 299.7 319L299.3 318.9 297.4 318.5 297 318.4 294.7 318.1H294.3L292.5 317.9 289.7 318.2M744.6 409.4C729.2 458.7 716.8 499.4 705.9 532.8 748.1 474.7 789.7 401.6 829.3 317.3 783.1 331.8 758.5 365 744.6 409.4M707.3 668.9C705.1 670 703 671 700.8 672 782.9 635.4 880.9 490.1 927.7 309.3H918.2C810.5 501.8 775.9 630.6 707.3 668.9M653.7 652.8C671.5 630.9 686.1 593.9 705.9 532.8 683 564.3 660 591.3 636.9 613.4L636.8 613.6C641.8 628.7 647.3 642 653.6 652.7M653.7 652.8C647.6 660.2 641.1 665.8 634 670 632.4 670.9 630.8 671.8 629.2 672.6 636.8 676.6 645 679.4 654.3 680.5L658.4 680.8H658.6L660.6 680.9H667.2L668 680.8 669.5 680.7H670.2L671.8 680.5H671.9L672.4 680.4 674.1 680.1H674.6L676.6 679.8H676.9L680.7 679C670.1 675.1 661.2 666 653.6 653M502.3 680.9C510 680.9 517.7 680.2 525.5 678.7 532.8 677.4 540 675.4 547.2 672.9 553.2 675.8 559.5 678 566.2 679.4 571.4 680.4 576.8 681 582.4 681H502.3ZM582.4 680.9C601.4 680.9 616.5 678.7 629.2 672.6 636.8 676.6 645 679.4 654.3 680.5L658.4 680.8H658.6L660.6 680.9H662.9 582.4ZM662.9 680.9H667.3L668.1 680.8 669.6 680.7H670.3L671.9 680.5H672L672.5 680.4 674.2 680.1 674.7 680 676.6 679.7H677L680.8 678.9C684.5 680.3 688.4 681 692.5 681L662.9 681.1 662.9 680.9ZM636.8 613.6V613.5C628.4 621.6 619.9 629 611.5 635.7 607.1 639.1 602.7 642.5 598.3 645.6 602 650 605.8 654.2 609.7 658 615.8 663.8 622.2 668.8 629.3 672.6 630.9 671.8 632.5 670.9 634 670 641.2 665.8 647.6 660.2 653.7 652.7 647.4 642 641.9 628.7 636.8 613.6M888.2 309.3H840.3L832.8 309.7 829.2 317.2C789.6 401.6 748.1 474.6 705.9 532.7 686 593.8 671.5 630.9 653.6 652.7 661.2 665.7 670.1 674.8 680.7 678.7L681.5 678.5H681.7L682.3 678.4 683.6 678.1 684.4 677.9 685.6 677.6 686.3 677.4 688.1 676.8 688.9 676.5 689.9 676.2 690.9 675.8 691.8 675.5 693.8 674.8 694.4 674.6 695.7 674.1 696.2 673.9 700.6 672H700.8C702.9 671.1 705.1 670 707.2 668.9 775.8 630.6 810.5 501.8 918.2 309.4H888.1L888.2 309.3ZM292.4 317.8L292.9 317.9 294.2 318H294.6L296.9 318.3 297.3 318.5 299.2 318.8 299.7 318.9 304.1 319.9 304.5 320 306.3 320.5 306.8 320.7 308.9 321.3 309.1 321.4 310.9 322 311.6 322.2 313 322.8 313.7 323.1 315.5 323.8 316.3 324.2 317.4 324.6 318.3 325.1 319.3 325.5C326.9 329.3 333.9 334.3 340.5 340.4 342.9 337.9 345.4 335.6 348 333.5 333.7 323.4 317.6 317.7 299 317.7 296.8 317.7 294.7 317.8 292.5 318M340.4 340.2C344.4 343.9 348.2 348 351.8 352.5 355.3 350.1 358.8 347.7 362.3 345.5 357.7 341 352.9 336.9 347.9 333.4 345.3 335.4 342.8 337.7 340.4 340.2M290.4 318.3L296.9 318C315.5 318 331.6 323.8 345.9 333.9 360.9 322 379.1 317.9 404.3 317.9H282.1L290.4 318.3M404.3 317.9C379.1 317.9 360.9 322 345.9 333.9 350.8 337.4 355.6 341.5 360.2 346.1 381.2 332.8 401.9 323.9 422.3 320.1 430.1 318.7 437.9 317.9 445.5 317.9H404.3V317.9ZM705.9 532.8C716.8 499.4 729.2 458.7 744.6 409.4 758.5 365 783.1 331.8 829.3 317.3L832.8 309.8C757.6 314.3 722.4 352.6 704.7 409.3 673.7 508.3 655 572.5 636.9 613.4 660 591.3 683 564.3 705.9 532.8", - "width": 1000 - }, - "search": [ - "dotnet" - ] - }, - { - "uid": "b3a2c5b3fcb9a8d31a5c97e5e2e2bcc0", - "css": "erlang", - "code": 59394, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M161.7 811.7C85.9 730.5 40.6 618.8 41.4 485.2 40.6 367.2 78.1 265.6 142.2 188.3H7.8V810.9L161.7 811.7ZM868 811.7C900.8 776.6 930.5 735.2 957 687.5L808.6 613.3C756.3 697.7 680.5 775.8 575 776.6 421.9 775.8 361.7 644.5 361.7 475.8H934.4C935.2 457 935.2 447.7 934.4 439.1 938.3 338.3 911.7 253.9 863.3 188.3H992.2V810.9L868 811.7ZM371.1 331.3C377.3 254.7 437.5 203.9 508.6 203.1 579.7 203.1 631.3 254.7 632.8 331.3H371.1Z", - "width": 1000 - }, - "search": [ - "erlang" - ] - }, - { - "uid": "c79e2d1b0b5430fa4d1b7b947a3b69c9", - "css": "java", - "code": 59395, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M372 766.6S334.8 788.2 398.5 795.5C475.8 804.4 515.3 803.1 600.5 787 600.5 787 622.9 801 654.2 813.2 463.2 895 222.1 808.5 372 766.6ZM348.7 659.8S306.9 690.7 370.7 697.3C453.3 705.9 518.5 706.6 631.3 684.8 631.3 684.8 646.9 700.7 671.4 709.3 440.6 776.8 183.5 714.6 348.7 659.8ZM545.3 478.7C592.4 532.9 533 581.6 533 581.6S652.4 519.9 597.6 442.7C546.3 370.7 507.1 334.9 719.7 211.6 719.7 211.6 385.9 295 545.3 478.7ZM797.8 845.5S825.4 868.3 767.5 885.8C657.3 919.2 308.8 929.3 212 887.2 177.3 872 242.5 851 263 846.6 284.4 842 296.6 842.8 296.6 842.8 257.9 815.6 46.5 896.3 189.3 919.5 578.5 982.6 898.8 891.1 797.8 845.5ZM389.9 549.2S212.7 591.3 327.2 606.6C375.5 613 471.9 611.6 561.6 604 635 597.9 708.6 584.7 708.6 584.7S682.8 595.8 664.1 608.6C484 655.9 136.4 633.9 236.5 585.4 321.1 544.5 389.9 549.2 389.9 549.2ZM707.9 726.9C890.9 631.8 806.2 540.5 747.2 552.8 732.8 555.8 726.3 558.4 726.3 558.4S731.7 550 741.9 546.4C858.7 505.3 948.6 667.5 704.2 731.7 704.2 731.7 707 729.1 707.9 726.9ZM597.6 12.4S698.9 113.8 501.5 269.6C343.1 394.7 465.4 465.9 501.4 547.4 409 464 341.2 390.6 386.7 322.3 453.4 222 638.5 173.4 597.6 12.4ZM407.9 984.5C583.5 995.8 853.2 978.3 859.6 895.2 859.6 895.2 847.3 926.7 714.5 951.7 564.6 979.9 379.7 976.6 270.1 958.5 270.1 958.5 292.5 977.1 407.9 984.5Z", - "width": 1000 - }, - "search": [ - "java" - ] - }, - { - "uid": "d14641eeb48e133c524b9ed4a46b2935", - "css": "go", - "code": 59396, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M164.8 536.7C166.4 564.1 193.8 551.6 206.3 543 218 534.4 221.9 541.4 222.7 525 223.4 514.1 224.2 503.9 224.2 493 206.3 491.4 186.7 495.3 171.9 506.3 164.8 511.7 150 529.7 164.8 536.7M179.7 556.3C174.2 556.3 164.1 553.9 162.5 538.3 157.8 535.2 156.3 531.3 156.3 528.9 155.5 519.5 165.6 508.6 171.1 504.7 183.6 495.3 200 490.6 217.2 490.6H227.3V493C228.1 501.6 227.3 510.2 226.6 518 226.6 520.3 226.6 522.7 225.8 525 225 536.7 222.7 538.3 217.2 540.6 214.8 541.4 212.5 542.2 208.6 545.3 204.7 547.7 191.4 556.3 179.7 556.3ZM217.2 495.3C200.8 495.3 185.9 500 174.2 508.6 168.8 512.5 160.9 521.9 161.7 528.1 161.7 530.5 163.3 532.8 166.4 534.4L168 535.2V536.7C168.8 549.2 175 550.8 179.7 550.8 187.5 550.8 198.4 545.3 205.5 540.6 210.2 537.5 213.3 536.7 215.6 535.9 219.5 534.4 220.3 534.4 221.1 525 221.1 522.7 221.1 520.3 221.9 518 222.7 510.9 222.7 503.1 222.7 496.1 220.3 495.3 218.8 495.3 217.2 495.3ZM164.8 536.7C168.8 535.2 173.4 534.4 175.8 530.5M164.8 539.1C164.1 539.1 162.5 538.3 162.5 537.5 161.7 535.9 162.5 534.4 164.1 534.4 164.8 534.4 165.6 533.6 165.6 533.6 168.7 532 171.9 531.3 173.4 528.9 174.2 528.1 175.8 527.3 177.3 528.1 178.1 528.9 178.9 530.5 178.1 532 175 535.9 171.1 537.5 168 538.3L166.4 539.1H164.8ZM228.9 206.3C122.7 176.6 201.6 41.4 286.7 96.9L228.9 206.3ZM230.5 209.4L228.1 208.6C173.4 193 174.2 153.9 175.8 142.2 179.7 112.5 207.8 81.2 245.3 81.2 260.2 81.2 274.2 85.9 288.3 95.3L290.6 96.9 230.5 209.4ZM245.3 86.7C210.2 86.7 184.4 115.6 180.5 143 176.6 171.1 193.7 193 227.3 203.1L282.8 97.7C271.1 90.6 258.6 86.7 245.3 86.7ZM700 86.7C783.6 28.1 860.2 160.9 762.5 194.5L700 86.7ZM761.7 197.7L696.9 85.9 699.2 84.4C714.1 74.2 728.9 68.8 743.8 68.8 779.7 68.8 805.5 98.4 810.9 127.3 813.3 139.1 815.6 178.9 764.1 196.1L761.7 197.7ZM703.9 88.3L764.1 192.2C794.5 181.3 810.2 157.8 805.5 129.7 800.8 103.1 776.6 75.8 743.7 75.8 730.5 75 717.2 78.9 703.9 88.3ZM718.8 877.3C739.8 890.6 778.9 930.5 746.9 950 716.4 978.1 699.2 918.8 671.9 910.9 683.6 895.3 698.4 880.5 718.8 877.3M730.5 960.2C718 960.2 707 947.7 697.7 935.9 689.1 926.6 680.5 916.4 671.1 913.3L667.2 912.5 669.5 909.4C678.9 896.1 694.5 878.9 718 875H718.7L719.5 875.8C732.8 884.4 761.7 908.6 760.9 931.2 760.9 939.8 756.2 946.9 747.7 952.3 742.2 957.8 736.7 960.2 730.5 960.2ZM675.8 909.4C685.2 913.3 693 923.4 700.8 932 710.2 943.8 719.5 953.9 729.7 953.9 734.4 953.9 739.1 951.6 743.8 946.9H744.5C751.6 942.2 755.5 936.7 755.5 929.7 755.5 911.7 732.8 889.1 717.2 878.9 703.1 882.8 689.1 892.2 675.8 909.4ZM746.9 952.3C746.1 952.3 745.3 951.6 744.5 950.8 743 947.7 741.4 943.8 740.6 940.6 738.3 934.4 735.9 928.1 731.3 923.4 730.5 922.7 730.5 921.1 731.3 919.5 732 918.8 733.6 918.8 735.2 919.5 740.6 925 743.7 932 746.1 939.1L750 948.4C750.8 950 750 951.6 749.2 952.3H746.9ZM337.5 922.7C312.5 926.6 298.4 949.2 277.3 960.9 257.8 972.7 250 957 248.4 953.9 245.3 952.3 245.3 955.5 240.6 950.8 222.7 921.9 259.4 900.8 278.9 886.7 306.3 880.5 323.4 903.9 337.5 922.7M264.1 967.2C253.9 967.2 248.4 958.6 246.9 955.5H246.1C243.7 955.5 242.2 954.7 239.1 951.6V950.8C221.9 923.4 251.6 902.3 271.1 888.3L278.1 883.6H279.7C282.8 882.8 285.2 882.8 288.3 882.8 311.7 882.8 326.6 903.1 339.1 919.5L343 925 338.3 925.8C323.4 928.1 312.5 937.5 301.6 946.9 294.5 953.1 287.5 958.6 279.7 963.3 273.4 965.6 268.8 967.2 264.1 967.2ZM246.9 950.8C247.7 950.8 248.4 950.8 250 951.6H250.8L251.6 952.3C253.1 954.7 257 961.7 264.8 961.7 268.8 961.7 272.7 960.2 276.6 957.8 284.4 953.9 291.4 947.7 297.7 942.2 307.8 933.6 318.8 924.2 332.8 920.3 321.1 904.7 307 887.5 287.5 887.5 285.2 887.5 282.8 887.5 280.5 888.3L274.2 893C253.9 907 228.9 925 243.8 948.4 244.5 950 245.3 950.8 246.9 950.8ZM248.4 956.3C246.9 956.3 245.3 954.7 246.1 953.1 246.9 945.3 250.8 939.8 254.7 933.6 257 930.5 258.6 927.3 260.2 924.2 260.9 922.7 262.5 922.7 263.3 922.7 264.8 923.4 264.8 925 264.8 925.8 263.3 929.7 260.9 932.8 258.6 935.9 254.7 941.4 251.6 946.1 250.8 952.3 250.8 955.5 250 956.2 248.4 956.2ZM233.6 169.5C219.5 162.5 209.4 152.3 218 135.9 225.8 121.1 240.6 122.7 254.7 129.7L233.6 169.5ZM740.6 155.5C754.7 148.4 764.8 138.3 756.3 121.9 748.4 107 733.6 108.6 719.5 115.6L740.6 155.5ZM836.7 532.8C835.2 560.2 807.8 547.7 795.3 539.1 783.6 530.5 779.7 537.5 778.9 521.1 778.1 510.2 777.3 500 777.3 489.1 795.3 487.5 814.8 491.4 829.7 502.3 837.5 508.6 851.6 525.8 836.7 532.8M822.7 552.3C810.9 552.3 797.7 543.8 793.8 541.4 789.8 539.1 787.5 537.5 785.2 536.7 778.9 534.4 777.3 532.8 776.6 521.1 776.6 518.8 776.6 516.4 775.8 514.1 775 506.3 774.2 497.7 775 489.1V486.7H785.2C802.3 486.7 818.8 491.4 831.3 500.8 836.7 504.7 846.9 515.6 846.1 525 846.1 528.1 844.5 532 839.8 534.4 838.3 550 828.1 552.3 822.7 552.3ZM779.7 492.2C779.7 499.2 779.7 507 780.5 514.1 780.5 516.4 780.5 518.7 781.2 521.1 782 530.5 782.8 530.5 786.7 532 789.1 532.8 792.2 534.4 796.9 536.7 803.9 541.4 814.8 546.9 822.7 546.9 827.3 546.9 833.6 545.3 834.4 532.8V531.3L835.9 530.5C839.1 528.9 840.6 527.3 840.6 524.2 841.4 518 833.6 508.6 828.1 504.7 816.4 496.1 800.8 491.4 785.2 491.4 783.6 492.2 782 492.2 779.7 492.2ZM836.7 532.8C832.8 531.3 828.1 530.5 825.8 526.6M836.7 535.9H835.9L834.4 535.2C830.5 533.6 826.6 532.8 824.2 528.9 823.4 528.1 823.4 525.8 825 525 825.8 524.2 828.1 524.2 828.9 525.8 830.5 528.1 833.6 528.9 836.7 530.5 837.5 530.5 838.3 531.2 838.3 531.2 839.8 532 840.6 533.6 839.8 534.4 839.1 535.2 837.5 535.9 836.7 535.9ZM490.6 31.3C596.9 31.3 696.1 46.1 748.4 148.4 795.3 262.5 778.1 385.9 785.9 507 792.2 610.9 805.5 730.5 757.8 826.6 707 927.3 580.5 953.1 476.6 949.2 394.5 946.1 296.1 919.5 249.2 844.5 195.3 757 220.3 626.6 224.2 528.9 228.9 413.3 193 296.9 231.2 184.4 269.5 66.4 375.8 39.8 490.6 31.3M494.5 952.3H475C443 951.6 394.5 946.1 346.9 926.6 300.8 907.8 267.2 881.3 245.3 846.1 201.6 775 209.4 677.3 216.4 590.6 218 568.8 219.5 548.4 220.3 528.9 221.9 488.3 218.8 446.1 214.8 406.3 208.6 332.8 202.3 257 226.6 183.6 245.3 128.9 278.9 89.8 329.7 64.8 369.5 45.3 418.8 34.4 489.1 28.9 593.8 28.1 697.7 43 750 146.9 784.4 230.5 784.4 320.3 785.2 407 785.2 439.8 785.2 473.4 787.5 506.3 788.3 516.4 789.1 526.6 789.1 536.7 795.3 632 802.3 739.8 758.6 827.3 736.7 871.9 698.4 904.7 646.1 925.8 603.9 943 550.8 952.3 494.5 952.3ZM490.6 33.6C380.5 42.2 272.7 66.4 232.8 185.2 208.6 257.8 214.8 332.8 221.1 405.5 224.2 446.1 228.1 487.5 226.6 528.9 225.8 548.4 224.2 568.8 222.7 590.6 215.6 676.6 207.8 773.4 250.8 843 268.7 871.9 326.6 940.6 475.8 946.1H495.3C668 946.1 732 869.5 755.5 824.2 798.4 738.3 791.4 630.5 785.9 535.9 785.2 525.8 784.4 515.6 784.4 505.5 782.8 472.7 782 439.1 782 406.3 781.3 320.3 781.3 230.5 747.7 147.7 724.2 101.6 689.1 70.3 640.6 52.3 590.6 35.9 534.4 33.6 490.6 33.6ZM509.4 173.4C528.1 284.4 709.4 254.7 683.6 143 660.2 43 503.1 71.1 509.4 173.4M595.3 246.1C560.2 246.1 515.6 227.3 506.3 174.2 504.7 149.2 512.5 126.6 528.9 109.4 546.9 89.8 574.2 78.9 602.3 78.9 635.2 78.9 674.2 96.1 685.2 143.8 691.4 170.3 686.7 193.7 671.9 212.5 655.5 232.8 626.6 246.1 595.3 246.1ZM511.7 173.4C515.6 195.3 525.8 212.5 542.2 225 556.3 235.9 575.8 241.4 595.3 241.4 624.2 241.4 652.3 228.9 668 209.4 682 192.2 685.9 169.5 680.5 144.5 670.3 100 633.6 84.4 602.3 84.4 575.8 84.4 550 95.3 532.8 113.3 518 128.9 510.2 150 511.7 173.4ZM293 191.4C318 287.5 471.9 263.3 466.4 166.4 459.4 50.8 268.8 72.7 293 191.4M375 255.5C341.4 255.5 302.3 239.1 289.8 192.2 284.4 164.8 289.8 139.8 305.5 121.1 322.7 100 350.8 87.5 381.3 87.5 421.9 87.5 464.8 111.7 468 166.4 469.5 189.1 462.5 209.4 446.9 225.8 430.5 243.8 403.1 255.5 375 255.5ZM381.3 93C352.3 93 325.8 104.7 309.4 124.2 294.5 142.2 289.8 164.8 295.3 190.6 306.2 234.4 343.8 250 375 250 401.6 250 427.3 239.8 443.8 221.9 457.8 207 464.8 187.5 463.3 166.4 461.7 132.8 439.1 93 381.3 93ZM531.3 306.3C531.3 320.3 534.4 336.7 532 352.3 528.1 359.4 521.1 360.2 514.8 362.5 506.3 360.9 499.2 355.5 495.3 347.7 493 330.5 496.1 313.3 496.9 296.1L531.3 306.2ZM514.8 365.6C504.7 364.1 496.9 357.8 493 349.2 491.4 336.7 492.2 325 493 313.3 493.8 307.8 493.8 302.3 493.8 296.9V293.7L533.6 306.2V307.8C533.6 312.5 534.4 317.2 534.4 322.7 535.2 332.8 535.9 343.8 534.4 353.9V354.7C531.3 360.9 525.8 362.5 520.3 364.8 518.8 364.1 517.2 364.8 514.8 365.6ZM497.7 346.9C500.8 353.9 507 358.6 514.1 360.2 515.6 359.4 517.2 359.4 518 358.6 522.7 357 526.6 355.5 528.9 351.6 530.5 342.2 529.7 332 528.9 321.9 528.9 317.2 528.1 312.5 528.1 308.6L498.4 299.2C498.4 303.9 497.7 308.6 497.7 312.5 496.9 325 496.1 335.9 497.7 346.9ZM361.7 175.8C361.7 191.4 350 203.9 335.9 203.9 321.9 203.9 310.2 191.4 310.2 175.8S321.9 147.7 335.9 147.7C350 147.7 361.7 160.2 361.7 175.8M353.1 182C353.1 185.9 350 189.1 346.9 189.1S340.6 185.9 340.6 182 343.8 175 346.9 175C350.8 175 353.1 178.1 353.1 182M579.7 168.8C579.7 184.4 568 196.9 553.9 196.9 539.8 196.9 528.1 184.4 528.1 168.8S539.8 140.6 553.9 140.6C568 140.6 579.7 153.1 579.7 168.8M571.9 175C571.9 178.9 569.5 182 565.6 182 562.5 182 559.4 178.9 559.4 175S561.7 168 565.6 168C568.8 168 571.9 171.1 571.9 175M456.3 304.7C444.5 332 462.5 387.5 493.7 346.9 491.4 329.7 494.5 312.5 495.3 295.3L456.3 304.7ZM472.7 364.1C467.2 364.1 461.7 360.9 457.8 354.7 449.2 342.2 447.7 318.8 453.9 303.9L454.7 302.3 497.7 291.4V294.5L496.9 311.7C496.1 323.4 495.3 334.4 496.9 346.1V346.9L496.1 347.7C488.3 358.6 480.5 364.1 472.7 364.1ZM458.6 307C453.9 320.3 455.5 341.4 462.5 351.6 465.6 356.3 468.8 358.6 472.7 358.6 478.1 358.6 484.4 353.9 490.6 346.1 489.1 334.4 489.8 322.7 491.4 311.7L492.2 298.4 458.6 307ZM460.2 251.6C439.1 253.1 421.9 278.9 432.8 298.4 447.7 325 479.7 296.1 500 298.4 523.4 299.2 542.2 323.4 560.9 303.1 582 280.5 551.6 258.6 528.9 248.4L460.2 251.6ZM544.5 314.1C537.5 314.1 530.5 310.9 523.4 307.8 516.4 304.7 508.6 301.6 500 301.6H497.7C491.4 301.6 484.4 303.9 476.6 307 468 310.2 459.4 312.5 451.6 312.5 442.2 312.5 435.2 308.6 430.5 300 425 290.6 425.8 279.7 431.2 269.5 437.5 257.8 448.4 250.8 460.2 249.2L529.7 246.1H530.5C547.7 253.1 567.2 266.4 571.1 282 572.7 289.8 570.3 297.7 564.1 304.7 557.8 311.7 551.6 314.1 544.5 314.1ZM500.8 296.9C509.4 296.9 518 300.8 525.8 303.9 532.8 307 539.1 309.4 545.3 309.4 550.8 309.4 555.5 307 560.2 302.3 565.6 296.9 567.2 290.6 566.4 284.4 563.3 271.1 544.5 258.6 529.7 252.3L461.7 255.5C451.6 256.3 442.2 263.3 436.7 272.7 432 281.3 432 290.6 435.9 298.4 439.8 305.5 444.5 308.6 452.3 308.6 459.4 308.6 467.2 305.5 475 303.1 483.6 300 490.6 297.7 498.4 297.7 498.4 296.1 499.2 296.1 500.8 296.9ZM457.8 250.8C456.3 214.1 526.6 209.4 534.4 239.8 543 271.1 460.9 278.1 457.8 250.8", - "width": 1000 - }, - "search": [ - "go" - ] - }, - { - "uid": "7f31d434796c81d32079b27b21bfbf23", - "css": "nodejs", - "code": 59397, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M881 237L536.5 36.9C514.8 24.6 486.5 24.6 464.6 36.9L116.4 237C94 249.9 78.1 274.1 78.1 300.1V699.6C78.1 725.5 94.4 749.8 116.8 762.8L208.8 815C252.8 836.7 268.3 836.7 288.3 836.7 353.4 836.7 390.6 797.3 390.6 728.6V334.2C390.6 328.6 387.7 320.3 382.3 320.3H338.3C332.8 320.3 320.3 328.6 320.3 334.2V728.6C320.3 759.1 292.8 789.3 241.3 763.6L146.3 708.8C143 707 140.6 703.4 140.6 699.6V300.1C140.6 296.3 145 292.5 148.3 290.6L495.4 90.9C498.6 89 503.4 89 506.6 90.9L849.4 290.5C852.7 292.5 851.6 296.2 851.6 300.1V699.6C851.6 703.4 853 707.1 849.7 709L505.3 908.8C502.4 910.5 498.7 910.5 495.5 908.8L407.1 856C404.5 854.5 401.3 853.9 398.8 855.4 374.2 869.3 369.6 871.2 346.6 879.1 340.9 881.1 332.5 884.6 349.8 894.2L465.4 962.6C476.5 969 489 972.3 501.7 972.3 514.5 972.3 527.1 969 538.2 962.6L881 762.8C903.4 749.7 914.1 725.5 914.1 699.6V300.1C914.1 274.1 903.4 249.9 881 237ZM608.7 636.3C517.1 636.3 496.9 611 490.2 565.5 489.4 560.6 485.2 554.7 480.2 554.7H435.4C429.9 554.7 425.5 561.4 425.5 566.9 425.5 625.2 457.2 695.9 608.7 695.9 718.4 695.9 781.2 653.3 781.2 577.9 781.2 503.1 730.7 483.5 624.4 469.4 516.8 455.2 505.9 448 505.9 422.8 505.9 402.1 515.2 374.4 594.8 374.4 665.9 374.4 692.1 389.6 702.9 437.6 703.8 442.1 708 445.3 712.6 445.3H757.6C760.3 445.3 763 444.2 764.9 442.2 766.8 440.1 767.8 437.4 767.5 434.6 760.6 352 705.7 313.5 594.8 313.5 496.1 313.5 437.2 355.2 437.2 425.1 437.2 500.8 495.8 521.8 590.5 531.1 703.8 542.2 712.6 558.8 712.6 581.1 712.6 619.8 681.6 636.3 608.7 636.3Z", - "width": 1000 - }, - "search": [ - "nodejs" - ] - }, - { - "uid": "c4f09be0ca77ae09f03ee42c90f63346", - "css": "js", - "code": 59461, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M11 11H989V989H11ZM909 755.8C901.8 711.1 872.7 673.7 786.5 638.7 756.6 625 723.2 615.1 713.3 592.4 709.7 579.2 709.3 571.8 711.5 563.8 717.9 537.8 748.9 529.8 773.4 537.2 789.2 542.5 804.2 554.7 813.2 574.1 855.4 546.8 855.3 547 884.8 528.2 874 511.4 868.2 503.7 861.2 496.6 835.8 468.2 801.2 453.6 745.9 454.7L717.1 458.5C689.5 465.4 663.2 479.9 647.7 499.4 601.4 551.9 614.6 643.8 671 681.7 726.5 723.3 808 732.8 818.4 771.7 828.6 819.4 783.4 834.9 738.5 829.4 705.4 822.5 687 805.7 667.1 775.1 630.4 796.3 630.4 796.3 592.8 818 601.7 837.5 611.1 846.3 626.1 863.2 696.9 935.1 874.2 931.6 906 822.8 907.3 819.1 915.8 794.1 909 755.7ZM542.7 460.5H451.2L450.8 697C450.8 747.3 453.4 793.4 445.2 807.5 431.9 835.3 397.2 831.9 381.4 826.5 365.3 818.6 357.1 807.3 347.6 791.5 345 786.9 343.1 783.4 342.4 783.1L268 828.6C280.4 854 298.6 876 322 890.4 356.8 911.3 403.7 917.7 452.7 906.4 484.6 897.2 512.1 877.9 526.5 848.6 547.3 810.2 542.9 763.8 542.7 712.3 543.1 628.5 542.7 544.6 542.7 460.5Z", - "width": 1000 - }, - "search": [ - "js" - ] - }, - { - "uid": "5a4a423f0b0ccfda72dc0dfaea9c45c5", - "css": "kotlin", - "code": 59426, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "", - "width": 1000 - }, - "search": [ - "kotlin" - ] - }, - { - "uid": "529c2f7b7dcabdd1f5d44ffe165b806c", - "css": "php", - "code": 59400, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M500 258.1C236.4 258.1 22.7 366.4 22.7 500S236.4 741.9 500 741.9 977.3 633.6 977.3 500 763.6 258.1 500 258.1ZM375.8 547.1C364.4 557.8 351.8 562.2 337.8 566.7 323.9 571.3 306.2 570.3 284.6 570.3H235.8L222.2 648.4H165.2L216.1 382.8H325.8C358.8 382.8 382.9 392.3 398 409.6 413.1 426.9 417.7 451.5 411.6 482.6 409.1 495.4 404.9 507.3 399 517.8 393.1 528.4 385.4 538.3 375.8 547.1ZM542.3 570.3L564.8 457.7C567.4 444.5 566.4 434.7 562 429.9 557.5 425.1 548.1 421.9 533.6 421.9H488.4L459.2 570.3H402.6L453.5 312.5H510.1L496.6 382.8H547C578.7 382.8 600.6 389.2 612.6 400.2S628.3 426.5 623.5 451.2L599.8 570.3H542.3ZM856.8 483C854.3 495.8 850.1 507.5 844.2 518 838.3 528.6 830.6 538.3 821 547.1 809.6 557.8 797 562.2 783 566.7 769.1 571.3 751.4 570.3 729.8 570.3H681L667.4 648.4H610.4L661.3 382.8H771C804 382.8 828.1 392.3 843.2 409.6 858.3 426.9 862.9 452 856.8 483ZM749.4 421.9H710.3L689 531.3H723.7C746.7 531.3 763.8 529 775.1 520.3 786.3 511.7 793.9 498.2 797.9 478 801.6 458.5 799.9 443.3 792.7 435.3 785.5 427.3 771 421.9 749.4 421.9ZM304.2 421.9H265.1L243.8 531.3H278.5C301.5 531.3 318.6 529 329.9 520.3 341.1 511.7 348.7 498.2 352.7 478 356.4 458.5 354.7 443.3 347.5 435.3S325.8 421.9 304.2 421.9Z", - "width": 1000 - }, - "search": [ - "php" - ] - }, - { - "uid": "3106bdcc8253a317bc61a070588a68d8", - "css": "python", - "code": 59401, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M495.2 15.5C462.3 15.7 430.8 18.5 403.1 23.4 321.4 37.8 306.6 68 306.6 123.7V197.2H499.5V221.7H234.2C178.1 221.7 129 255.4 113.7 319.5 96 393 95.2 438.9 113.7 515.6 127.4 572.7 160.1 613.4 216.2 613.4H282.5V525.3C282.5 461.6 337.6 405.4 403.1 405.4H595.8C649.4 405.4 692.2 361.3 692.2 307.4V123.7C692.2 71.4 648.1 32.1 595.8 23.4 562.6 17.9 528.2 15.4 495.2 15.5ZM390.9 74.7C410.8 74.7 427.1 91.2 427.1 111.5 427.1 131.8 410.8 148.2 390.9 148.2 370.9 148.2 354.7 131.8 354.7 111.5 354.7 91.2 370.9 74.7 390.9 74.7ZM716.3 221.7V307.4C716.3 373.8 660 429.7 595.8 429.7H403.1C350.3 429.7 306.6 474.9 306.6 527.7V711.4C306.6 763.7 352.1 794.5 403.1 809.5 464.1 827.4 522.7 830.7 595.8 809.5 644.3 795.4 692.2 767.1 692.2 711.4V637.9H499.5V613.4H788.7C844.7 613.4 865.6 574.3 885.1 515.6 905.3 455.2 904.4 397 885.1 319.5 871.3 263.7 844.8 221.7 788.7 221.7H716.3ZM607.9 686.9C627.9 686.9 644.1 703.3 644.1 723.6 644.1 743.9 627.9 760.5 607.9 760.5 588 760.5 571.7 743.9 571.7 723.6 571.7 703.3 588 686.9 607.9 686.9ZM760.2 934.4C760.2 962 644.5 984.5 501.7 984.5 358.9 984.5 243.2 962 243.2 934.4 243.2 906.7 358.9 884.2 501.7 884.2 644.5 884.2 760.2 906.7 760.2 934.4Z", - "width": 1000 - }, - "search": [ - "python" - ] - }, - { - "uid": "8b156c11558d1a94f62830814a204383", - "css": "ruby", - "code": 59402, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M758.4 650.1L221.4 969 916.7 921.8 970.3 220.7ZM917.9 921.3L858.1 508.8 695.3 723.8ZM918.7 921.3L480.8 887 223.7 968.1ZM224.4 968.2L333.7 609.9 93 661.3ZM695.3 725L594.6 330.8 306.6 600.7ZM947.5 336.3L675.2 113.9 599.4 359ZM820.1 34.7L660 123.2 559 33.5ZM29.7 781.5L96.8 659.2 42.5 513.4ZM38.9 508.8L93.5 663.7 330.7 610.5 601.6 358.8 678 116 557.7 31 353 107.6C288.6 167.5 163.5 286.2 159 288.4 154.5 290.7 76.4 438.4 38.9 508.8ZM230.6 230.6C370.3 92.1 550.4 10.3 619.6 80 688.6 149.7 615.4 319.2 475.7 457.7 336 596.2 158.1 682.5 89 612.8 19.9 543.1 90.9 369.1 230.6 230.6ZM224.4 968L332.9 608.6 693.3 724.4C563 846.6 418 949.9 224.4 968ZM602 358.1L694.6 724.5C803.4 610.1 901.1 487 949 334.8L602 358.1ZM948 336.7C985.1 224.9 993.6 64.6 819 34.9L675.7 114 948 336.7ZM29.7 779.9C34.8 964.3 167.9 967.1 224.6 968.7L93.7 662.9 29.7 779.9ZM602.6 358.6C686.2 410 854.8 513.3 858.2 515.2 863.5 518.2 930.9 401.6 946.2 335.7L602.6 358.6ZM332.7 608.6L477.8 888.5C563.6 842 630.8 785.3 692.3 724.5L332.7 608.6ZM93.1 663.3L72.5 908.1C111.3 961.1 164.7 965.7 220.6 961.5 180.1 860.8 99.3 659.2 93.1 663.3ZM674.9 114.6L963.1 155.1C947.7 89.9 900.5 47.8 820 34.7L674.9 114.6Z", - "width": 1000 - }, - "search": [ - "ruby" - ] - }, - { - "uid": "868b466a7c571ba31151fff6faee19d4", - "css": "scala", - "code": 59403, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M203.8 611.1L203.8 685.1C203.8 697.6 473.1 718.5 648.5 759.1L648.5 759.1C733.3 739.5 796.2 715.3 796.2 685.1L796.2 685.1 796.2 611.1C796.2 580.9 733.3 556.7 648.5 537L648.5 537C473.1 577.7 203.8 598.6 203.8 611.1M203.8 314.9L203.8 388.9C203.8 401.4 473.1 422.3 648.5 463L648.5 463C733.3 443.3 796.2 419.1 796.2 388.9L796.2 388.9 796.2 314.9C796.2 284.8 733.3 260.5 648.5 240.9L648.5 240.9C473.1 281.5 203.8 302.4 203.8 314.9M203.8 463L203.8 685.1C203.8 666.6 796.2 629.6 796.2 537L796.2 537 796.2 314.9C796.2 407.4 203.8 444.5 203.8 463M203.8 166.8L203.8 388.9C203.8 370.4 796.2 333.4 796.2 240.9L796.2 240.9 796.2 18.7C796.2 111.3 203.8 148.3 203.8 166.8M203.8 759.1L203.8 981.3C203.8 962.8 796.2 925.7 796.2 833.2L796.2 833.2 796.2 611.1C796.2 703.6 203.8 740.6 203.8 759.1", - "width": 1000 - }, - "search": [ - "scala" - ] - }, - { - "uid": "3a9e425217358e1044068c9acaa61394", - "css": "swift", - "code": 59404, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M987 266.1A307.2 307.2 0 0 0 980.8 204.9 224.8 224.8 0 0 0 960.1 145.7 225.3 225.3 0 0 0 922.9 96.3 183 183 0 0 0 871.2 60.8 213 213 0 0 0 811.2 41C790.5 37 767.7 37 747 35.1H236.3A355.2 355.2 0 0 0 188.8 39.1 170.5 170.5 0 0 0 143.3 50.9C139.1 52.9 133 54.9 128.8 56.9A264.2 264.2 0 0 0 89.8 82.5C85.6 86.5 81.5 88.4 77.3 92.3A175.1 175.1 0 0 0 40.2 141.7 184.5 184.5 0 0 0 19.5 200.9 613.3 613.3 0 0 0 13.3 262.1V733.9A307.2 307.2 0 0 0 19.5 795.1 224.8 224.8 0 0 0 40.2 854.3 225.3 225.3 0 0 0 77.3 903.7 183 183 0 0 0 129.1 939.2 213 213 0 0 0 189.1 959C209.8 963 232.5 963 253.2 964.9H747.1A352.2 352.2 0 0 0 811.3 959 213 213 0 0 0 871.3 939.2 235.4 235.4 0 0 0 923 903.7 175.1 175.1 0 0 0 960.2 854.3 184.5 184.5 0 0 0 980.9 795.1 613.2 613.2 0 0 0 987 733.9V266.1ZM664.1 753.9C577.3 801.8 458 806.7 337.9 757.6A504.1 504.1 0 0 1 108.1 570.3 390.6 390.6 0 0 0 192.9 619.7C316.9 675.2 440.8 671.3 528 619.7L528 619.7C403.8 528.6 298.4 410.2 219.8 313.4A339.6 339.6 0 0 1 178.4 260.2C273.4 343 424.5 447.7 478.3 477.3A2123.2 2123.2 0 0 1 267.3 224.6 2084.4 2084.4 0 0 0 614.8 497C620.3 500 624.6 502.5 628 504.8A255.5 255.5 0 0 0 637.5 477.4C666.5 376.7 633.4 262.3 561 167.5 728.5 264.1 828.1 445.7 786.4 597.7 785.3 601.9 784.1 605.5 782.9 609.8L784.4 611.6C867.1 710.2 844.4 814.7 834 795.2 789.1 710.9 706 737 664.1 753.9Z", - "width": 1000 - }, - "search": [ - "swift" - ] - }, - { - "uid": "5892e4a1a11418b7e863eeb5dc2a3cfd", - "css": "logo", - "code": 59405, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M4295.3 5503.4V3422.8H3926.2 3557V2718.1 2013.4H4932.9 6308.7V2718.1 3422.8H5973.2 5637.6V5503.4 7583.9H4966.4 4295.3V5503.4ZM7651 5503.4V3422.8H7349 7047V2718.1 2013.4H8020.1 8993.3V4798.7 7583.9H8322.1 7651V5503.4ZM12818.8 6845.6V6107.4H13288.6 13758.4V4765.1 3422.8H13322.1 12885.9V2718.1 2013.4H13993.3 15100.7V4798.7 7583.9H13959.7 12818.8V6845.6ZM10583.9 5389.3C10557 5369.1 10536.9 4912.8 10536.9 4382.6V3422.8H10234.9 9932.9V2718.1 2013.4H10939.6 11946.3V3724.8 5436.2H11288.6C10926.2 5436.2 10604 5416.1 10583.9 5389.3ZM20671.1 6174.5V3489.9H20335.6 20000V2718.1 1946.3H21040.3 22080.5V5402.7 8859.1H21375.8 20671.1V6174.5ZM30671.1 6510.1V4161.1H31375.8 32080.5V6510.1 8859.1H31375.8 30671.1V6510.1ZM26644.3 6879.2V6107.4H27248.3C27832.2 6107.4 27852.3 6100.7 27852.3 5959.7 27852.3 5872.5 27899.3 5382.6 27953 4865.8S28053.7 3825.5 28053.7 3711.4V3489.9H26912.8 25771.8V2047 604H26476.5 27174.5L27194.6 1261.7 27214.8 1912.8 28469.8 1932.9 29731.5 1946.3 29691.3 2234.9C29671.1 2389.3 29530.2 3664.4 29375.8 5067.1L29094 7617.4 27865.8 7637.6 26644.3 7651V6879.2ZM32751.7 6879.2V6107.4H33073.8 33402.7L33483.2 5154.4C33530.2 4624.2 33583.9 4033.6 33604 3845.6L33644.3 3489.9H32087.2 30536.9V2718.1 1946.3H32885.9 35234.9V2100.7C35234.9 2181.2 35100.7 3436.2 34932.9 4885.9S34630.9 7550.3 34630.9 7583.9C34630.9 7624.2 34248.3 7651 33691.3 7651H32751.7V6879.2ZM36322.1 5120.8C36201.3 3724.8 36080.5 2443 36060.4 2268.5L36020.1 1946.3H36771.8C37409.4 1946.3 37516.8 1959.7 37516.8 2053.7 37516.8 2281.9 37657.7 4140.9 37691.3 4349 37711.4 4463.1 37765.1 4563.8 37812.1 4563.8 37872.5 4563.8 37939.6 4255 38047 3476.5 38127.5 2872.5 38208.1 2281.9 38234.9 2167.8L38268.5 1946.3H38966.4C39349 1946.3 39664.4 1966.4 39664.4 1986.6 39664.4 2053.7 39194.6 5127.5 39161.1 5288.6 39127.5 5429.5 39094 5436.2 38436.2 5436.2H37751.7L37771.8 5771.8 37798.7 6107.4H38818.8 39838.9L40120.8 4181.2C40275.2 3114.1 40402.7 2181.2 40402.7 2100.7 40402.7 1953 40422.8 1946.3 41140.9 1946.3 41818.8 1946.3 41879.2 1959.7 41879.2 2073.8 41879.2 2140.9 41698 3409.4 41476.5 4899.3S41073.8 7610.7 41073.8 7624.2 40053.7 7651 38805.4 7651H36536.9L36322.1 5120.8ZM42751.7 6248.3V4838.9L43255 4429.5C43530.2 4201.3 43758.4 4006.7 43758.4 3986.6 43758.4 3973.2 43503.4 3570.5 43187.9 3100.7S42617.4 2181.2 42617.4 2100.7C42617.4 1946.3 42630.9 1946.3 43409.4 1946.3H44201.3L44597.3 2570.5C45691.3 4275.2 45711.4 4302 45812.1 4221.5 45885.9 4161.1 45906 3906 45906 3047V1946.3H46610.7 47315.4V3187.9 4422.8L46832.2 4845.6C46563.8 5073.8 46349 5288.6 46362.4 5328.9 46375.8 5362.4 46671.1 5859.1 47020.1 6422.8S47651 7496.6 47651 7550.3C47651 7637.6 47516.8 7651 46852.3 7651H46047L45228.2 6308.7C44778.5 5570.5 44375.8 4973.2 44335.6 4986.6 44288.6 5000 44248.3 5476.5 44228.2 6315.4L44194.6 7617.4 43476.5 7637.6 42751.7 7657.7V6248.3ZM23543.6 5523.5L23523.5 3456.4 23208.1 3436.2 22885.9 3416.1V2677.9 1946.3H23926.2 24966.4V4765.1 7583.9H24261.7 23557L23543.6 5523.5ZM33.6 9751.7C60.4 9610.7 563.8 7369.1 1161.1 4765.1L2248.3 33.6 10523.5 13.4C17114.1 0 18791.9 13.4 18791.9 80.5 18791.9 127.5 18288.6 2382.6 17671.1 5087.2L16543.6 10000H8268.5-13.4L33.6 9751.7ZM5637.6 5503.4V3422.8H5973.2 6308.7V2718.1 2013.4H4932.9 3557V2718.1 3422.8H3926.2 4295.3V5503.4 7583.9H4966.4 5637.6V5503.4ZM8993.3 4798.7V2013.4H8020.1 7047V2718.1 3422.8H7349 7651V5503.4 7583.9H8322.1 8993.3V4798.7ZM15100.7 4798.7V2013.4H13993.3 12885.9V2718.1 3422.8H13322.1 13758.4V4765.1 6107.4H13288.6 12818.8V6845.6 7583.9H13959.7 15100.7V4798.7ZM11946.3 3724.8V2013.4H10939.6 9932.9V2718.1 3422.8H10234.9 10536.9V4382.6C10536.9 4912.8 10557 5369.1 10583.9 5389.3 10604 5416.1 10926.2 5436.2 11288.6 5436.2H11946.3V3724.8Z", - "width": 4765 - }, - "search": [ - "logo" - ] - }, - { - "uid": "9ea263d5049701977f6e823c272e446b", - "css": "symbol", - "code": 59406, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M3500 6077.3V5159.1L3840.9 4890.9C4027.3 4745.5 4181.8 4600 4181.8 4572.7S3995.5 4245.5 3772.7 3909.1 3363.6 3277.3 3363.6 3259.1 3604.5 3231.8 3895.5 3236.4L4427.3 3250 4945.5 4059.1C5368.2 4718.2 5477.3 4859.1 5527.3 4813.6 5577.3 4772.7 5590.9 4595.5 5590.9 3995.5V3227.3H6059.1 6522.7L6513.6 4031.8 6504.5 4836.4 6159.1 5122.7C5972.7 5281.8 5818.2 5418.2 5818.2 5427.3S6022.7 5777.3 6272.7 6186.4 6727.3 6945.5 6727.3 6963.6 6495.5 7000 6218.2 7000H5704.5L5172.7 6122.7C4877.3 5645.5 4618.2 5222.7 4595.5 5186.4 4559.1 5131.8 4540.9 5131.8 4481.8 5177.3 4418.2 5227.3 4409.1 5372.7 4409.1 6118.2V7000H3954.5 3500V6077.3ZM363.6 8331.8C359.1 8309.1 704.5 6786.4 1122.7 4945.5L1886.4 1590.9H5740.9C8790.9 1590.9 9590.9 1604.5 9590.9 1650 9590.9 1677.3 9250 3204.5 8831.8 5036.4L8068.2 8363.6H4218.2C2095.5 8363.6 363.6 8350 363.6 8331.8ZM4409.1 6118.2C4409.1 5372.7 4418.2 5227.3 4481.8 5177.3 4540.9 5131.8 4559.1 5131.8 4595.5 5186.4 4618.2 5222.7 4877.3 5645.5 5172.7 6122.7L5704.5 7000H6218.2C6495.5 7000 6727.3 6981.8 6727.3 6963.6S6522.7 6595.5 6272.7 6186.4 5818.2 5436.4 5818.2 5427.3 5972.7 5281.8 6159.1 5122.7L6504.5 4836.4 6513.6 4031.8 6522.7 3227.3H6059.1 5590.9V3995.5C5590.9 4595.5 5577.3 4772.7 5527.3 4813.6 5477.3 4859.1 5368.2 4718.2 4945.5 4059.1L4427.3 3250 3895.5 3236.4C3604.5 3231.8 3363.6 3240.9 3363.6 3259.1S3550 3572.7 3772.7 3909.1 4181.8 4545.5 4181.8 4572.7 4027.3 4745.5 3840.9 4890.9L3500 5159.1V6077.3 7000H3954.5 4409.1V6118.2Z", - "width": 1000 - }, - "search": [ - "symbol" - ] - }, - { - "uid": "0afe674211244ebaef3e9b05ab605e87", - "css": "copy", - "code": 59407, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M643.6 174.9H178.7C135.1 174.9 99.6 210.3 99.6 253.9V921C99.6 964.6 135.1 1000 178.7 1000H643.6C687.2 1000 722.6 964.6 722.6 921V253.9C722.4 210.3 687 174.9 643.6 174.9ZM667.1 920.7C667.1 933.9 656.5 944.5 643.4 944.5H178.5C165.4 944.5 154.7 933.9 154.7 920.7V253.9C154.7 240.8 165.4 230.2 178.5 230.2H643.4C656.5 230.2 667.1 240.8 667.1 253.9V920.7ZM821.3 0H356.4C312.8 0 277.4 35.4 277.4 79 277.4 94.4 289.7 106.7 305 106.7S332.7 94.4 332.7 79C332.7 65.9 343.3 55.3 356.4 55.3H821.3C834.4 55.3 845.1 65.9 845.1 79V746.1C845.1 759.2 834.4 769.8 821.3 769.8 806 769.8 793.7 782.1 793.7 797.5S806 825.1 821.3 825.1C864.9 825.1 900.4 789.7 900.4 746.1V79C900.4 35.4 864.9 0 821.3 0Z", - "width": 1000 - }, - "search": [ - "copy" - ] - }, - { - "uid": "eb406137b424a7f8b60b70030603bc20", - "css": "capa_1", - "code": 59408, - "src": "custom_icons", - "selected": false, - "svg": { - "path": "M643.6 174.9H178.7C135.1 174.9 99.6 210.3 99.6 253.9V921C99.6 964.6 135.1 1000 178.7 1000H643.6C687.2 1000 722.6 964.6 722.6 921V253.9C722.4 210.3 687 174.9 643.6 174.9ZM667.1 920.7C667.1 933.9 656.5 944.5 643.4 944.5H178.5C165.4 944.5 154.7 933.9 154.7 920.7V253.9C154.7 240.8 165.4 230.2 178.5 230.2H643.4C656.5 230.2 667.1 240.8 667.1 253.9V920.7ZM821.3 0H356.4C312.8 0 277.4 35.4 277.4 79 277.4 94.4 289.7 106.7 305 106.7S332.7 94.4 332.7 79C332.7 65.9 343.3 55.3 356.4 55.3H821.3C834.4 55.3 845.1 65.9 845.1 79V746.1C845.1 759.2 834.4 769.8 821.3 769.8 806 769.8 793.7 782.1 793.7 797.5S806 825.1 821.3 825.1C864.9 825.1 900.4 789.7 900.4 746.1V79C900.4 35.4 864.9 0 821.3 0Z", - "width": 1000 - }, - "search": [ - "capa_1" + "discord-logo-black" ] } ] diff --git a/public/styles/icons.less b/public/styles/icons.less index d9974d1ce9..6561c6bd33 100644 --- a/public/styles/icons.less +++ b/public/styles/icons.less @@ -1,7 +1,7 @@ @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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AVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwAEdXNlcgZmb2xkZXIEbGlzdAVsb2dpbgNjb2cHdHdpdHRlcgthcnRpY2xlLWFsdAZjYW5jZWwEaG9tZQhkb3duLWRpcghmYWNlYm9vawhhc3RlcmlzawZ1cGxvYWQJc3RvcHdhdGNoBmV4cG9ydAVoZWFydARwbHVzBnVwLWRpcgRtZW51CWxlZnQtb3BlbgpyaWdodC1vcGVuBWluYm94BndyZW5jaAdjb21tZW50DXN0YWNrb3ZlcmZsb3cIcXVlc3Rpb24Kb2stY2lyY2xlZAd3YXJuaW5nBG1haWwEbGluawdrZXktaW52BXRyYXNoCGRvd25sb2FkB2dsYXNzZXMGcXJjb2RlB3NodWZmbGUDZXllBGxvY2sGc2VhcmNoBGJlbGwFdXNlcnMIbG9jYXRpb24JYnJpZWZjYXNlCWluc3RhZ3JhbQVjbG9jawVwaG9uZQhjYWxlbmRhcgVwcmludARlZGl0BGJvbGQGaXRhbGljBnJvY2tldAh3aGF0c2FwcAVkb3QtMwxpbmZvLWNpcmNsZWQIdmlkZW9jYW0LcXVvdGUtcmlnaHQHcGljdHVyZQdwYWxldHRlBGxhbXAJYm9vay1vcGVuAm9rCGNoYXQtYWx0B2FyY2hpdmUEcGxheQVwYXVzZQlkb3duLW9wZW4HdXAtb3BlbgVtaW51cwhleGNoYW5nZQduZXR3b3JrCGxpbmstZXh0DmdpdGh1Yi1jaXJjbGVkBmZpbHRlcgRkb2NzC2xpc3QtYnVsbGV0DWxpc3QtbnVtYmVyZWQJdW5kZXJsaW5lBHNvcnQIbGlua2VkaW4Fc21pbGUIa2V5Ym9hcmQEY29kZQZzaGllbGQSYW5nbGUtY2lyY2xlZC1sZWZ0E2FuZ2xlLWNpcmNsZWQtcmlnaHQJYml0YnVja2V0B3dpbmRvd3MKd2hlZWxjaGFpcgRiYW5rBmdvb2dsZQ9idWlsZGluZy1maWxsZWQIZGF0YWJhc2UIbGlmZWJ1b3kGaGVhZGVyCmJpbm9jdWxhcnMKY2hhcnQtYXJlYQlwaW50ZXJlc3QGbWVkaXVtBmdpdGxhYgh0ZWxlZ3JhbQAAAAAAAQAB//8ADwAAAAAAAAAAAAAAAAAAAAAAGAAYABgAGAOB/zoDgf86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') format('truetype'); + src: url('data:application/octet-stream;base64,d09GRgABAAAAAFWsAA8AAAAAhYgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABWAAAADsAAABUIIslek9TLzIAAAGUAAAAQwAAAFY+UFQBY21hcAAAAdgAAALLAAAH1qg8cX5jdnQgAAAEpAAAABMAAAAgBzP+pGZwZ20AAAS4AAAFkAAAC3CKkZBZZ2FzcAAACkgAAAAIAAAACAAAABBnbHlmAAAKUAAARIIAAGX2rX+1/mhlYWQAAE7UAAAAMwAAADYYjKJyaGhlYQAATwgAAAAgAAAAJAgaBJdobXR4AABPKAAAAMQAAAGcZ3j/lmxvY2EAAE/sAAAA0AAAANC9jNXrbWF4cAAAULwAAAAgAAAAIAJTDRRuYW1lAABQ3AAAAXQAAALNzZ0XGHBvc3QAAFJQAAAC4AAABDUyMH4ucHJlcAAAVTAAAAB6AAAAhuVBK7x4nGNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgYYAAkDwymzEnMz2RgQPGA8qxgGkOIGaDiAIAJjsFSAB4nGNgZK5lnMDAysDAVMW0h4GBoQdCMz5gMGRkAooysDIzYAUBaa4pDA4vGD4dYw76n8UQxdzIcAwozAiSAwD63AzZAHic3dQ7c1VlGMXx/4GIoCBeUIIENeIdEBPRhCAXRUW84V1BVC6aPi0fwoYZGij4AszwEWigCISaIg0FM6vcz6msgmvzrqGgkBnoPHt+mZwzZ8/svFlrAY8Ay22rjcCyJQb+jcE//nRw5/PlPHbn85HBNb//gJf8vTEd6P7uznYXu8vd1W6hW+xu1miN1XhN1nTN1ak6XefqfF2oS7VQi3WrloYTw5nhmeGV27dB3L17/p67p+5/9wO/Bn76+bvXtXuu6/959Xcv81mM+MRW8CgrWeVzeZzVrOEJ1vIkT/E0z7COZ3mO9YyygefZyBibeIEXfWrjvMxmXuFVXuN13uBN3mKLz3cbb7Odd5hgknfZwXu8zxTT7GSGXX7i3exhL/v4kI/Yz8d8wqcc4DMO8jlf8CVf8TWH+IZv+Y7v+YEf+Ymf+YXDHOFXjvIbv/MHxzjOCU7yJ38x6z9mxUOc4//ltbr/MXIj72b7XDZ98hX+r6Pom6Lo26LoW6RwOlA4JyicGBTODoq+XQrnCUX/dApnDIXThsK5Q+EEonAWUTiVKJxPFE4qCmcWhdOLwjlG4USjcLZROOUonHcUTj4KdwCF24DCvUDhhqBwV1C4NSjcHxRuEgp3CoXbhcI9Q+HGoXD3ULiFKNxHFP0iKtxRFG4rCvcWhRuMwl1G4VajcL9RuOko3HkUbj8K7wAKLwIKbwMKrwQK7wUKLwcKbwgKrwkK7woKLwwKbw0Krw4K7w8KLxEKbxIKrxMK7xQKL5ZXv/F20Z1tvGJ0FxvvGd3lxstGN9944+iuNl47uoXGu0e32HgB6W423kJqtPEqUmON95Eab7yU1GTjzaSmGq8nNd14R6m5xotKnWq8rdTpxitLnWu8t9T5xstLXWi8wdSlxmtMLTTeZWqx8UJTtxpvNbXUeLUZTjTeb4YzjZec4ZnGm87wSsPsvwCIkikAeJxjYEADEhDI3PjfCoQBEyID2wB4nK1WaXfTRhQdeUmchCwlCy1qYcTEabBGJmzBgAlBsmMgXZytlaCLFDvpvvGJ3+Bf82Tac+g3flrvGy8kkLTncJqTo3fnzdXM22USWpLYC+uRlJsvxdTWJo3sPAnphk3LUXwoO3shZYrJ3wVREK2W2rcdh0REIlC1rrBEEPseWZpkfOhRRsu2pFdNyi096S5b40G9Vd9+GjrKsTuhpGYzdGg9siVVGFWiSKY9UtKmZaj6K0krvL/CzFfNUMKITiJpvBnG0EjeG2e0ymg1tuMoimyy3ChSJJrhQRR5lNUS5+SKCQzKB82Q8sqnEeXD/Iis2KOcVrBLttP8vi95p3c5P7Ffb1G25EAfyI7s4Ox0JV+EW1th3LST7ShUEXbXd0Js2exU/2aP8ppGA7crMr3QjGCpfIUQKz+hzP4hWS2cT/mSR6NaspETQetlTuxLPoHW44gpcc0YWdDd0QkR1P2SMwz2mD4e/PHeKZYLEwJ4HMt6RyWcCBMpYXM0SdowcmAlZYsqqfWumDjldVrEW8J+7drRl85o41B3YjxbDx1bOVHJ8WhSp5lMndpJzaMpDaKUdCZ4zK8DKD+iSV5tYzWJlUfTOGbGhEQiAi3cS1NBLDuxpCkEzaMZvbkbprl2LVqkyQP13KP39OZWuLnTU9oO9LNGf1anYjrYC9PpaeQv8Wna5SJF6frpGX5M4kHWAjKRLTbDlIMHb/0O0svXlhyF1wbY7u3zK6h91kTwpAH7G9AeT9UpCUyFmFWIVkBirWtZlsnVrBapyNR3Q5pWvqzTBIpyHBfHvoxx/V8zM5aYEr7fidOzIy49c+1LCNMcfJt1PZrXqcVyAXFmeU6nWZbv6zTH8gOd5lme1+kIS1unoyw/1GmB5Uc6HWN5QQuadN/BkIsw5AIOkDCEpQNDWF6CISwVDGG5CENYFmEIyyUYwvJjGMJyGYawvKxl1dRTSePamVgGbEJgYo4eucxF5WoquVRCu2hUakOeEm6VVBTPqn9loF488oY5sBZIl8iaXzHOlY9G5fjWFS1vGjtXwLHqbx+O9jnxUtaLhT8F/9XWVCW9Ys3Dk6vwG4aebCeqNql4dE2Xz1U9uv5fVFRYC/QbSIVYKMqybHBnIoSPOp2GaqCVQ8xszDy063XLmp/D/TcxQhZQ/fg3FBoL3INOWUlZ7eCs1dfbstw7g3I4EyxJMTfz+lb4IiOz0n6RWcqej3wecAWMSmXYagOtFbzZJzEPmd4kzwRxW1E2SNrYzgSJDRzzgHnznQQmYeqqDeRO4YYN+AVhbsF5J1yieqMsh+5F7PMopPxbp+JE9qhojMCz2Rthr+9Cym9xDCQ0+aV+DFQVoakYNRXQNFJuqAZfxtm6bULGDvQjKnbDsqziw8cW95WSbRmEfKSI1aOjn9Zeok6q3H5mFJfvnb4FwSA1MX9733RxkMq7WskyR20DU7calVPXmkPjVYfq5lH1vePsEzlrmm66Jx56X9Oq28HFXCyw9m0O0lImF9T1YYUNosvFpVDqZTRJ77gHGBYY0O9Qio3/q/rYfJ4rVYXRcSTfTtS30edgDPwP2H9H9QPQ92Pocg0uz/eaE59u9OFsma6iF+un6Dcwa625WboG3NB0A+IhR62OuMoNfKcGcXqkuRzpIeBj3RXiAcAmgMXgE921jOZTAKP5jDk+wOfMYdBkDoMt5jDYZs4awA5zGOwyh8Eecxh8wZx1gC+ZwyBkDoOIOQyeMCcAeMocBl8xh8HXzGHwDXPuA3zLHAYxcxgkzGGwr+nWMMwtXtBdoLZBVaADU09Y3MPiUFNlyP6OF4b9vUHM/sEgpv6o6faQ+hMvDPVng5j6i0FM/VXTnSH1N14Y6u8GMfUPg5j6TL8Yy2UGv4x8lwoHlF1sPufvifcP28VAuQABAAH//wAPeJy1vQtgHNV1N37PvfPa2d3Z2d3Z2dVqtdr3SqvVStpd7cqSLK9l2RKyZIwQxnaELIztGMsvwJhHDCGGEEgoTl3iUEiJnQKhEFIwNKWUPJqQlBKakjQ1SdP+82xK0iTtl5J+CbHG37mzK1kQ8mj/36fdmbkzc+/M3XvP43fOPfeKUELOPUlfZC4SIFGSriWICOIBBiDAASJQ4QChhB4ghOzyB73eYFESwx1pQ0rGE5ne8hALmsVqMcqYISUKUIkCfXFdj5XqWaeGckOdF7w4nhvORJRjR56+UTj6sdvWDm7ePNg9vWmwDcbGMkPTm+Azm2+++Ylb6BFC6Dnr3JfYD+lPiIb12LH+CffGzbUkYYLArhCBUKAE9hGA/VgpKkwTQaCXEirQ9c1YZSawA78x05aaF0hLOGh4dYdENHBLotEBRVNmGuBPybJMpZQOxqtDMADFVjBL8aLJno3pNEeN2Nl/LAs5qsfYHvXsaU2IGQ+WE9FYBaaNFLwWClmDoXARng+F9rfdZkQS0VQIW4so586d+zn7AXMSD2klXWQVuZBsIwfIO8nh2jU3XH/VBWOrJcVx5eVz7fGYJIhbNl+0sSnk1RXKVvT1OBSQCAijHnBooIgOZc4NogsEJgqzTmAqUGB0VgYgBKbxAGSTBATI+E3vuPaaffM7d1z2tkumJycymWAmiH+GLrZ0VAOGlE0mMtXecqVaKprZZefBxrncOMdGMIHfx17O8vzx+nkHnC+//H4w3ijfOC81zpPLyh9TlXnZBb9xzzaryoJPVsEl0Z/IrrMP//p78BvODi8WwgsvL3vFl+wr0ryiqtbEsjz0Jn6pnrYm37rA353PQjjP/IJtoc+TEKmRjbVJF2CPjMaxC9YRJksyk/YRKoFEOTWKEojzhIiCSIR9RCYSlaU5gifiNBFFYTMmhIl8Opf1m0lDESMdYMggJTIrIdlovRLuzCCYVW+jC7KZVTAE2GuVrLecwV4rZypdsHjRpB9wWl92Ro3XPQaY2utG1Aldzudn15zG3wS8qopyOl2BcuZpSaV08cqaWZjVnNbLquE5ZWpnsOwpzaQOvPBn1vVrZlXF6ZDcsgKVFNyBpQWqCI0rs0jvthxhW5HeFbKHrK0N79wysVogwoBKgZTbmnWBARvlrXBAAryOIgWQHYChmGGUoZihu2bedvFFF4x15BIxv08WzQ6sYUIDs1hJIy15QJLNoGnIGmQTXXiCH94YvdlMVpYSuM+UkX+rmS4oAG+2VVCpNi6WkKcrVfxwwkb2DlYrxWDjYTJeQLk1MHX9FN10aBNEFHm36vS3SaJno1uWJ5vCDlnQjyguvTl4oaRL60xBVNpUj7ILf7kq7la0YLqeV5kMhR0K8x7BZvZEgheKHnnMEARHPbMKswPT04enp6/n9/VooLkoaVJgI4iDbmUioqvy2x2uQVGqRUVNchU9kWYPuGQ7b1M41im7ZGPjsqzOAVFcE2lkDetIlbxBybn/ze6gn0N5M1kbL+RzMSqKUhMIoumjTHBiTwujRBKlA3ZHEIEJi60PKORtcYLik2zmz5pImWbSm2iTxeYObO6AobFsImuWilVs3/phJTZlAcrVKAQznFCLwUpVkivsjnRvbtP1j1z+wZv8oZu3D8z4/J5QaNVUJp/ON4185qC4Z/zC3pWVwECZ7q9kgxe8//YdNXoRnYR1FSa5tw/TAG3aMJe7eIcYMNbvhhWuWC0l4e/D7dwD7BhrIQz5yEl00oS6Yrw2ymvOgMzidSqiZOTcJaGsVF0Kk2RZmrYTkrzZ6UDmkyd83mhLpNkMeJt8TV6fl//pbs558d740lYuGol00dSgQCtBfsKOnb2V3WQ9ufAVWoALefrsrQcPQshM0Gh3jKaeO3iQPn7QevKg9acHrCN9V12VyKcgUYhV+66q982/06/S20mKRGvNiSZdFrDVRxlw/col+S4jYhiCGEL1irSOJC7zXaa8CrJ8V0EarvKdibeDJv2qZ0LP6w8+iLsJnR/18+cez4MPeg6aPPHQQ55fzegp8AwNOXacfh5bsocUah2FTDoU8GhuBZgLhRkdFZA/GScMOEB5FXNtyUTca4hisAO8XF/0JgNcSnkdKJ1krj+yDpCQBTOVql3jhjJpwRobzIdi5RgXLLAaP0cSokxl0brZull2i0mBivD7vm7/HShlFfVGCdqsn2HWM2ewBzygWD+HVLuI1Rm2PoVZ2yVNhA0ez1V7uVj+7i5Br9M/CqJB+DFiiGDN4NWGUbvyHL/0GpTLlEbjZupaig6orzsjzted+JbXNBP+RsM0fiOmWe+zJ2mQTRGDlGrdeC7h85BfDnJSRBU9JyJHUZgSuQzdJKAcpeNJTk3+uM012DZSC5TkpBc/vVyMl4o0eGl34kHz7sfuvvvQ5VNs/R+0te15yNoMjzx04+6rG+9kO1CO9pKWWrg3nwx7FekNP6Q9M0DFQAdKLQ9o0AVLiluutzwSTAG4LrCbn+vqFqQcLvdQiLKBsKYlPf1NH8i1jLbk4Z5wv5bStOZ77gnrnpSnr/meXHS0JfeBcJ+e9OhN94Ci9YdXYplLHmvJQT7y2CV4dSUW2rTp190ggv0bTrEC6gIvaUcdua62phfp2YFSntBR4pAcBxQuwg8QmckohxCkTfPORQzHyBzHbZs5bptYOZgsJRPF9IqQT0UMky5nNBpFUb54XIYxgqUoB2/272WoGRqtku3FXZ17TPqiETVoKBz6PSPmo2YktC5mnv1iMAox8yeuSvJYouL+iRn7hCN0zPAcQ9o7FvR7X1ej6uu+FtSEvphPCLsWE3c+ZcZiJu6gta2tNQpTZkPb5rGI+rqXk6KI7dDPHmXvIm3IX8NkPZkmt9RualapgH2jYq+6VdSJAqBGRMQgqSCp88Thlt0OeZ8HVOJ2qO45FHWKS1bmuIx3ii7nHOPUhu1DXWMaiCKX1sRNLpicGFmTa79o48T05PTY6Jr1I+trq/qr5WKhs70n1xNKltoMr9jUAWbAwAbvLfuqvXbjoM4sFaOAYDAgB8wgbytOKBK2pZ4RJN30Y4vWseJKKONNOVs0fQhQfBV/sVIAjZrs0outHyEj/+g/TtNSIEYjwZcDUZrwl+FDV0vNHlRDWli0Dn3wzBnrK2fOfHF3IBYLfAh3uRiU3/UJ+qz1nPD0rfP30RP/eILeR5uuveez1k8omJ95GlQ/sFIsh13UloASMO9eR9gTzXvC4sK7z0DhDP2K9aWvwANRfFLU/JAZjZp/9IxlPfMM0GcWPnvfGfuRtpz7GnuVfg9tnBSnxSSil1QTRUAt0NEEwFrkLeyTuuJAkD0nAUONMoUHxpuXkQlC4rGgiQ8IGOleGeVfuneR+nq9XJZwKZX0QkKSy0NiqVcE+pMdUWPBZ0QjJsRiFZd6lPY9fO801SODG2+fggnr6cG+qeeMKJJkBmmxqLmsIZiZukuJTI/PDBc+9Lp1lizKg1fRPouQeC3qtWUaYjaUBYxLZCDBgNtJIhAR0KQRE1lkfmbr4igNon2GXYdoEmWb03rQo+YS4btvSowNFfxGvrYuedPdt1gPqReqsNGjViob0+94L4RyiYCRagvDXT+7xXpStd//C+ZDeZQk7bVMHTLg2w+KdhNxrsUmQuWAbZQspZFduYVoGwfJJcG0HMhydRAMcCb1xcxXY+Y8stCrNg++Gg3OY4Kf/Dm/+gMTrwZ+0LjK2e3VGIFz51DGD8DfoIz31rQloRgocumetm0SLv3qDD9geCyXx6Aum43Vx1DCIxrmDOokvFv5b9uKOL5uo1Vr5TbESgoSDOq+RVrgoALNrbk3w6NML35Ktj28zPThpg57k2nElospfr7F0M/+uy0umNeDVfr1ZztG7aS9B32M199j70Eb1Ux+A9OkQSefofeyEdRVqPvgjbovGOSt46Cmrf2yqP3q6tk06N3WK9CuqpehFrS2O53wALbUZSp91Pqa9YqdVOHDeIQHnM7L1GjjPYcW3+N443siPvs9DQ1bdUAduQT5i/bg4yPOy/AVbdbX7IfhQ1W40rq8/nZoh7Z6Bp6RNGyKup3lRupDDWwix3Lq52YDYfuwh4CIaH5wL8EUYYwbU0yYaC97k4Zu02GpnMmyOFr5gVKwlPY2+slbrvrRVMKuCPqRSJ6gcNi69jDQJ3qfgosb7a+9W4xq8GUtKr5bg3605iBg/RuadPNvs/7T7hNwJxJQ1gzweayXEqRBT4fZSdsGMkiB1ziDNW7L+hgVOOGgsOeuiuV+FdsIgl2RZGfIJ6J4XlRt6cU2RDWfrhs9Gc7V3GrxQCBYseX0mYZCg13WrYF+cyAQgCPmNPyhu/nohbuPH98dW9fkcPzxXppbH/eoS0rsv6xbDWOlMWDCker0P5vp9bNw/OX3U2wynzx70yBt6jTURZq6EuXm50iGRGpNzXZfu4GMLPV3KpG0oYihobGatW0ypPJMhWtcRCB0FbfFykOUKxj26u3fvyOb2/8HzSlVwwahzCW4DdnQZc/mHbDxtud23PH922H28gfnhMszigAuFdDEZB5RM5VIxJ8rHp++4La5vrkHUSGSc3uYjl3OrQAP8ZMgaUYORsnu97gZNvVotDncFDQDPq+DrEV6EQgHGSIy9yzSDoMp/CVsk8TR7TghTtWh4KNkBG5csge8QRb3lrzpeCC+CkQ5XRVlwI1V/bIftwkGP7tw4Sdwh3U9KHCnYt0VhCMh66U8THU+uvb764LTq6dPwCmwnoQN1uXfuPieSzKX/P3U/BSUL3jpAvjDovXpIjynWe/QFmnmBdZJf4a/IYaY72RN1bBaXqQbOrr+CXPj5lqRyyOgO50gI7tRmXBRxBCaX04EFURJEOeIpCjSNJEkZTNRJGWiuVbihVBw7ftvlNpSiyfiTSEg+Y54b6K3JRKKNcV0j9spiwIjQQi6uNcsIQVKZZTfXKglsoFS7xDCzAKwhGSgqV7OsIZpLS1Z5Wh4wwc2TB1t0dyJlNNxtLsnN15o7ewcKhRa92+bqfT1VWa2/fPsTKVarczM0j3TF/ZHoslWuLHkWlvtHm+35gurCoWhLhrr661n5CVm/3nbTG+fLSfOLaCO3IZ8FyAJ0l3rlBGJo1Ra5magSK+UMTqNsIlt5hh+IhAMGgZnOSgjoyU8aGbhTjJQKhZROgaRphMFOgRIuvRv1RKKpu/djLuSqr6oco+KetfVX3j1hf3Sjc+99uzN8IyuFp3O797sdBbVVsyhYob11z5/6NDzP+Q7ws5999wJoZVliMtGIRXsIaRLJEnuC2JotiLoQIFHp/FAuYqhZALbK94c9nndAS0QKHKXSNrkmiSb4eI7yHhzJ6Qo+Cu8B6Rgve4V9s3a7psWjt1c6q1B79CZVX+SKBRGumn+BrE8UQFpTNTZ+LPzf3HZzDyF+fmFY3ize6QAt7r9mTLtS3m9px2O03a7Wkig76e3IIpPklQt/gafDWXTKHI5EGV0IrgiWOK2qz9T5XYV7/yGnSVWAt4lnBQUsX7RmEBDbEPGp+ja6U/o/b5PnGYjRkI/+y09YcAtvj4fHUdTMaYp0tx2Vd0+N6sa1vv1WEyHg4b6gqou8s2z7F52AeKiATJDHq6F+8EhXjpKieB3UpDZ6KYO6lgnUZmuW/+EinxUISJzCOJOAjLyxk4U0kxU2BxxECI7uNVBZBDkywmVJJtOpM1EohLyUh8vyETHPl4SaWvf71p0S03bsjkYjLQFUUYbdQuG05qMgKYVUBkhVOlqkBxKzEVCbNBgtkA5YLA9Vq14d8lyrWYXPQN1HS4H7SPr1A/pBd1E253GTEXTBNOvX+Pp1Kd06zrPNWj/T+n6IU8BxZsqRIMOTXYKiuqD17qnCu8pXFPo6el+T9ehrq6prtu7ls4eC3oO6T6T6ZIHKy2ogukteA55PBfp8GFTv0b3THny+FB8pqY5ELQhfGIOp9e6e7jroq7ua7re093Tg4+5vTBV6DpUuKN+1tDtH2bvZy2oKVvJ5tolMoAIowogjKZ0HYdcQFHFc4klzKNFuF9GdSSJRJpTMCOI03gQYTPBkwkzAKQ5HGg1WzW3C6W5JBADDEfdx2+rJjmQxE+8F7ifyjZbsijHDJPecM2D9OThSFA8eADl9bT44CHuzmkKxRKs5cHvPyji9au+BdPBlms+Yp2OFSM0EQhxZe/D+n+dFeh3Uf8YJIRUGEOubiOdaOlVSD8ZImvIGFp8G8hFaPXtrV2JJtnw6trQysH+FX2VUk93V2c+15bNpJKJWGs00hxGbWX40/jLRp1AVFlC7AmIb2YdChUpFaf4UaSbCJ6NA5m++KKNGybXj69bi4ac1+lQUEQTD2iu+m/mfmKEPUmOGUpiNikH5WA1W8XNTuBXxm9WboUqv4BbaRXNyqugvgW7AIukq0k/gia55K8mGfiam33Se6zx253+cNgPY/7DvslDTYMbYpMbNuybmJjsnJyc3Dc5OXF3hze8oXVyckPrxIpMfwyvPtnknTjk7p2YaPVf65u0bmvr3u1dD/r8JVepA/S74Ux4YSN9Ag/zXu+Gp981OIllJvY2nta5YWJiIndJ84bXMdE62d8fm9iwIXeLd/KpWmliw19iiWrbwv+67Mor6coulFc/P/cJ9iOmYG8kyXV/FrXVwPonnMj87QRl0gFsRAmkA9xtAwfQ4EP5dQWxTT0UZWQLFyuTzbW2t86LcO1NWbfUvC0tLcmWpNfvTfi9ZkUVIx3pul+GSzzbJ1+Sufs5zp3P2VJWTJcQWrAXfD4pIqTMsy+bKSGi5h7Y/uhpRWiDfJsinH50e7d11jr78Ke+oOZ99xnhsHFfd2jvUWX/fuXomddeA4ImELNl86toltTpjusTVOIy4ksizNq+FDbFjTNA4wzPJtLpeDzdlkaSi6fiKSObCzlQXnsz1XQlaHogjjqlguJZZiirecVR2GACaSZeLeFGVdjd4nI2fZce/16TU2uBPU7arDRZf90k9WR7i1LYeqFZyPpB6PjndmAGHHW7nnU2x127d+stzc5nXe5zJEpD32wKfStMI9/5JP4R1ISLtiV7E5JLojVWIlXymdonU81J1uQEB2tyzEbFFgT5CAsZnVVBCUPIrYRmiWy65Sli+ok5lQgGWgU38YPbPxsB8HGXHZmNe2MeQXK5pKl6SnJtMnSNuSTXeLnc3Z1KxWKRSCikKIJASLmKiKW3u9RdKvakulJdhc58R64d2y0dS8aSiXikNdIabQk1h+oQ0/D7vLoH5Y7iVFD0CLIgo5RihHnTiIyrgWSvH7c4blDq5U7ApIgb88a9gNdKjfsonbwlxFKA1/nnzOjoKLw2ZrlewT94/MyZY9b99NaxV8bGXhkdPTNq3W/dz3zW/X+HuR4fw7+Fz5/hf/w67LS+M8qLR8+MnoGdPId1HxoIuDX05ufYq6yGEqxKriK7azvnAZyI6qEdxYzUgxJ8U5YyQRwlTnAeIBLCE0lEWwvxMwpiZIODKoBsN+ycA2EqE6bxILDNCkpqNrF/354r37Z5auNwbeVgudTdVQpUQi6kNJDkbIEtepEGoFjXZ/Ywl9QFBTFbqUYF20XAlZn3/F2N++w1ikxFlxUfolVuYohLJeBQosNQouGCeRP3Cd/0Pvol8SnRo3ZHo+GsuxBqC6fc8Q6XHg3nQ8dUTT4t2rePNedjYZevSQ+lfO3BynCmXro5lzJ0bzjiSqUKlVpbvQBdV97ZrmfCLmo7qRc+r+AjXNI8YiFQVdPMGOUdTdGcYVC8K54W4UeNDHoi0ZxYmS6OBLrCIRPs0r5Yqim5cihc684nXKxewO4fm68Po1ZpIXmyplZLYJfAqMTHOJCw7KFDKgpzNsil0zL3QG/mCNdWg7m2dCrcFGgxW5wqV4KKrRCizNBYosDKQ8xfB42GWTXRBDYkW0UUNYDXZh49uKmtbdPBR59ZTMzMHD36zNGjM0p/ThieqdUKmqLTw8XxjUORwanxYnF8ajAytHG8aPluPn0zfs8oLlXLDw1tHSp0L9rv9Fbkbxl5OlfLiox7VtAa2YcYaT8RAOxBel59ASaS/nTFb5vt/ngvmsEQFM8b7JWg3c+mzF1HT0HL9OFpgJdj5sIPbN+R956XTlAfJh/aOzBNN648ZX3K9h7BMGKSvbvuuWfX3ijqh3NoN55ibsRvcVKsdbWiTc6tLTpq0zV3XIPADSUUm9zTwy0FYBPBJDJ53VJAlG1guyF242OQSW4gCFEaRAhm0luPv3wcvxDN9xuf3vGOjcd31+jg3rsfvHvvIKz9dACOvv04PfHivdJd1n0tucCn1w7tef9H7t7fLwzvOjH5jh2fDti8uYc9zy5GyRgmw+TdNRfhIQ2jbc1IYIhiNVRkBRkRD6Kendi+QK7AnyIwxfZSgchg7lfRa9cbCtD531ZiS83VmvC1md6k3+dAyCqWuQ+vnEC0VC2m4xlvuUCRJwO6yFEGJyDu3+sdEqrlSpUHhXAPsxxF2ooyWHDEu8HX3+aw7qJnPhAuT+2dKofpw7mW17EDX2/JRQrdKR+97Uoxlo+Je46CmejunlO64w5Hez/8ySPQHhnsSyT6BiPWK4+05AampwdyLaHi9Owdk9PHddUZjCIec6r68ekNt89NlfkYIe9joQu1tJcU0TIYIZt43EVt74UadjGMesHhdBwgKKsP6KBQ5YDH1uwy1H1J+1wq5bEX0jxBECnVkadWd3VqtqvTbbs6Zy/bumXT9NTG9eMXIK5bNdS/oilgNCFgius+bDOoOz7L3O9RLVYRaULDBcidw8UompV8eLoYFYJQZ8GiiYkCDFFT5K7TTBZNOj7KijxazC5lWb+1f31nDdYKueF4Js3orVNrrNDIRhBceizTH5dShbGN65radSXRl4npGix8gY84I6vcaYfZPH0jrBkqrF+xtZMhHBhpE9aONu7PspF8/vNmGNwBfYP1tuENG4ajfcN95YwZioSpqYdVambKfcMReqw+im39+5ab6Y2fuF667e87CjDCVm/QA+5QCBq36/EAdND2hYVIppbk3ggCDc6325MsOdeDQb+PW49Ql0zFStXgkTnYXCxjcz08Xq/n3b4vOlKZjPyS75EfPQI/rr9rYGXW2ugzTR88kV15+JFHbD76BOo4/uYYIvJH/yyNvc6RIA8qGpCQDmQRe3yfC3tdFsm8AESRiTKPmMLpVK7AiqJUlefc4HQ4nFN4cDq2EKQbxIaDv7m0rDjnf33xLbVoHI3oeGccMUV7BqF/S3MYKxnypXoTXo1LmEDcj9qNazawPeVmsFQMojxkMiK0Dkj4e+NoWyMp9WbjAXjB6lOFuZN6IKj5Iv9f2HD5cifnBNXqfzACqYgWuTdyAj4uCdL0gm+rCh+HdTsgtTfc3hl2aaHYxr3WP+2A7ZVKeOG9OzZvmJ5+eEd9zOpJtsXuNy9KoWmyj1xRm/MBmiOjRKWyrO4kbqdGJdFdD2MhdR85Ck3bxYRAkc4hdpZdLnmaH2XXFuKSXZOx5j07Z7dMXWRbQIiwmqdjF/sN/Pg83FO7GOtRbbBBtR5SVjTTCfzZGvBQDY2aEn4MHrGBsr5oVvAzBDzsY4hmKvgp29EfBSQdCezoDimBZ9mMzvNUYlgIBfVirMf6Wz5xlN787JFV0XyExtoS1veF7IAxUvBGci5JESj/k1RXLqJ3D+cm1PF8reyO5NXzt5y5Fr2wLrMRHmXiLdcUreKhW0SGyUM9QHoO3SyxxZiPgbfxF91Mj743EI3motFdgqQ4+XNHMhuljZmRUFsk55RUgf8pVH3LW9ZHbumxny/dfK39/MW0Te/H2b0sZ/dZkFxQW8dxqUAFGJW5I5EJdJ/I8YNAbDcTxw3Sedzg86kOIL6gL6i5HV7Vi1BPAaWOHIiOLKQTPx8MjPHBwEBQznrhpU+BZv3Uus36KWifOvGVr1hnvvrVZ04UH2W5xatwBLSzL30VcvZNuvc1vAs+Pn7TwPwbSLIWK3I4gESDGrjuo2sEGw7X4rEMQwCdNmyvMkrTLpqxu5L3MNonHKXboT1Bs04ONGAgUrRpoxfPbbdJFWFisMidLchJzOeSnCvKJU/UGx6odIze19HsVxHzywxaWiNat0cRVENXDZnqSiwTRTQLWm7/BPhEpySr0WjMJeshOpdl9AFPtxaJRQRRCRjN+XvHOiqRoO6LaZ5yeYVTclGWbTWiHhrSFWcsGlVFxclMmNyfc1FUuLFUAhBGVfwqwg20eYiNSabewgbiFtCAHTl4DXmgdv/qNG3xXdCZYv4WOhqDaBh8LVHfXLyVtvgdLdPN4G8KuplD8Tu2hUwXUwJemYmCIs4ausQEjxNBDUKuWU2ljEQiZMpOkMhmtJYjE1cf3Lfn7buumLvsbZsunpxYO7JqaOXgQJ1Ryz1d7Qi847FWHjUTbgo1rJ7Gn55AhYfoLMm37LIjvOnIENThc3gokVktFSuwLH+1cS/YuFc97zNEcbgURbI4gGijwNFTpz5/+vTnF/dw/1NPnTl9Gj526tSZp5563iWl7OA9vr/fvnTm1CmfqiTt8L6kor6Sj5z9SUsu1zJWTqfS5TOVVDJdgdGW3IWnTp1KnT59OnVq4flTr/Nd6jR0n7KfdoqXtjJ479Sp+WWX8gu9/FH0iy25SrpcTlfq+5wds3ScPY68yfu0DRF9NymTu2p3ogZxEIeI4hXNRqei7jNAdTtV9zxxe5xuzzwa8JpLA9c+IvnBIUqOWcGHStWpEOecFzw6cphHmyUuSl1TxOXiniEXHY+jIQsEcUdPd8NwTadibfG2utHa6Dufm494SKQZmgN1f1HAjixEMz+51OQltFlLgTS3UxctBn88Gw+izco3tj3a2RmdSCxMNk/FOzvjcwnqSSz8FP5m4QvBWDwfi11Cq11W5Gvve98X3vc+Wi7ErOOthT/8w84Y7I93Xvuud13719Y/Qcp6R6wjhl9r/KfvSiaTjZiJX7DvoXyQkBdWkCEyBnItUBsa0LniJUKZB4mMrkaDoeHW7Sbc6SEL+wg3KMhOZCQUc8KcgieSCNI2wv1nPNaS+6pFOtG86BGq55fhdygQ/B+9qNazvIjAg5N/W5ktW7bUTEJG1qwc7Cm0Z6LNph9bQjIcXBZWs0j4Ads3YyJ+9C8LQKjGi0HueJKyGbwkyV7DDMaLFTSWMaPJgpDsBTnbCCCD/6hdUuuFgMPxvMOHW2p2jdW9ZnZ2DbycjDqY3KyobpfVnS7zYM+X02UxpYSqp6w7T9EDpVMlPa9fon9y9SWrWytwfPER1qf21B8wPAua4JciisDK6cYz1sn4BAWOnbTuPAmF8qmyx3OJnrf11pPMj31tkByi9MnaeHsSbemLUD9pqBbyiMSF0UaoImFUQOO3Pqo1h0BfQmyCh80y5pImOjo6tnVsWYeCq629Gld4GB2iZ8TQBSGZQInDhQ7jeJpm0X7JJmTD5FeNOnhgmWqvzrNmK6lq0eQh7TzeEa0YmR8SGTkhQ6U9/ZWgJ5Mp52JtOqrVYKYwUkEjs38oE+mUAKy/B8cGQ0AbSkBWNKLhCKNV0C5wF93Z8XXFmC9cSLVsOgRtta0z5abtTQMHwfeXtXQo4VPR9hpomQmU4YSgpWpd2X4OeCIHWzqjWthivVRTZN3UImKKpkIimmtCAXgQuJbIj2dbitGErhn7L+7bWkENI4C0OHb7JB3Atu0nfbVeHZuz0OFCxE1Hm3jACyawReto/E2BDSt6y93bo4JodgSqdS9LxbcSsNGqSGEom1ehdcORFfdyyhL1UCmAMFWSE1xLJxHVyqorn/LoaAL1uxN5VV3TPdba3NdWoYp3oyEykQrUM4JUI4BjlspSSNKHPZOZSGlDt6C6ZH/6Iw9AwtAUidJ+gY8zCWYEGUB1B9WoY8p6uXBxwVRV5gm1Ug7B+TjVL859nF3BCqQdbb7WWsTlpGj4NWJa6yPV3V35jqYgQ3GXjgJ3JkkZ7umWFkeqByA4JATtoUtEEX6zIfNoqyQYUs19fyysth3dE4m6Wv2KqZmpYHlUzRy6/tGNCva22je3I6WZtXy+lv9Rcagv1CaNuGKR/be1uSKxC3v0zhYtLGnF6zcPuSRBnfoYPghcZqFWKNQWx7I+zrYyDblgJbmIzNUu60crc/3gAAK2C0AW2Og4yCMI27DxgA+KEJGReZQpCL/nHdjhKElElCmCLAvTeBDkzUQW5IlVQ/mOsXVDF626qFzqWJlf2ZoIt6nczuKGRaA+aM8hVbW3Uq2gRsUvdjGPZjF4QwSxFRhyDDIMMoERlKumH21XOw5Ytk19SjPyLAPfUDg2Xt2Yawea1TyCS3QqghjJAPNnWntlLT8/enS2r2/26N23zFVgTf49m3dv+tDBEVo7dO/mvdt+MDE4fPV9SFgilXyFaLJpamiwWyxmXFRyOyeYK4c/uj0ZbRYq1tf7Zm6767aZflqZu2XsqpmjHf2Mjew/+fDJvWO0d/13rji86b5DQ4s+tHvhpYYN01+rIspDi4XT+HQjSWCzyDj4nPDb8Ddo+sL+8HIAzMeP/HwshRvf8V9J7C/UajO1GtxVqA1vHraP9vlLta3Dw1try/e8OufOnns/u4/lsU5+pNPttW0uYDSZCAUFUUb4K0uiJNt+VkkU5hUgDkB4RrlpxScUzKlgu8vwsOgvCxi83plULNrcZLQH2nXN4Vf99bo7uV6vEB8PrSTBhBSQsHMRyjGEVlnkU6R6jsSC2Os81O8LnwJdsv4LkftPJHD9NFegiVim8HR0b9nXHdLUXLg7erhPL5suVyrMctT6eT2niiDfd6I7HInlY/0LHy+XQ6nMybn+QjiRuHc3acSO8fiRVj563KSgyAHb1cZHUtj56JdAb2/Ktv+9Bof6dkjr+ci6evwqB/rsVVOWPeq3Z4et62xtc+fw7LdVjyyb9O6Fk0EHU789Y1+/g+9nvq1StRFHhB1wjD5OVBIgnbWcwH04B1DxU3bgDeaQPdgz4fP6vbjpfDKGP47QKNtbrGSTcD7pgwuff9/MbfBNHgneSD1unb7reThwdBY2LKbsfv/5udvYq2zYnteU4f7cdCoZj3GxYYcyreV4hhwQAaUinxrBmDAl2f50His00dqqe1ozrZlQwBPVWxK6PS8imZXtyGJmj9746/htqcGgN+tB0RZgm3ccOfN0eWKvGqOPpLSXddPUF/J8Tz809vDR985Q6cSJDeWT0JbRfq4mrLtCutWmh0I6fE0PWYMfOTl426NnNtny9X+f+w77BvPZMSrcl8NFK6tPP+LRqA3F0RSqh4x0CfXwZB4NhFuUG+7cHYaaNsUWwSTbMtbvC+sT05mor0jpyDNHnv2KqnzmekiMRfP5oXye7u8+Mi0JESVX6B/TwuPjL77/8A8T0wvvzddyuVrebttfnttNP422k4Q1K3I+97mpIDLb0TnKxaTAxDmbBwSKvYE1neK6cTNXCxPFnkw66E14JaS8IKJdKStV4yjrsJ4xrgYYcGeDxEffqRksVRqaIpuJfRnC68bWfcn66dh0TVI+BlOPqkJbbbjbul1QBI06nNSptW4OTYU2NwUErxsVtm7179+9O0fpl8bu2Hr72PUf+9j1g3s2Te+Fp4WYEpU8fsHjz9+4dfZwskVuMc2E7/mGXngF6fZfSBNyUJq3PCedaEtzGOUDD8WCEcbN5wN8Es8ub9gbsLloSKh6E1zH8QEXLw8EFb1m0JsBL+LCCrwsGuMzH5nd9pHZdS6Ud5iemz05t85tffpj8/vhtUf276XXilomZsLC9lA0o6ouJZUwKH0gFE05ndaQtgL+qt+agM9q/daqFYtx9+whei9yV0st7KnHBL5B/RpBg/FJA/bUpuxS7EI9gIE9pFsxRJXWDxtzFWC/PVmBIqlaMY8HzPrchYfgAJ+8YLfLQeE7bBJtqk7UmA/UY6bWeRwURtY/EeIxUyqgRJUQpAtoVgvyHJKIIkrK5U5EDMwh8tgNAMc0cTjsAVIH8Jgpu5BMpH2/e6kttdYWtLgGV5R72tKJWKSzpbPJ9OoutW5fNcbjg/ZkiQAPCq3KvfUBDS7YArZFW+XDHXhPwmym6C3bCJ6nEdRXhHWrt8JMrfdD1tzqGfgj+4RetXrm7E+/PFGBi2OBhWOBGETZa1Fz4U9i3RAL0KsCMfrE1mHrHsz8oQ/N1HBbDfOrZ2ZWW3M/rExAyR4asT5gRq+EvYFYd6v1cf4Iu12vFD7LLrLjYfM8kgo5CBnqPE5Ecpuzwy2nz4dblsq9vb2lxbBfPl7Dh+jsKZTeN8pxsf7TDD6/siL8Vcj/yw94w2GvMO8L58O+X/7YFw77BL8vbL2ciVg3NGcyzfCe5jaWudUXgrD3VsxrfWrhw7wIvRzzPoo5KplMnf7gNXqcoNX4lCpCZwfYYc/2i4PwfU2zpkOJRAiuV6Oq9V+6EaU0auhLuoH66HM2VkjWYohOGWcpLtd2cQW7HBLUp42itE3gk+OLCXhm69PW2a1P0+dqC18YHqb9tcVjXQf+K/sEbUcbp6lmupfFb9f5wsf5wrGMK4KORlgPe8zazuu7vREs28bjY10zTjhmXeF0wh85o+oM8uPX8LJzhkfM1vnwE3Rd/V32jNhRsjS/KGjY70pzn+hSiG4jOpc9NoOPs75mfa0Ro/sAj8h9wDk/o6rQbr2iqvw+PKCqjeDc+rt88GOklVAt8GYbordkT7Z50xxSHvK9sNUesKMPL4Z51+O7Y2/Q0xJxk1W1QSdqaBfqSe65AjaKJg8P5hzhsfo8OmjWfiuP5SSb+FvHZVl2y26fofMJSul4IFsNxNO98d6g3MuOLWz/5jfpA2dvpQ9885vvPPDIRw9+8+CBhx/hvaAs+U89KFGypEqGyQZyGbmSvKt2cyom4btmujPRkMpdhZOFsI+KErlksMIEcffo2qE+JHo+XG5XkuxT7KFxPoDEUfk8chDwgXOBR4jNE1neT2zAQTjecNh4gwuQt++8dNPE+oH+Uk8yHsm2ZIkHPCoHoAk5k61U0b4KGGhjZWR731vmV8C+h8AIr/jrI0aYs1Tk94J8vqMkV7hkkeqP4DfssTl+jldWQoXZdgDHXNnKt0yjO18ZnxmUhKGKvt8YNIaLmYICGyNmf9/0huv3T2wK7zl5VNAyg+GoFppt0w9n9P5i4XqJnvjU1VtHXCOSFjXvhrkTQm04VOveoe4Iaz6qbdrbX9kPP1fLE+P5TF7XJb27T9ieCF99eM/R/XNDxRB0a7lIdEhLha1yaLOhhiL5gqHsvU07oRUE7fim7qKamph7IjX+/qNU2w5fueMlM++T+oTjhw1TzS38SFV8iY21nOskJx8+9+iTbJ6es/k5Qa4lN9QObwdFvmyaEuXAcH9vLi1JEOERsKOtII7wsRtZ2ekGwQEy2gazLupEcAp8FHBOQ8tcFKVpfpTEzUSUxIlk0rANhuS1yWt3XHHppg2TgwPNTb6EkVguKTz1UNl6SGxpMeFH6YdCA+VftpWioGe8Y2yDGj88WLYLbMPL7iA8sWNn+Ugh7oJ2TCW/UKpgFp4BLXIzaE9o5f0o20+Bp3yhpmRT0+31w18sfDlZLCbh62ZvcWvxeU0LGZpTNiKxlt5qtNXj8cqq5gtFYs0Bn9shOxS3w+VojiKgFOIthu5qKuaZ2NG+ts/p8TfHJG/AjDZjDreCed2+QDOcas40L31htpRc+NtUcbJY2Eh/lCwtfMury/yJbpdLcqiiW3SoDqfDLSdAVdyqUy30ZLLNTX7D6WAgqprqcriCmBIcrZhNUxGhO5yGv6k5m+kpYHa3sojnuV2BuC9LVpGJ2gVt2Fte5KRqAUF0HMvzWa4g8UB7FOfcqOIBtvONWT5zbx5+7G9O91bSpfqUvTe41NDysM+X+9NsB7Tfa/Cpd0tSNNuYT8h8S660O2VVla3rlpxoqpJS1DNmxLndukfUhRpS4d7tfN5hi8eAidNL3jM735Lr7LSCAvgfre/ySSxYUJJqomYXtGco1mXX8/Z43cVkK9lGdqDU2k+uIdeTPbW3p6LNATQXd7rR5NoDsjQKoizwCWcUBK7TuRCdJ0wCxsUVKkwuoESQudQS93OMye1lWELMQK65+qqD60b6qj3d+Y6WCLkYLq5HWda9BhLX/NkhIYuCKJtBas0k5AKVJS68oizI3UYJPojTBTxqmY/U4EYrpSrKNtQUBeDRAwyLypIZrGR+ZVctS0aliokKPH7oC1c/+C6P1hIr9iXCNB9o0gcDgfL+XiVa8zQZ+VCirxshvSucSWjOmMvpUqjCBFdIkuREW8blBl1714OHPnsPinIKqiE4ZdWQVFWNCG6HOw1ewZvx+2Pgoz7mPPT8tXd9q4Np6uFKE9Oi+bHuNd2lVaKpuT0eyReWVpW613SNFSI6NTKiFAr6TAaCKjEmRTV3IKxQVoxQVWMd37rr2ucPLdwrYLsLkoc5JVdA0GTNENxI+ZLoklBJuMEpM63uwzv3i3NPshDazwbXsRqPnlk22aYva+tYU14ym5FsIcPpkHkcXuvHtrF8TLV+7POH6ItB+riJF63tQZU5jzn5fDW/N784T3GPzU+tKDHTpEQGycHaviRqsRZwkGyMyiKfuoJqmUmzLqQHh0gcfLIc6j2Z21eqIqhzSIvUqVA+7g1QH/fmdOOEiXIZSHmwPDiwotLb3VXIt7elU4l4OKjhryZIAtoylGzDhUbMz9IoeKBS8kAJ5FKw2lufVuZFzFwBb9KeaOZlp21QYQcDWV/Gnal/z1Mx+VSyTHz0ox+17v/oR/c9cSYa/AFETZp5JRp8lR5ZwiIn0dS5zqx4vqebMfPPg9d9FG766Gef+AGff2bdf8ysWBvora8iUrHuq89B/yr7Af1XW7/ESY70k3GyrTYzMjjAVGc5TxVHs58boaOIRlXJqc7yNR8YX/PBQRTqUJZNKBM5ZqoPoc+ex05j62qr+ippfyBo8tFxF1+8gw+K88ia3qVQkAa04gLJXp5j+Y3kcgz+Jkx+Zmjr0NKX+VRlYSsPeKMPy66zP36rq7D8pJav0cGZQVr7aaf9COvflq+jQRYv7uWyj+/APL+Eht12e9gP0G5rRattEhHWPnITDdaqW7dcwgzPdfupZhwAt9aNivjtXTmm+kYjlImrWjTmFCSESjyOyTG6DdSgHyXauvVPuNDUu4J4DM+BAKg+r0NFe485mbATKRGbeCcxNLcxbepU84Nb0dyz2GuyT0Ga9RGvw+flfSKJDmkb2jQim+buZCcVnbNvhrPN659I46t2/LpXOflKH//33pXDd+08/y6f6t33/+pltV1v9R7nvv/bL+LjWvkNG2Kxd9xwzdXzV15x+YbLNlw287apizZeuP6CNcOxlbGVgwOpZtPrC/mTiSAfUubzI7LVut9SztowqDchZe2oWTkK/kDSXoKoWuajM1keCmDaIQClXnEZc5TstWvs2fcoOyQ5Wy0FxN/CI/8wlB9MtUZiemhAE7SQqjpSjoFneyMJeFGIJNpQy7ubjC53JdbWlylkYJRNvpGN/nIQQAy2TQywDb+WkyqdRUj3NOl6UmiVfK1uBZVy9JKe1VIOhrcYakshGgq5NR1i8Uis0BYphKOexOkGsymqC/6jr29NZxC1Vm702197a36jS7E8M2QvbF3/hAPpqqmsIx95gYiFTiqQXbNUdQijKwDWNtfHU+0M9C0z/IbCW7bUH18gDkVVHDuJqu7n8zPFaYny2TiIqQXuOxAUxY755FPOBGWi8c7S8lI85JGLRSpyr2y9KH3Lor7/wQtrXfUC6r7fsQSn3BYge3Zvn7v4IpTMvaWeWNTweWSJkRmY4R4eP0J120GNJlalWqzKQVTHshRoIHP7qv3h07RQTWczHkA6DJrVuvnFP4g0eV77hA/M8HEZjqYyCIpsrwlmsP0mCOmo7Em0jPu7Cqu9rV6AeCrulEFhTUaip2eguzXUrBoOl6AIlKn+UJ8CXVd3rFEZbTLbmQKiwlyKJ9Ceu+Giy25b43Y4NPq6qpz9IidM1quo9AxADzCBrwyktIuaPHzyj9Z2xP1hXUXLujXWfmm+b2NPPO0yUCJ3S1RBBCK4ETwyxeNxSs6v7FuZC6fireny9JrOS5+9UjPO/nuKPzxl0+S5c+f+gQ6i/tRIC/e3NFbpWL4KTWNGdznzhuVQMnVFl7VZd9kU7zcu4PHGCd//6VH5ch5q1ADzBc00I/bqHmrDt/oS24J2IiN83G28Nprg84pGZQcFRcRm2ich1YnkIFfXClfXvOmmiaJwO1ARJwhpz8ZjkWbT8OpuDmR4zL8qBjr83qS3Wl+pyVbIeIo9iDYEmn5JtCCypUASxVbR/Nwzz/cXoNDXP9NH3/fnhe5kwS09A/AMOEOZwcS2Q/CzhVdo+2PtlcpUpWLVrM9B28BwpsUbsb74zfc+1LzRF47pcDPit6X5j34SQfxWIWvIcG1Vi8Hj0ke5gGYOaU7kAU1LM9llTumyosjTRJY5pcvKxOpa0IYcTU311TY0HkuXQdTBY+14sBWfiowwox6kin3Ab9WjgaMMf9HyGZM3BA7efbUhaJGwoE3MjnuESFi3vp/rz9O2oQzEcoNtNN9X+L3+2dvvvgPxRN/cbcePbq9csGxK5etrpunGtVrY4dLzfX15j6aG/yWaswtGGsfH+IRgXvS22UGhvOvI5LIJl43Yql8I3fQIIrGgPadkgIyinbSNzJPryK3kGPkw+WPyFI/GGQO7qaKkWYw2z4aDAY9TFE1DUwV7DYAmr9shsJDuUrg3il7ulyn4JEoi2IqtEGlpiUzhIdKymbREWiZOnjz9p49+9OQfn/zjj5z68Ifuu/cDx4/ddeftt95y043XHbpq//zundu3zWzZNLVxcnx0ZPXQQF+p8VeM1ddpQ8pBzkfguzydXZZGjIc8gGmUB+lfkyf4O1wPvvGZvy1PLz/384igN/l1zzh6Hfgdc9zkwO9Y/YwOOqyowwHfcVj3OyoO/DZunFH4mTLaOKsfXqlnsb5TPx5bPOAThzAxenYbe7Wt9ew2HmXFTkVzX7BL3V7f14t+/Vcu3fsr6foeAvalxvd5O5PDuhhes1x84++A15DGGnLiLwSTPos2WIqs4Gs3Fby2HcZgaVmk3nJbNujjERO2c3XZ8gp8qSYDGPcVFIAvOsCN3kXn69LKTtwDC5v5al7WWUkCQdSFiCR94xsSjLxMNSmhSPBl6pKTsgJ7MYcmRUTxG98QxQgmMfdaPAWR+wUECW/pwj99Q9LohoUuWWEOFPb0ZXyASjXrmPXLeqFv/BPmxldYZ0W9sXYb/aIdcxUnbbW0zNfhseOs7KU+iD0vma/ds4lnHh+Meu3BHBRsqNO4K4T/noK4SA502+tryrfOp/rHh9dFPboU8qyrbahkTI3eihK6H3Yu3J5sfzv1WBd3z46PFNp0Gc3vXH7d2FwXPK7V/Rrn53Qb9TqJvLlHzwcao3ri8JKHTQGdCBjBZltZVCvlLrB352fSwjLBBL9c4XQ+9pjTuQIVxILTueCMwJXLpM4Yv473I64VqmrZeSC+TKz8Sr3cv6VeEfN8vRarJL9Fvd5v1d+3WD2s11eX12uBL9Ch4u169TDDG+rFbfgTzMdK9hh3OxkmO0ii1rpp1WCMiPYCN2+A40Mriz2UW90md7tgL0YhWOAx1ijqh8BvoxQZsbQdOsvNcL/G8G6GjyhmsqvAjFWjIPklxidn4ZUC7aKoLIaY7ay0FwCAvxZqrQFdM41cdEjZX03mgE3tGnmns83V9pH7QuGEUy97et75jqKn2COoQsTffWjvQFNbIeXUvEw9AkNHXFTZ6elioZD/rhfed5HiUkBqlTSR6r6E0rzuyr9/eFPCAdck835HoeBwKjF1sNbkGcmUxhyb4HIEAXK4WZB8Ht2gku6RqbHwJa0v0+ZqDlOHqBpRf2WfQ7z4YmZEqX/W+g9vxKesC3hWSXpIzj2e2J7VwrqPqWE10NPU4Uw0fMs8Vvf8fMWeWsHjkgUB1qoIGwQyUhcK9hgS2aUohGhuPi+wPiPQHj3ypr1gi9DG8SbrVr6xU5YIv8Qtbt3TC1V4wPp9GLBOWBesg6vgh9ZauLbOp3vY77HV2MMV7vfsBFFwgiRWgoAQmfG1pES+sghDHQV8eRRJFiXuf2AIo39lAZu418wmMvkkD3NIB+uYkw/UYDJgmMHiEKSD9tAAi9szMap8Loopo2kVRAQT5LNa6cCK+CN7Lr1n06E5x8jUPbtGDw9DZ+yY7DDVd1s/dxu0AqLcHU1XoD9j/Oi7DivoeOdzV+84sumeS3c+Er8gemT924/D+I2e2qjgB6fPDU+pWiQF5XS2IpwaG/Vb9TlR9nweF8mQbnJJbcqFBsJaO2y8vhaBQxYZX1aFj7kKAnG6BeesB9ya5p7Gg1vbhJ2gjbdl8x3Z7rauTCrOZ1002bHLPl/RxxdHBTGQbAxVJXuDfIbusg8PN47bK4yJ3CHMk1UaosFRUz/7Md2E0WPHRvEzdizuCcHZbSFPnN2om7/8sullU2caS/YcQ+3y+PnN8KRSeGPe1Eb50j62r+8cypUxe52lSq3kwx70A/YbH79DAIq9R+wpmLNvnjUXSCez6fpiN/FGTFeB8RVXgjKCTg0MHrOH4CwJj8M98q7nbtj8wKFhuu7gRzZ99PprR3aN3TiG3+6pcpsu/ifcn07c8Km9I1ef/PjJq0euOrhm/MYTN45HMpV8gMtkw6Y/H/bFm9e05UjqT8mnyd+Rb5J/J+fAg2KjC1ZR5+p1fJqZLR1XQB/0kB+Qb5M/JL9PmogXgSkPCGqHNoiTr5MvkzvJu1ByxfE6X6ulCbzkb8hfkRvIVah3e4iC2klG3clDZ/+CPEmuJJeTC8hq7lXD7Rfk5+R/kS3kIqR6A2Xgn5BT+PQAcqmT6zBMKWS0bqIiYnMagYBzZxuQTMTHGNZiLtviZzQV1hHtUXEu3exlQiKEMk8S5Llkk4dJMdPFHIrkmIuCaijqdDzoZgoxnIoxRwIAgWkSCMAWAgGYbK5dbr/CcAb2/b96x5bVl9r8vBIQl0EJOqED0pCEFmjG237uRga+RNcC+SX5GflP8mPyb+RfyHfJP5NvkH8gf0/+lnyRfJ58jnyS/CX5M8TAj5PHyEOIhv+I3E8+QP6A/B55H3k3YuSbyDvIteQasg8x805yBbmMvI1cghh6kqwna9HOWImYupeUSCfpQMsjiTZdM7a1H3tEthE44NbO++QNDl4+usJD/fmCfQgt+cQm277975zLvf+zcr/uHN70PO//z+f7G+XlN/3O/+k5/Ym97NRCpb7OoD2H4XfYjf2uGc/vIKoqfNypvktx31Lqt6WO2Uk+36Jx9XdMsilTOztXX+/sJF9zeKkmH1xKnVh604klR8JfLqU+uCy1WK0PvsVTFlbWl3DmA2qZ37XMS//t1yzhhLehnNTsOdwrydW1AytcDDk9F0fF1eyjosD4Oh/tIITR8lznbCyGSeQD9nCbQIAHfBI+ejnnsNepmMbD4tJFhc7WqO4BUuntXFlYmUlH8635oOlp0VsUmWiLq4Dw5TE5wIRsbxT8bzyt1k/p4s0oyEt3y0MAj9/2/eGrX/jei/vZ8Pff/evSh54/TOsnh56Hh7q7tmWGM/jd1tVtTeNZlp9l8exM/RbNDbXhGb0Vr47Wb/IDn7NrYXv9ENuLr+jLx1RKKFWwzULczR9EIMdW9PW2RpslSW5LU1FqT2G7iKNvCJKVJSbPOXkstCCJbxEtm+9IJnxeIN1dHaV8KZtJ5JK5+grADoXooLsaE+U1yiE5Cyb4qjrBagaq9oI7BlrjWbTtZLPaWPQyHayU8dSA13Y9c8eEMH3LZ57/zC3TwsQdz+zas21vYbawb86K7NX1vSV4fM/cPrywd9uexUmzcMXeUmmvzqY23vbcC8/dtrFxGC3ZBRbeWy//VeuT9Quv3PzELcL1zxy+du+2r/JHLa4L+XnECzeTDbX1W6bLCC+DfCVvbrth0wgOmTZW+UKjROL0ZJtxqr28FONBpxM33nDwwPzOuW2bL7lww/jIIXPlnBNtFTGRsUP5q2Ue/W/7INHY94BhT7m03fL1DL12ht6st3p+4qWUqdrL1BUr9SXCbLdXkDsu64+y1zR6833/0qPZY03bi9ub3Dr4wjGHD6nSusOUIeBIRA1wecK7e2ZDbs1nRvEeX3tXoIqoJEImuLTw7u45U9N84YhqgOyB2zUZ/GohommhHV1zIU0zQgnZAL8jFvGB60JBCLl9OpUk55p/dCGA/NaFLknQfVoI+B2vLgiye00rfMHj1vCBqo4sSxu3w/y26NrwPKWS6/QGl0Rd5rIb7smFnw7jw3y6Flo2tqojLkkjalrBVwMqtVNZiYNIWwJuF/I5GxVQXa+TXMwpLC4yRUXswXmyNMmY7FdBkWUFu1BR5E08XEUe93oJqfYWezo72rKpBPJIk9fwGn4fvs5TdfM4XK5zl/SuHw10NNth6QLfECumA8nG1DpxKQV3mpqh89ADeJ/ghg/fTQdMzT7F74/dgjX0eVU5heriuvqRftiaxjvWp+vLI7bAqy7rerjDctll8Mpq3D7mevym+gobN9nC0vY9CNchHYuI1Mq1HqfqYMwe5l5cGl6wCXdKgCUHBOFBOyIRvV5RNDvEAF+tD/xxrx+E63555yjbevfZuddhtTzGtp79CR2wXDAMq61Pn58X8yK7GJ+ytjacxC7wA4Lt0QgADyzj0IzHiwg8XoTwgQc+uxlz8HgRLkoYTKwdGVjB50S2pSV8vZf/Gww7AIJPjMhkZU3ka8nZK9DXV0W3YTmfeyRUbUdwwOCTVaUkGtO58bn9/ZvvnTW6a3P9mXGvR1U0NG99sugINbX4+jsTmW4oplrLCBsluPGKAyc0XdPdjpZ8yEXFwT0b+6MwfveWyq65dQWaal3VHuozu9siTNrsLd1y+VWp/q6NUEik3ztaiHT31wbDc3vff6CpEA4LniI48kP9tq76c6RPkfgQt0VIG19llvu1+RxPr6a+IeIglTToIkklsmk0F732qu+iGUTw2QiJMYjM/Hw0RDRhUnOrDmvBxeNhdYhCCnLWGXqdHnb/F3RY3wn94585DEWCAqVvX7hK84Fwqxh20yMuDZRjdIUV+QCsXXhK06nyDtpJre42uBwyOvsgcJ+3de446owc0oGCetYgYV5zQ0HMO2KvxH2ALUVZ+oI+v8kX8PA7uBsuHWdILf5KEYKmJDuAJ4P98KwVURUB+uHgM9bXD1jWASFC/6VPUFQrgvf4qQgvLLwI2+SQ62MLL7K7rEdhk8t64GOukGydQlN3k6v+vyF2Y3tOE5NkuQfG0FW2FIe5NOMhlYw0+7z2dCR/JSOLGl/izV6JiRZXYbUAialAUb5GGb13SjR9VlR3KdoRiPIgkX91uF2DN6Vg6xu1xw1wtMlU/kLSNSHztCIy8SvvdPdfhuz6ZgX1fwDnOb/5AAB4nGNgZGBgAOKrK7+fiOe3+crAzfwCKMJwK0Q/E0b/f/zfiuURcyOQy8HABBIFAJF1DfAAeJxjYGRgYA76n8XAwPLo/+P/j1keMQBFUEA6ALFXB7h4nFVQwQ3CMAwMSQYg7AEdgEkqMUcHQAzRZ99IbMCHL28mgAfmjwQIijk7SVMeJ0d39p0dR8bYozHuxl9HzK7GW9AlhFjtMmLgtwAlBNHirHipX/YQfQrMhePeW764DbKyz0J6+Omu4ELxtGvR4Ym3r5g1m5JvK5nQZH433gF1xa+hp+WPal3KOPHD7vmd9/Jn4GDM5I7Z2f892iMe/Sg3wJtGfXW5W2+rZNd8P/eK7AX4RvnyxyR/nnZp0hwV/geAzmsNAAAAAABEAKwBmgIkAuYDVgO0A/4EZgSOBMgFKgWuBnIG0AcQB1gHfgfkCBgITgimCQ4JWgnACmIKtAsOC1wMPAycDWYN3A4+DvgPyBAuEHYQxhFoEiwSahMIE+IUOBTAFbAWSBc+F+wYYhjCGWoZtBouGnIasBsSG14bzhwiHFodBh1iHYAdsB3mHhweRh6CH2ggWiDgIc4iAiKYIzYk7iY4Jnwm4iduKJApAilMKZgp5CqWKtYrUCvELBYuqi9CL9wwsDFAMXgyADJcMqgy+wABAAAAZwFAABQAAAAAAAIAUgBiAHMAAAESC3AAAAAAeJx1kM1Kw0AURr/R+teCioJb70paxDQG3BQKhYpudCPSraRpmqSkmTKZFvoavoMP40v4LH5NpyIWEyZz7pk7dyYXwBm+oLB+7jjWrHDIaM07OEDX8S79veMa+cnxHhp4dbxP/+a4jmskjhs4xzsrqNoRowk+HCucqhPHOzhWl4536W8c18hdx3u4UM+O9+kjx3UMVOm4gSv12dezpcmS1Eqz35LAD3wZLkVTZUWYSzi3qTal9GSsCxvnufYiPd3wS5zM89Bsws08iE2Z6UJuPX+jHuMiNqGNR6vq5SIJrB3L2OipPLgMmRk9iSPrpdbOOu327/PQh8YMSxhkbFUKC0GTtsU5gF8NwZAZwsx1VoYCIXKaEHPuSKuVknGPY8yooI2ZkZM9RPxOt/wLKeH+nFXM1urfeEBanZFVXnDLuv5W1iOpqDLDyo5+7l5iwdMCWstdq1ua6laChz81hP1YrU1oInqv6oql7aDN95//+wbUU4RFeJxtkueX3TQQxd/ddX27m5CE3iF0MC30FjqE0HsHSR7bOpYlr8p6979n/EI+cA76NEdnyp3fnc3e5sbbbv7/9djDPjLkKFCiQo0tDnCII5zDedyCC7iIS7gVt+F23IE7cRfuxj24F/fhfjyAB/EQHsZlPIJH8RgexxN4Ek/haTyDBs/iOTyPF/AiruAlvIxX8Cpew+t4A2/iLbyNd3AV7+I9vI8P8CE+wsf4BJ/iGj7DdXyOL/AlvsLX+Abf4jt8jx/wI37Cz/gFv+I3/I4/8Cf+wt8QkFBoQejQY9hkKZAvOmda8pnRIebG9druK9eXcdExkj8QPmplqBEmFkpYRSYb3ERV6xbbtNpXnVAknRsrEThfh7FIs3GirUN08yKiGgo6nZ2P+UDcLJtNCpyy1mYT2VQb6mLjZrJbr/vhRphrK91psXiyaiiVmzgzHoUo1OhOyHfGLdVxohC1s1s3Nkp7FtmWi/BW2z6bhDa8kR3Lkc4abU/y6EUYdqpXcWVvRAgUimOvXEtlGFLXGdqnM8qMU2MRWKsaMknG5CulUPG3WMfV0mvqlAhUa8uKei+mXK1F+Tw4S5UShmwrfD57bWNGrY6ZZMaFjsJoVXhOpVgtg4hBzHPeuthcOdS2czfXqE50SzxuOjhOLlKz41LOWsXkqZy5P1uTGTHN9Up+R2yPHVDccjWqXLXrE2LW4iyfBS9Q7/xaE0tmv0M8aZtCRadcZXsqLcXF+fFQK7caG5TzbbUibOg0nut1HJK8KbDotGGzs9apcLAeTiOTYVVHu9imSZKntk6WD4tbUBbY/10zpmHzMGlDFTsjnfBttjpQhEGTaS+yFD62f8c062lc+u/XjkUtdZRpxVgu2vJqYbsMRIZX4auSwo5F7xyXnZdJGx7ZN6x4JduKKCR7x2I6ksmdFXyVrHIrtXUqGeHDlrt45uhJ1DM7yKuEWEysPE0FczBCVpEMrcZvNv8A7bdFJHicY/DewXAiKGIjI2Nf5AbGnRwMHAzJBRsZWJ02MTAyaIEYm7mYGDkgLD4GMIvNaRfTAaA0J5DN7rSLwQHCZmZw2ajC2BEYscGhI2Ijc4rLRjUQbxdHAwMji0NHckgESEkkEGzmYWLk0drB+L91A0vvRiYGFwAMdiP0AAA=') format('woff'), + url('data:application/octet-stream;base64,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6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxNwAA8TcAAABWAADxOAAA8TgAAABXAADxcQAA8XEAAABYAADxegAA8XoAAABZAADxkwAA8ZMAAABaAADxnAAA8ZwAAABbAADxoAAA8aAAAABcAADxrQAA8a0AAABdAADxwAAA8cAAAABeAADxzQAA8c0AAABfAADx3AAA8dwAAABgAADx5QAA8eUAAABhAADx/gAA8f4AAABiAADyMQAA8jEAAABjAADyOgAA8joAAABkAADylgAA8pYAAABlAADyxgAA8sYAAABmAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMlFyE3PgE7ATIfARYzITIWA7ogEAIqAhQg/No0BCoCECADagr8sg4EIBSkNCIeIDYBVBQkAfQYGP48GBoyAcQYGG4ohBQcIh4kGAAAAAAI////+APpAwsADwAfAC8APwBPAF8AbwB/AHZAc3l4cUlIQQYICWlhYCkhIAYEBVlYUVAZGBEQCAIDOTgxCQgBBgABBEcPAQkOAQgFCQhgDQEFDAEEAwUEXgsBAwoBAgEDAl4HAQEAAAFUBwEBAQBWBgEAAQBKfXt1c21rZWRdW1VUTUwmJhcmFxcXFxQQBR0rNxUUBicjIiY3NTQ2NzMyFicVFAYnIyImNzU0NhczMhYnFRQGByMiJjc1NDY7ATIWARUUBichIiYnNTQ2NyEyFgEVFAYrASImNzU0NjczMhYBFRQGJyEiJic1NDYXITIWJxUUBgchIiYnNTQ2MyEyFicVFAYjISImJzU0NjchMhaPCghrBwwBCghrBwwBCghrBwwBCghrBwwBCghrBwwBCghrBwwDWAoI/RIHCgEMBgLuBwz8pgoIawcMAQoIawcMA1gKCP0SBwoBDAYC7gcMAQoI/RIHCgEMBgLuBwwBCgj9EgcKAQwGAu4HDHZrBwwBCghrBwoBDNBrBwwBCghrBwwBCs5rBwoBDAZrCAoK/kxrBwwBCghrBwoBDAJ9awgKCghrBwoBDP5NawcMAQoIawcMAQrOawcKAQwGawgKCs9rCAoKCGsHCgEMAAIAAP/5A1kCxAAYAEAAUEBNDAEBAgFHIQEAAUYAAwcGBwMGbQACBgEGAgFtAAEFBgEFawAABQQFAARtAAcABgIHBmAABQAEBVQABQUEWAAEBQRMLCUqJxMWIxQIBRwrARQHAQYiJj0BIyImJzU0NjczNTQ2FhcBFjcRFAYrASImNycmPwE+ARczMjYnETQmByMiNCY2LwEmPwE+ARczMhYClQv+0QseFPoPFAEWDvoUHgsBLwvEXkOyBwwBAQEBAgEICLIlNgE0JrQGCgICAQEBAgEICLJDXgFeDgv+0AoUD6EWDtYPFAGhDhYCCf7QCrX+eENeCggLCQYNBwgBNiQBiCU2AQQCCAQLCQYNBwgBXgAAAAIAAP+xA1oDCwAIAGoARUBCZVlMQQQABDsKAgEANCgbEAQDAQNHAAUEBW8GAQQABG8AAAEAbwABAwFvAAMCA28AAgJmXFtTUUlIKyoiIBMSBwUWKwE0JiIOARYyNiUVFAYPAQYHFhcWFAcOASciLwEGBwYHBisBIiY1JyYnBwYiJyYnJjQ3PgE3Ji8BLgEnNTQ2PwE2NyYnJjQ3PgEzMh8BNjc2NzY7ATIWHwEWFzc2MhcWFxYUBw4BBxYfAR4BAjtSeFICVnRWARwIB2gKCxMoBgUPUA0HB00ZGgkHBBB8CAwQGxdPBhAGRhYEBQgoCg8IZgcIAQoFaAgOFyUGBQ9QDQcITRgaCQgDEXwHDAEPHBdPBQ8HSBQEBAkoCg8IZgcKAV47VFR2VFR4fAcMARAeFRsyBg4GFVABBTwNCEwcEAoHZwkMPAUGQB4FDgYMMg8cGw8BDAd8BwwBEBkaIC0HDAcUUAU8DQhMHBAKB2cJCzsFBUMcBQ4GDDIPHBoQAQwAAAABAAD/9wOIAsMALwBNQEouLCogAgUFBhkBBAUWEgIDBAsBAQIERwAGBQZvAAUEBW8ABAMEbwADAgNvAAIBAm8AAQAAAVQAAQEAWAAAAQBMJBYWIxEiKAcFGysBBgcVFA4DJyInFjMyNy4BJxYzMjcuAT0BFhcuATQ3HgEXJjU0NjcyFzY3Bgc2A4glNSpWeKhhl30TGH5iO1wSEw8YGD9SJiwlLBlEwHAFakpPNT02FTs0Am42JxdJkIZkQAJRAk0BRjYDBg1iQgIVAhlOYCpTZAUVFEtoATkMIEAkBgAAAAYAAP+eA48DHQADAAcACwAQABkAHgBKQEcAAQAAAwEAXgADAAIFAwJeAAUABAYFBF4KDAgDBgcHBlQKDAgDBgYHWAsJAgcGB0wSER4dHBsWFREZEhkREhEREREREA0FHCsBITUhASE1IQEhNSEBNDIUIiUyFg4BLgI2FzQyFCIDj/yDA33+sf3SAi4BT/yDA338g3BwARgWIgIeMCACJLxwcAKtcP6xcP6vb/58OHFxIiwkASIuIDc4cQAAAQAA/+8C1AKGACQAHkAbIhkQBwQAAgFHAwECAAJvAQEAAGYUHBQUBAUYKyUUDwEGIi8BBwYiLwEmND8BJyY0PwE2Mh8BNzYyHwEWFA8BFxYC1A9MECwQpKQQLBBMEBCkpBAQTBAsEKSkECwQTA8PpKQPcBYQTA8PpaUPD0wQLBCkpBAsEEwQEKSkEBBMDy4PpKQPAAIAAP/5A5ICxQAQADEALkArLiYlGBUPDg0IAQMMAQABAkcEAQMBA28AAQABbwIBAABmKigjIiERFAUFFysBERQGByM1IxUjIiYnEQkBFjcHBgcjIicJAQYmLwEmNjcBNjIfATU0NjsBMhYdARcWFAMSFg7Wj9YPFAEBQQFBAXwiBQcCBwX+fv5+Bw0FIwQCBQGREjATiAoIawgKegYBKP71DxQB1tYWDgEPAQj++AEkKQUBAwFC/r4EAgUpBg4FAU4PD3FsCAoKCONmBBAAAAABAAAAAAI8Ae0ADgAXQBQAAQABAUcAAQABbwAAAGY1FAIFFisBFA8BBiIvASY0NjMhMhYCOwr6CxwL+gsWDgH0DhYByQ4L+gsL+gscFhYAAAEAAP+xAhcDUgAUADNAMAABAAYBRwADAgNwAAYAAAEGAGAFAQECAgFSBQEBAQJWBAECAQJKIxERERETIQcFGysBFSMiBh0BMwcjESMRIzUzNTQ2MzICF1cwIqQWjquOjnRhUgNLkygoaqX+WAGopXpocgAAAQAA/7EDZAMLADUAHUAaNSwjGhEIBgABAUcAAQABbwAAAGYpJjsCBRUrAR4BDwEOAS8BFRQGByMiJjc1BwYmLwEmNj8BJy4BPwE+AR8BNTQ2NzMyFh0BNzYWHwEWBg8BAzsaDg4jDzoZlSodRx0sAZQaOg4kDg4blJQaEA8kDzgblCoeRx0qlRo4ECMPEBmUAQgOOho9Gg4OVasdKgEsHKtVDxAZPRo6DlZWDjoaPRoODlWrHSoBLByrVQ8QGT0aOg5WAAQAAP+xA6EDLgAIABEAKQBAAEZAQzUBBwYJAAICAAJHAAkGCW8IAQYHBm8ABwMHbwAEAAIEVAUBAwEBAAIDAGAABAQCWAACBAJMPTwjMyMiMiU5GBIKBR0rJTQmDgIeATY3NCYOAh4BNjcVFAYjISImJzU0NhczHgE7ATI2NzMyFgMGKwEVFAYHIyImJzUjIiY/ATYyHwEWAsoUHhQCGBoYjRQgEgIWHBhGIBb8yxceASAW7gw2I48iNg3uFiC2CRiPFA+PDxQBjxcTEfoKHgr6Eh0OFgISIBIEGgwOFgISIBIEGomzFiAgFrMWIAEfKCgfHgFSFvoPFAEWDvosEfoKCvoRAAAAAAUAAP86A6oDgQAoADEAQgBLAFQAgEB9GwoCBAEfAQoGAAENCgNHAAQBBgEEBm0ABgoBBgprAAkNBw0JB20PAQoADQkKDWAABwAIDAcIYBABDAALBQwLYAMBAQECWAACAgxIDgEFBQBYAAAADQBJTUxEQyopUVBMVE1USEdDS0RLQD86NzQyLi0pMSoxGCMzKBQRBRkrARYVFAAEADU0Ejc1JzUjIiY+ATczMh4BBicjFQcVFhc/ATYyFgYPAQYBMjYQJgQGEBYTMzIWFAYnIyImPQE0NjIWBycyFhIGIiYSNhMyNi4BDgIWA1dT/uz+fv7s8LICMxUgAhwX0BUeAiITNAGccgYbDyogAg4aBf50l9bW/tLW1stoFSAgFZwVICAqIAE0gbYCuv68BLSDa5oCltqWApoCGXWUwv7uAgEWwLQBChMBAzMgKh4BICgiATMBAxFsCRoPHiwPGgX9hdYBLtYC0v7O0gGeHiogAR4WnBYeHhaduP7+uLgBArj9wprWmgKW2pYAAgAA/9gD6ALkABUAJABGQEMjAQQCJBkCAQQDBAJHIgEBRQABAAIEAQJeAAUABAMFBGAGAQMAAANSBgEDAwBYAAADAEwAACEgFxYAFQAVFCU1BwUXKyU1NxUUBiMhIiY1ETQ2MyEOAQ8BIxEBIgYHND4FMzUFAQLuZB4U/RIUHhwWASAgNgwKggI4pphUAhAcPFCGUgFM/rQ8OFK8FB4eFAImFhwYMg4M/j4BXFKMCBxUSlxCLpz6/vwAAAABAAD/sQPoAwwAHAAhQB4RAQABAUcCAQEAAW8DAQAAZgEAFxUNCwAcARwEBRQrBSInAScuAzU0NjcyHgIXPgMXMhYUBwEGAfQOC/6kDwoqIhqOfSJIPi4TFCxARiN9joD+pQpPCgFQDwo2NlAle4oBGCoiFRQkKBoBjPWA/rEKAAEAAP/5AxIDCwAjAClAJgAEAwRvAAEAAXAFAQMAAANUBQEDAwBYAgEAAwBMIzMlIzMjBgUaKwEVFAYnIxUUBgcjIiY3NSMiJic1NDY3MzU0NjsBMhYXFTMyFgMSIBboIBZrFiAB6BceASAW6B4XaxceAegXHgG3axYgAekWHgEgFekeF2sXHgHoFiAgFuggAAH//wAAAjsByQAOABFADgABAAFvAAAAZhUyAgUWKyUUBichIi4BPwE2Mh8BFgI7FA/+DA8UAgz6Ch4K+gqrDhYBFB4L+goK+gsAAAADAAD/+QNaAsQADwAfAC8AN0A0KAEEBQgAAgABAkcABQAEAwUEYAADAAIBAwJgAAEAAAFUAAEBAFgAAAEATCY1JjUmMwYFGislFRQGByEiJic1NDY3ITIWAxUUBichIiYnNTQ2FyEyFgMVFAYjISImJzU0NhchMhYDWRQQ/O8PFAEWDgMRDxYBFBD87w8UARYOAxEPFgEUEPzvDxQBFg4DEQ8WZEcPFAEWDkcPFAEWARBIDhYBFA9IDhYBFAEORw4WFg5HDxYBFAAAAAABAAD/wAKYA0QAFAAXQBQBAQABAUcAAQABbwAAAGYXFwIFFisJAhYUDwEGIicBJjQ3ATYyHwEWFAKO/tcBKQoKXQscC/5iCwsBngoeCl0KAqr+2P7XCh4KXQoKAZ8KHgoBngsLXQoeAAEAAP/AAnQDRAAUABdAFAkBAAEBRwABAAFvAAAAZhwSAgUWKwkBBiIvASY0NwkBJjQ/ATYyFwEWFAJq/mILHAtdCwsBKP7YCwtdCh4KAZ4KAWn+YQoKXQscCwEpASgLHAtdCwv+YgscAAAAAAIAAP/5A1kCxAANACMAM0AwFgEEAwFHAgEAAQMBAANtAAUAAQAFAV4AAwQEA1IAAwMEWAAEAwRMKTQRIxQQBgUaKwEzNCYnAyEDDgEVMxczJREUBgchIiYnETQ3Ez4BFyEyFhcTFgI7sAIBdv51dgECsDWzAVMUEPzvDxQBDoUFHg4B0Q4eBYUOAToCBgEBFf7rAQYCa1v+8w8UARYOAQ0iIgE0DhQBEg/+zCIAAAAAAwAA/3YDoAMLAAgAFAAuADNAMCYBBAMoJxIDAgQAAQEAA0cAAwQDbwAEAgRvAAIAAm8AAAEAbwABAWYcIy0YEgUFGSs3NCYOAh4BNiUBBiIvASY0NwEeASUUBw4BJyImNDY3MhYXFhQPARUXNj8BNjIW1hQeFAIYGhgBZv6DFToWOxUVAXwWVAGZDRuCT2iSkmggRhkJCaNsAipLIQ8KHQ4WAhIgEgQa9v6DFBQ9FDsWAXw3VN0WJUteAZLQkAIUEAYSB159PAIZLRQKAAAAAAEAAP9pA+gCwwAmABxAGRsBAAEBRw0BAEQAAQABbwAAAGYkIiMCBRUrARQOASMiJwYHBgcGJic1JjYmPwE2PwE+Aj8BLgEnND4CMzIeAQPohuaIJypukxskCg4DAgQCAwwEDRQHFBAHD1hkAVCEvGSI5oYBXmGkYARhJggEAQwKAQIIBAMPBQ4WCBwcEyoyklRJhGA4YKQABwAA/2oDEANSAAcACwAPABMAFwAbAB8ARkBDEw8NAwQAAUceGxoZFxYVEhEJAEUCAQAEAG8ABAAFAQQFXgABAwMBUgABAQNWBgEDAQNKAAALCgkIAAcABxEREQcFFysVERcDIREzESUhFSE/AQUHJTcFBwE3BQcDNxMHEzcTB0wDAfVP/e4BiP54AQgBiQj+jBcBfBj+zCwBUi2qReZGF1RBVJYBoQH+sQFO/mHbU5RVJlXTUmtSATRJzEkBmTL+vzIBvA7+ew4AAAAAAwAA/8gDLQL1ABcAIAA1AKBACg4BAwERAQQDAkdLsBZQWEAyAAIAAQECZQsBBwkBAAIHAGAAAQADBAEDYQAECgEFBgQFYAAGCAgGVAAGBghYAAgGCEwbQDMAAgABAAIBbQsBBwkBAAIHAGAAAQADBAEDYQAECgEFBgQFYAAGCAgGVAAGBghYAAgGCExZQCEiIRkYAQAsKyE1IjUdHBggGSAQDw0LBwUEAwAXARcMBRQrASIGFTM0MzIWFRQGIyInFTM1PgE1NC4BAyIGFBYyNjQmAzIXFhcWFAcGBwYiJyYnJjQ3Njc2AZVOUoIdDg0iJAsJgjAxKkouHy0tPi4uH25fXDY4ODZcX91eXDY3NzZcXgJqVE86HB4jHwF6MwxFNzBKKf5rLj8uLj4vAiA4NVxf3V5cNjg4Nlxe3V9cNTgAAAAAAv/9/7EDXwMLABUAIgAwQC0HAQIBAUcABAAEbwAAAQBvAAECAW8AAgMDAlQAAgIDWAADAgNMFRcXFBQFBRkrATQvASYiDwEnJiIPAQYUHwEWMjcBNhcUDgEiLgI+ATIeAQLNCjMLHAvkfgscCzMKCsoKHgsBLwqMcsboyG4Gerz0un4BuBAKMgsL434LCzIKHwrKCgoBLwpLdcR0dMTqxHR0xAAD/+P/lgQfAyYADAAVACQANkAzAAEABAUBBGAABQADAgUDYAYBAgAAAlQGAQICAFgAAAIATA4NIiEbGhIRDRUOFRUyBwUWKyUWBiMhIicmNwE2MhcDMjY0JiIGHgETNjU0LgEGFxQfARYyNzYD30Boff2PfjM1QAE1PtY/qSIuLkQwAix5BTRMNgEGSAUQA0q6a7ldXGsCAWtr/Y8uRDAwRC4Bgw0TJjQCOCQREbIJCbIAAAAC//4AAAOQAoAAEQAjACRAIQAAAQBvAAEDAW8AAwICA1QAAwMCWAACAwJMFzkXMwQFGCsTJjc2MyEyBwYHBg8BBiIvASYFNhURFAYjISImNRE0FwUWMjceIAQCGANOJhIIEA6ythA6ErayA0QUIhD84BAiFAGAEjgSAkoSFg4gDggGYGIKCmJgXgoU/pAQICAQAXAUCsgKCgAAAAADAAD/ugOYA0kAHAA7AFwApkAaOgEJBVdHAgAEEwsCAQcDR1YrAglGBgIHAkZLsApQWEA2AAUDCQQFZQABBwIAAWUACAADBQgDYAAJAAAHCQBgAAQABwEEB2EAAgYGAlQAAgIGWAAGAgZMG0A4AAUDCQMFCW0AAQcCBwECbQAIAAMFCANgAAkAAAcJAGAABAAHAQQHYQACBgYCVAACAgZYAAYCBkxZQA5ZWBcXHCgXGBoYFAoFHSslNC8BJiIHFx4BHwEUBgciLgEvAQYUHwEWMj8BNgE0LwEmIg8BBhQfARYyNycuAjU0NhcyFh8BFh8BNgEUDwEGIi8BJjQ3JwYiLwEmND8BNjIfARYUBxc2Mh8BFgMtEHQQLhAWAwwBAiAWCA4OBBYTEHMPLRBSEP53D3MQLBBSEBB0Dy4RFwMKBB4XCQ4HCwQIChIB9DBSLocucy4xMTCHL3QvL1Ivhi9zLjExMIcvdC+rFw90EBIWAxAGDxceAQQKBBYRLg90Dw9REAGfFhBzEA9SDywQdA8RFwMODgkWIAEEBQgDCQsR/o5CL1EvMHMvhzAxMS90L4YuUi4vdC6IMDExL3QvAAAAAgAA/58DkAMdABQAHwBYQFUHAQEFAUcIAQEPAQICRgACAQMBAgNtAAMEAQMEawAEBG4HAQAABgUABmAIAQUBAQVUCAEFBQFYAAEFAUwWFQEAGxoVHxYfDg0MCwoJBgQAFAEUCQUUKwEyFg4BIyInBxUjFSMVITUBJjU0NhMyNi4BJyIGFRQWAnlzpAKgdhwXBXBv/rEBVAWkdBYiAh4ZGCAiAx2k5qQFBXBvceABVBcdc6L+siAyHAIiFRgiAAAAEgAA/9kDLgLjAA8AFAAYABwAIAAkACgALQAxADYAOgA+AEMASABLAE4AUQBUAGxAaUhHQ0JBQD49PDo5ODYzMTAvLSwqKCcmJCMiIB8eHBsaFxYVFBMlBQEBRwsBAAoHBgQDBQEFAAFeCQgCBQICBVIJCAIFBQJWAAIFAkoBAFRTUVBOTUtKRkU1NBIRCwkIBwUEAA8BDgwFFCsBMhYUBisBAyEDIyImNDYzBScjBxcHFzcnNxc3JxcHFzcnFzcnBzcnBycHHwE3FwcXNxcHFzM/AicHPwEnBz8BJwcXLwEjBxclNyMTFzMlBzMTNyMDARIbGxIGh/5KhgsTGhoTAUgTdhJNdBk8TiBNTk5tTExNLU1NTW1NTUyOKxEaTh9NTU4fTDkmOiBNTU2xGRFMdA01TEwfE3USTf6EKDBoEUsBEGtVcQo7AuMaJhr9UAKwGiYaaxERTrSBPE0gTU1MbE1NTW1NTUwtTkxMTCpVG076TkxMH006OiBMTk4qgBFNs0AzTE67ERFONyj98V1paQI9LwAC//j/tgPsAwgAHAAjAHe1HgECAQFHS7ALUFhAKQAHBgdvCQgCBgEGbwUBAQIBbwQBAgMDAmMAAwAAA1IAAwMAWQAAAwBNG0AoAAcGB28JCAIGAQZvBQEBAgFvBAECAwJvAAMAAANSAAMDAFkAAAMATVlAER0dHSMdIxETESITERY2CgUcKyUeAQ8BDgEjISImLwEmPwEzBzMyHwEhNzY7ASczJwUlMxEzEQPIEhIGHAQkFvzQFiQEHAoqnmKqsggEKAEsKAgEsqpiMP78/vymvsYKLBKaFBoaFJowGGyCCG5uCILW9PQBAP8AAAP//gAAA+gCYAAgACQAKAA2QDMAAAgGBwMEAwAEXgUBAwEBA1IFAQMDAVgCAQEDAUwlJSEhJSglKCcmISQhJBQnKhgJBRgrESY3JTYXFg8BIScmNzYXBRYHAwYjISYvASYPAQYjISYnNxchNzMXITcCCgFoHQwLGeMCkuQZCw4dAWoLAhsIGf7HGQYxJzUyBhr+yBsEJxMBBCvdKQEDFAGCDQy6CxshDGhoEB0bC7oMDf8AHgIY3xkY4BoCHOK9vb29AAAMAAD/+QMSAwsAAwAHAAsADwATABcAGwAfACMALwAzADcAwEC9JBsjAxkLAQkDGQleHgUdAwMEAQIIAwJeCgEIGgEYDQgYXgAHFg0HUgAWEwAWUiIXFR8EDQATAQ0TXhwBARIBAAYBAF4hESAPBAYMDAZSIREgDwQGBgxWFBAOAwwGDEo0NDAwJCQgIBwcGBgICAQEAAA0NzQ3NjUwMzAzMjEkLyQvLi0sKyopKCcmJSAjICMiIRwfHB8eHRgbGBsaGRcWFRQTEhEQDw4NDAgLCAsKCQQHBAcGBQADAAMRJQUVKzcVIzUTFSM1IRUjNQEzNSM1MzUjBTM1IwMRIREBFSM1MxUjNRMVIzUjFSMRMxUzNQERIREhESER1kdHRwH0SP4M19fX1wGt1taP/psCg0jXSEjXR0fWR/6b/psDEv6bz0dHAa1ISEhI/cXW1tbW1v6b/psBZf7iR0dHRwEe1kfWAWVHRwGt/poBZv6aAWYAAAADAAD/wwPoA0AAEgA3AHEAaEBlawEBCw0BAAEpAgIFBjEBBAVWJwIDBAVHAAsBC28ABgAFAAYFbQAFBAAFBGsAAgMCcAoBAQcBAAYBAGAJAQQDAwRUCQEEBANYCAEDBANMbm1qaVtYUlBCQD08NDMwLzMVNhgMBRgrAQYHJy4DJyMiJj0BNDY7ATIBFA8BBiImPQEjIgYvAS4FJzY3HgQ3MzU0NjIfARYRFA8BBiImPQEjIg4CBwYHDgIPAQ4CJyMiJj0BNDY7ATI+Ajc2PwE+BTczNTQ2Mh8BFgF0IisUCB4aLhZ9CAoKCH2LAs4FswUPCjAeHhonDS4YKBokDSErDBAeGiwYjwoOB7IFBbMFDwqPGywgGgwSGRAYJBIpFzZCJn0ICgoIfRsqJBQQERocDCQkLjZAKI8KDgeyBQJGNGUpECYaDAIKCGsICv3FCAWzBQwGawICAwEKChYWJhQ0ZBkeKhQUAmsICgWyBQHsCAWzBQwGaxAiIhsiPSUyRBUvGhgWAQoIawgKEiAkGSM9PhpAMCwiDANrCAoFsgUAAAMAAAAAA+gCdgAUAB0ALABDQEAiAQQFAUcGAQAAAwUAA2AABQAEAgUEYAcBAgEBAlQHAQICAVgAAQIBTBYVAQAqKCUkGhkVHRYdCwoAFAEUCAUUKwEyHgMUDgMiLgM0PgMTMjY0JiIGFBY3Fj4BFxQGIiY0NjMyDgEB9FyqcFYoKFZwqriqcFYoKFZwqlxcgoK4goJcCDoqBEJcQEAuDggQAnYySlA+HDxSSjIySlI8HD5QSjL+En6yfn6yftYIDAoOLD4+Wj4uMAAAAAIAAP/5AoMDCwAHAB8AKkAnBQMCAAECAQACbQACAm4ABAEBBFQABAQBWAABBAFMIxMlNhMQBgUaKxMhNTQmDgEXBREUBgchIiYnETQ2FzM1NDYyFgcVMzIWswEdVHZUAQHQIBb96RceASAWEZTMlgISFx4BpWw7VAJQPaH+vhYeASAVAUIWIAFsZpSUZmweAAL///9qA6EDDQAIACEAMkAvHwEBAA4BAwECRwACAwJwAAQAAAEEAGAAAQMDAVQAAQEDWAADAQNMFyMUExIFBRkrATQuAQYUFj4BARQGIi8BBiMiLgI+BB4CFxQHFxYCg5LQkpLQkgEeLDoUv2R7UJJoQAI8bI6kjmw8AUW/FQGCZ5IClsqYBoz+mh0qFb9FPmqQoo5uOgRCZpZNe2S/FQADAAD/agPEA1MADAAaAEIAhUAMAAECAAFHKBsCAwFGS7AOUFhALgcBBQEAAQVlAAACAQBjAAgABAMIBGAAAwABBQMBYAACBgYCVAACAgZYAAYCBkwbQC8HAQUBAAEFZQAAAgEAAmsACAAEAwgEYAADAAEFAwFgAAIGBgJUAAICBlgABgIGTFlADB8iEigWESMTEgkFHSsFNCMiJjc0IhUUFjcyJSEmETQuAiIOAhUQBRQGKwEUBiImNSMiJjU+BDc0NjcmNTQ+ARYVFAceARcUHgMB/QkhMAESOigJ/owC1pUaNFJsUjQaAqYqHfpUdlT6HSocLjAkEgKEaQUgLCAFaoIBFiIwMGAIMCEJCSk6AamoASkcPDgiIjg8HP7XqB0qO1RUOyodGDJUXohNVJIQCgsXHgIiFQsKEJJUToZgUjQAAAAG////agQvA1IAEQAyADsARABWAF8Ab0BsTw4CAwIBRxEBCQsJbwALCAtvEAEIAghvDwECAwJvBwEFAAEABQFtDAoCAQYAAQZrAAYEAAYEawAEBG4OAQMAAANUDgEDAwBYDQEAAwBMXl1aWVZUUlBLSklHQ0I/Pjo5GRUUGTcjEyEQEgUdKwEGByMiJjc0MzIeATcyNwYVFAEUBiMhIiYnND4FMzIeAj4BPwE2NzIeBBcBFAYiJjQ2MhYBFAYuAT4CFgUUBicjJic2NTQnFjMyPgEXMicUBiImNDYyFgFLWjpLLUABRQQqQiEmJQMCg1JD/hhEUAEEDBAgJjohBiQuSFBGGSkQCCI4JiAQDgH9xlR2VFR2VAGJfrCAAny0egFDPi5LOVotAyUlIUQoBEVHVHZUVHZUAV4DRCwsxRYaAQ0VEE7+W0JOTkIeOEI4NCYWGBwaAhYQGgoCFiY0OEIcAo87VFR2VFT+71l+Anq2eAaE0ysuAUQDQU4QFQ0YGAGPO1RUdlRUAAIAAP+xAjwDCwAIABgAJkAjAAEAAgABAm0AAgJuAAMAAANUAAMDAFgAAAMATBcXExIEBRgrATQmIgYUFjI2NxQHAw4BIiYnAyY1NDYyFgGtVHZUVHZUjhLLCSQmJgfMEqjsqAHtO1RUdlRUOz0n/lASFhYSAbAnPXaoqAADAAD/tgPoAwgAGAAgAC0AqrUlAQkLAUdLsA1QWEA7BgMCAQcFBwEFbQwBBQAHBQBrBAEACAcACGsKAQgLCwhjAAIABwECB2ANAQsJCQtSDQELCwlZAAkLCU0bQDwGAwIBBwUHAQVtDAEFAAcFAGsEAQAIBwAIawoBCAsHCAtrAAIABwECB2ANAQsJCQtSDQELCwlZAAkLCU1ZQB4hIQAAIS0hLSwrKSYjIiAdGxoAGAAYEiQ1IhEOBRkrARUhEzY7ATY/AT4BOwEyFhcWFzMyFxMhNQMHIScmKwEiEzUhBgcGIyEiNSchFQHI/jgKBGCgEBUXDhIc3hoUDBIqoGAECv46pBwBJBwOHJgclgGuBgQGVP0SWgoBrgFGZAEkbBopLRoMDhggUGz+3GQBYjY2Gv2KZFhOVFSmZAAABQAA/7EDWQMLAAgAEQAaAFQAbQBjQGASAQMFAUcACgIHBwplAA0LDgIGBQ0GYAAFAAQABQRgAAMAAAEDAGAAAQACCgECYAkIAgcMDAdUCQgCBwcMWQAMBwxNIBtqZV5ZUlE9PDo5ODc2NRtUIFMTFBMUExIPBRorATQmIg4BFjI2NxQGLgE+AhY3FAYiLgE2MhYlIisBIg4BBw4BBw4CFgYWBhYUHwEeARceATIWNhY2Fj4BNz4BNz4CJjYmNiY0LwEuAScuASImBgEUBw4BBwYiJy4BJyYQNz4BNzYgFx4BFxYCO1J4UgJWdFZLgLaCAn66fD8eLBwCICgi/uYEJzsURC4RHCoMBggEAgICAgIGCgwqHBAwQipMCkosQDQNHCwKBggEAgICAgIGCgsqHRAuRiZQAaoDBYBzMv4ydIAFAwMFgHQxAQAxdH4GAwFeO1RUdlRUO1uCAn66fgKCihUeHioeHmYEBggLKhwQMEQmUAZQJkQYKBwqCwYKBAQEBAQIAgoLKhwQMEQmUAZQJkQYKBwqCwYKBAT+ooAxdIAFAwMGfnUxAQAxdIAFAwMGfnUxAAMAAP+SA5gDKgAIABEAFwBJQEYWFRQTBAIEAUcHAQQDAgMEAm0FAQAAAwQAA2AGAQIBAQJUBgECAgFYAAECAUwSEgoJAQASFxIXDg0JEQoRBQQACAEICAUUKwEyABAAIAAQABMyNhAmIAYQFhMVFwcnEQHMvgEO/vL+hP7yAQ6+ltLS/tbU1LiWMqoDKv7y/oT+8gEOAXwBDvzM1AEq0tL+1tQCbPSWMqoBEgAB////+QMSAwsATgAjQCAyAQIBAAEAAgJHAAECAW8AAgACbwAAAGZCQCEgJgMFFSslFAYHBgcGIyImLwImJy4BJyYvAS4BLwEmNzQ3Njc+ATMyFxYfAR4BFx4CFRQOAgcUHwEeATUeARcyFh8BFjcyPgIXMh4BHwEWFxYDEgwGCzk0Mw8eERo7NitHmisbEwoICAQHAwEdHxwOMA8IBAoUEAoUBwIQCCAmHgEDBAEOKm5MARIFCwYHCh4eIAwHEBgCYCcDAp4PMA4cIBwEBQgVFBssmEgrNhwXEBIgDg80NDkLBgwCAycfFB4PAhgQCAsgHh4KBQgLAxYBTW4qDAIFAwEgJCIBCBACNhMKBAAAAA8AAP9qA6EDUgADAAcACwAPABMAFwAbAB8AIwAzADcAOwA/AE8AcwCeQJtBJQIdEkktJAMTHQJHIAEeGgESHR4SYCEfAh0TCR1UGwETGRcNAwkIEwlfGBYMAwgVEQcDBQQIBV4UEAYDBA8LAwMBAAQBXg4KAgMAHBwAUg4KAgMAABxYABwAHExycG1qZ2ZjYF1bVlNNTEVEPz49PDs6OTg3NjU0MS8pJyMiISAfHh0cGxoZGBcWFRQTEhERERERERERECIFHSsXMzUjFzM1IyczNSMXMzUjJzM1IwEzNSMnMzUjATM1IyczNSMDNTQmJyMiBgcVFBY3MzI2ATM1IyczNSMXMzUjNzU0JicjIgYXFRQWNzMyNjcRFAYjISImNRE0NjsBNTQ2OwEyFh0BMzU0NjsBMhYHFTMyFkehocWyssWhocWyssWhoQGbs7PWsrIBrKGh1rOzxAwGJAcKAQwGJAcKAZuhodazs9ahoRIKCCMHDAEKCCMICtcsHPzuHSoqHUg0JSQlNNY2JCMlNgFHHSpPoaGhJLKysiSh/cSh+qH9xKEksgEwoQcKAQwGoQcMAQr+JrIkoaGha6EHCgEMBqEHDAEKLP01HSoqHQLLHSo2JTQ0JTY2JTQ0JTYqAAYAAP+SA60DKgAbAB8AKAAsADAANACMQIkHAQUJAAkFAG0ACAsKCwgKbRQBCg0LCg1rAA0PCw0PawMBAQ4MDgEMbQAGEwEJBQYJXgQSAgAACwgAC2ARAQ8QAQ4BDw5eAAwCAgxSAAwMAlYAAgwCSiEgHBwBADQzMjEwLy4tLCsqKSUkICghKBwfHB8eHRoZGBcWFRQSDQsKCQgGABsBGxUFFCsBMhYVERQGKwEXITcjIiY1ETQ2OwE1MzUhFTMVJREhEQEyNjQmIgYUFhMhJyEXIzUzFyM1MwNiHi0tHkwi/U0bUiEtLSFgIgIPIv3yAcn9xhcgISwgIFUCNy/+HNiLi8aLiwI0LiD+kh8umZktIAFuIS11gYF1x/7cAST+eyArICArIP5K8oEjIyMAAAAFAAD/+QPkAwsABgAPADkAPgBIAQdAFUA+OxADAgEHAAQ0AQEAAkdBAQQBRkuwClBYQDAABwMEAwcEbQAABAEBAGUAAwAEAAMEYAgBAQAGBQEGXwAFAgIFVAAFBQJYAAIFAkwbS7ALUFhAKQAABAEBAGUHAQMABAADBGAIAQEABgUBBl8ABQICBVQABQUCWAACBQJMG0uwF1BYQDAABwMEAwcEbQAABAEBAGUAAwAEAAMEYAgBAQAGBQEGXwAFAgIFVAAFBQJYAAIFAkwbQDEABwMEAwcEbQAABAEEAAFtAAMABAADBGAIAQEABgUBBl8ABQICBVQABQUCWAACBQJMWVlZQBYAAERDPTwxLikmHhsWEwAGAAYUCQUVKyU3JwcVMxUBJg8BBhY/ATYTFRQGIyEiJjURNDY3ITIXHgEPAQYnJiMhIgYHERQWFyEyNj0BND8BNhYDFwEjNQEHJzc2Mh8BFhQB8EBVQDUBFQkJxAkSCcQJJF5D/jBDXl5DAdAjHgkDBxsICg0M/jAlNAE2JAHQJTQFJAgYN6H+iaECbzOhMxAsEFUQvUFVQR82AZIJCcQJEgnECf6+akNeXkMB0EJeAQ4EEwYcCAQDNCX+MCU0ATYkRgcFJAgIAY+g/omgAS40oTQPD1UQLAADAAD/sQMTAwsAFAAqAF8ATUBKKSMCAgNRAQECDgEAASwBBgAERwAFBAVvAAQAAwIEA2AAAgABAAIBYAAABgYAVAAAAAZYBwEGAAZMKysrXytZRkVEPygpNyEIBRgrJRYzMjU0Jy4EIyIHFRQHFRQWAxYzMj4CJzQuAiciBxQWBxUUBxQBNz4BNz4DJjc1ECcuBCMnNiQ3MhY3Mh4DFRQOAwceAQcUDgMHIiYHIgcBNikl0hcPJiY0KiAoEAEEAxcmLkQ2HgEgOj4mHC0GAQH+0wEJThQEBgIGBAIMAhQeGhwDAjcBDkkNMg0nSkYyIBIaLiQdVnQBKEBaXDQZYhk7cAESu0AlGCISCgIGWDsdXBU0AZYEDiRALyc6Ig4BBxxwHS0eDhr+AzUCDggHEBYOHAUkAiQYBQYGAgQuAQoBAgEOIixKJx0yHiIQDhRuUzhaNioMAgQBBgAAAAABAAD/sQI7AwsAOgA4QDUQAQABLisMAwMAAkcZAQFFAAMAAgADAm0AAgJuAAEAAAFUAAEBAFgAAAEATDk1NDBiHgQFFisVNz4CNzY/ATYSPQEuAic3Fx4BMzI2PwEGBw4BBwYPAQ4BBwYCDwIGFRcWFwYHIgYjIiYjJiMiBwoMLCQPEAcjIjoNIiwKCkMwSB8bOCg2AggRUBQFAwUCBAIPRAkSCQQBCV4CBwYYBhBCD00mHDNOMAQKDAcTJaKeASIUDggGAgI6BAMCAgMEFhwGFAkKDRcKHglS/tAuUy4WCgoDDxgfAgwBBQAAAAL/+f+uA2MDLgApADIAH0AcDAsCAEQAAgECbwABAAFvAAAAZjAvLCsZFwMFFCslHgEOAg8BBiY/AScHBiY/ATY/AT4COwEXPgQXMhcWFxYOAgcTFjI2NCYiBhQCHwYEFAZADZsgGgoogmocHgwfEwgWDhYkFzRHCiZ0eKpQCAYEAgo4YGQkDhZALCxALOwyPjgYKAZEDCAcboQoDBwgTzEQLR0OGgYOMnhYPgwGBApSrIJqHAEMFi5ALi5AAAAAAAMAAP+uA1oDDgAqAD0AUQBgQF06AQADSzw7AwQASQEHBANHSgEHRAIBAQUDBQEDbQADAAUDAGsAAAQFAARrCQEGAAUBBgVgCAEEBwcEVAgBBAQHWAAHBAdMPz4sK0hGPlE/UTQzKz0sPR8iGigKBRgrATIWFxYVFA4BIyInLgEnJjc1Njc2MzIWMzIWFx4BFRQGBxQXFhcWFxYyNgMyPgI0LgIOAwcUFwc3FhMyHgIOAyciJwc3JjU0PgICJgdeAwESPhogSjdQKikBAicODwQMBQsIBAUcJgEDEyYfNQcOLGtHgl44OF6CjoBgNgFDLIdYaFaccEQCQHSYWGxf6Uw8QnKaATMyBQIGEi4eIxlSPjwwBTImDAIGDQtMAwwqBQMFKSMeGwQ2/tk4XISMhFw6AjZggEhxXIIrOgMDRG6gpqBsSAI1S+JjdlaadD4AAAMAAAAAA5gBzAAIABEAGgA6QDcIBAcCBgUAAQEAVAgEBwIGBQAAAVgFAwIBAAFMExIKCQEAFxYSGhMaDg0JEQoRBQQACAEICQUUKxMyFhQGIiY0NiEyFhQGIiY0NiEyFhQGIiY0Nm4uQEBcQEABjC5AQlhCQAGMLkBAXEBAAcxAWkJCWkBAWkJCWkBAWkJCWkAAAAAD//z/kAOaAywACAATACkAYkBfDAEDAiMiGBcEBQcCRwAHBgUGBwVtAAUEBgUEawgBAAkBAgMAAmAAAwAGBwMGYAoBBAEBBFQKAQQEAVgAAQQBTBUUCgkBACYkIB4bGRQpFSkQDgkTChMFBAAIAQgLBRQrATYAEgAEAAIAFyIGFQYWMzI2NTQDMjY3JwYjIj8BNiMiBgcXNjMyDwEGAca+ARAG/vb+hP7uBgEM8iouAiIgJi60Hmw0EjAYDgoqGjAedjgQNBYMDCQaAyoC/vj+hP7uBgEKAXwBEpYwGhwgLCA6/a40NBgkJqBgOi4aIiKYaAAAAQAA//kD6ALDAB8AJEAhGQgCAAMBRwACAwJvAAMAA28AAAEAbwABAWYVNTUkBAUYKwERFAcGIyIvARUUBiMhIiY1ETQ2MyEyFh0BNzYzMhcWA+gWBwcPCuFeQv53Q15eQwGJQl7hCg8HBxYCjv2gFwkDCuFcQ15eQwGIQ15eQ1zhCgIKAAAAAAIAAAAAA48CrQAKABUALUAqBAEAAwBvBwEDAgNvBgECAQECVAYBAgIBWAUBAQIBTBIRExESERMQCAUcKxMhERQGJzUyNicjASERFAYnNTI2JyMSAU/Ei1yEAd8CLgFPxItchAHfAq3+sozEAW+CXgFO/rKMxAFvgl4AAAAD//j/hAPoA0IADgAeACYAQ0BAJSQjISAIBgQCAUcCAQBFAQEAAgBvBQECBAJvBgEEAwMEUgYBBAQDWAADBANMHx8QDx8mHyYYFQ8eEB0iEAcFFisBIycHIyIGHQEDJjclNhcTMhYVERQGIyEiJjURNDYzATUnDwEnBxUDWGR81rQ0TGwKIAKoJA7QEBYWEP0sEBYWEAKcSKaCilwCBpaWTjSgASgmDvgKIv6MGBD+KBAYGBAB2BAY/jyioDyEqtZWAAAAAv/3/+ID2wMSABcAIAAmQCMAAgECbwMBAQAAAVQDAQEBAFgAAAEATBkYHRwYIBkgLwQFFSsBHgEGBwYmBgcGHgEHDgIjIiY3PgE3JAMyNjQmIgYUFgNZSDoSGhBMVCYeEjICAkS4fLrSCgjAeAEiSB4sLD4sLAJuMHxUBgQcCCouOkgOGkpKypB26iJU/YosQCoqQCwAAAAD//v/aAK/A1IABgAXADIAOkA3Eg0CBAUDAAIBAAJHAAMABQQDBWAABAACAAQCXgAAAQEAUgAAAAFYAAEAAUwyMSYlFxEiEQYFGCsXNSEVBicGNyE0LgI3PgEgFhcWDgMBBhYGFgYfARYfAhYXMzY/ATY/AT4CJyYg0QEaRkhGzv7ySFRABgisAVKqCgQoQEIw/oYECAQOAgkLAgsOH1gYUhhYGRUEEQ0GBgIQ/jpuaGgqAgLOSIhahkh4rKx4PGpWVGwBtAQgCB4GDxMEDxMselpediMdBx0WFiISxAAAAAMAAP/XA48C5QAZAB8AJQAmQCMkIyEgHh0bGggBAAFHDQEBRAMBAAEAbwIBAQFmERoRFQQFGCsBPgQ3ESIOAg8BJy4DJxEyHgIXBREWFxEmAREGBxE2AdAFFEpcol5fol5GDA4NCUpcomBeoGBGDf6/rGtuAfSobmwCdQUOJiAWAf1iGB4mCgoMCCQiFAICnhgeJAsL/j4OOQHBOv5MAcIOOv4/OQAAAAEAAAAAA6UCmAAVAB1AGg8BAAEBRwACAQJvAAEAAW8AAABmFBcUAwUXKwEUBwEGIicBJjQ/ATYyHwEBNjIfARYDpRD+IBAsEP7qDw9MECwQpAFuECwQTBACFhYQ/iAPDwEWECwQTBAQpQFvEBBMDwADAAD/cATiA00AGwAtAD0AnkAKDgEDAUYPCQIBREuwGFBYQDIKAQAHBgYAZQAEAAcABAdgAAYACAUGCGELAQUAAwkFA2AACQEBCVQACQkBWAIBAQkBTBtAMwoBAAcGBwAGbQAEAAcABAdgAAYACAUGCGELAQUAAwkFA2AACQEBCVQACQkBWAIBAQkBTFlAHx0cAQA8OTQxKCUiIBwtHS0ZFhEQDAoIBgAbARsMBRQrATIWFxEUBgcjFSchIiY3BzUiJicRNDYzITIWFQEzNTQ2NyE1NCYnISIGFxEUFgURNCYjISIGFxEUFjchMjYERkFaAVxANZz+YEFcAZ1BWgFcQAJxQVz88tFMNgFTIBX9jxUgAR4D9B4W/akgMAEgFQJxFSACsFpC/pRBWgGcnFxAnJxcQQFrQVxcQf5g6jZMATMWHgEgFf6VFh5pAWwVIDAf/q4VIAEeAAMAAP9pBMIDUQAPAB8ALAAwQC0ABQQCBAUCbQACAm4AAQAAAwEAYAADBAQDVAADAwRYAAQDBEwzNDU1NTMGBRorARUUBgchIiY9ATQ2MyEyFgMRFAYjISImNRE0NjMhMhYFNCYjISIGFBYzITI2BMEYE/uVERoaEQRrEhosGhL77RIaGhIEExIa/tAmHP55GyYmGwGHGygDJoMSGAEaEYMRGhr+vv2fERoaEQJhEhoaqhsmJjYmJgABAAAAAAH0ApIACwAGswoFAS0rARYUBwEGJjURNDYXAeYODv5UGCIiGAF4Ch4K/vYQFB4CAh4UEAAAAAACAAAAAAISArwACAARACNAIAUCBAMAAQBvAwEBAWYKCQEADg0JEQoRBQQACAEIBgUUKwEyFREUIjURNCEyFREUIjURNAG4WrT+/Fq0ArxA/cZCQgI6QED9xkJCAjpAAAABAAD/5wO2AikAFAAZQBYNAQABAUcCAQEAAW8AAABmFBcSAwUXKwkBBiInASY0PwE2MhcJATYyHwEWFAOr/mIKHgr+YgsLXQoeCgEoASgLHAxcCwGP/mMLCwGdCx4KXAsL/tgBKAsLXAscAAABAAAAAAO2AkYAFAAZQBYFAQACAUcAAgACbwEBAABmFxQSAwUXKyUHBiInCQEGIi8BJjQ3ATYyFwEWFAOrXAseCv7Y/tgLHAtdCwsBngscCwGeC2tcCgoBKf7XCgpcCx4KAZ4KCv5iCxwAAAABAAAAAAMSAe0ADwAYQBUAAQAAAVQAAQEAWAAAAQBMNTMCBRYrARUUBichIiYnNTQ2NyEyFgMSIBb9WhceASAWAqYXHgG3axYgAR4XaxceASAAAAACAAAAAAOPAq0ABgANAD9APAsBAwIMBAIBAwMBAAEDRwoBAkUCAQBEAAIEAQMBAgNeAAEAAAFSAAEBAFYAAAEASgcHBw0HDRIUEAUFFyslIRUnNxUhJTUhNRcHNQOP/WLf3wKe/IMCnt/ff2+op3DfcG+mqG8AAAAIAAD/kgOYAyoADwAbACcANwBCAE4AXQBpAIFAfiQgBgMBAlwwJh4YCgQHAwFNLhoSAgUGAFU8NgMEBWhHRT44FAYHBAVHAAMBAAEDAG0IAQAGAQAGawAGBQEGBWsABQQBBQRrAAQHAQQHawAHB24AAgEBAlQAAgIBWAkBAQIBTB0cAQBnZVdWTEs7OjMxIyEcJx0nAA8BDwoFFCsTIgcmJzY3FhcGFRQXBgcmBxQXBgcmNTQ3FhcGASIHJic2MzIXBgcmEyYnNjU0JzY3FjMyNxYXBhc2NzY3Bgc2NTQmJwYHJic2NxYzMjcWARYVFAcGByYnJic2PQE2AxYXFhUUBwYjIic24BYUMCw2Slw8BgQ+NhBuFDwUQjImLggBUBwWOjhUTnhuTFYaaqCCBA4mPBoeDhheKBB2JhA6Mi54BgKWvnJaRAxEBg4eFo4BYJYEQEIYQDBkCmQaDhICDlZsOjZuAfgKNExKLCYsEBAGEDA4BGIiGnJ2aoJuYD4yGAEwDiocHj4OJBr+NBhYFAoYHCwuFAhshA6WDi4EDpJWMDIKJExgsCRKkIICDmIB0ojMFiwSBjgEknYUFgoq/ewKCBIiUEAqDKAAAAAABAAA/70DawL/AAgAEQAiAHUAeUB2YgEIB11UAgAIb0I6NSolBgYBHAEFBgRHHwEFRAAIBwAHCGUNAQQJAQcIBAdeDAILAwADAQEGAAFgDgoCBgUFBlQOCgIGBgVYAAUGBUwjIxQSCgkBACN1I3VkY1dWTk08OxsZEiIUIg4NCREKEQUEAAgBCA8FFCsBIgYUFjI2NCYzIgYUFjI2NCYTISIGFREUFjMhJx8CETQmAyYnNjc2PwEGBwYHBicmJyYvARcWFxYXByYnJicmLwE0NzY3Nj8BNjc2PwEXBgcGDwE3Njc2MzYXFhcnJicmJzcXFhcWHwEWFxYXFhUHBgcGBwYBsxIYGSMZGYYSGBkjGRm5/dEjMjIjAdkWNTJaMsQODhgUDgsHFBwgHTU3Hh8PDxEHCg4SGBwgGxUSDQkHCQgNCQwJGx4WFREEIR0UEAwZMiwDBSspRTgLDxMbIAYRFRYeGwkMCQ0ICQcJDRIVGwGhGyYbGyYbGyYbGyYbAV4zI/3NJDJNMi5QAuwjM/3gERAHDQkMCQ0MDAYJCgUNBQkKCQsJDQciAQoIDQoLCi4xJicbGRMUCwkDAQUKDgoMCQwXAwEFBAkfCQsJDgoHAQMJCxQTGRsnJjEuCgsKDQgKAAAAAAIAAP/5A+gDUgAnAD8ATEBJKAEBBhEBAgE3LgIEAiEBBQQERwAGAQZvAAQCBQIEBW0ABQMCBQNrAAEAAgQBAmAAAwAAA1QAAwMAWAAAAwBMOhslNTYlMwcFGysBFRQGIyEiJjURNDY3ITIWHQEUBiMhIgYHERQWFyEyNj0BNDY7ATIWExEUDgEvAQEGIi8BJjQ3AScmNDYzITIWAxJeQ/4wQ15eQwGJBwoKB/53JTQBNiQB0CU0CggkCArWFhwLYv6UBRAEQAYGAWxiCxYOAR0PFAFMskNeXkMB0EJeAQoIJAgKNCX+MCU0ATYksggKCgHa/uMPFAIMYv6UBgZABQ4GAWxiCxwWFgAAAAAIAAD/xANZAwsAUwBaAF8AZABpAG4AcwB4AGpAZyQeGxUEBAFlDQIDAmoBBwZHAQUHBEcABAECAQQCbQACAwECA2sAAwYBAwZrAAYHAQYHawAHBQEHBWsABQVuCAEAAQEAVAgBAAABWAABAAFMAQBzcnFwRkQ4NzEwLCsdHABTAVMJBRQrATIeARUUBgcGJj0BNCc+BCc0JzYnJgYPASYiBy4CBwYXBhUUHgMXBgcOASImJy4BLwEiBh4BHwEeAR8BHgI2MzcVFBcUBicuATU0PgEDNicmBwYWFzYmBhYXNiYGFhc2JgYWFzYmBhY3NAYUNjcmBhY2Aa10xnKkgQ8OHSAyOCIaAiwVGRA8FRU0bjUIHkAPGRQsGCI4MCEVBgwaJiIOCyAMCwwIAggDBAwYBgYHIigmDA0BEA6BpHTClAIFBgIBChQECwcKFAYKCgocBA0JDSUBEQQRJhMTIAESAhIDC3TEdYzgKwMOCnY2GQMOHixIMEMwMz8FFg4NDw8GEhoGPzMwQy9ILhwQAhQmBQYYFxIWAwEECgYDAwYeDg0VGggCAzIcAgoOAyvgjHXEdP2YBAMBAgQGDwMLBgwVBA4HDhQEDQoMCQYFDAYEBwENAQsHAw4GAAAAAAH/+f+xAxgCwwAUABhAFQ4DAgABAUcAAQABbwAAAGY4JwIFFisBFgcBERQHBiMiLwEmNREBJjYzITIDDwkR/u0WBwcPCo8K/u0SExgCyhcCrRYR/u3+YhcKAwuPCw4BDwETESwAAAAABQAA/2oD6ANSAB8AIgAlADMAPABwQG0jAQAGHQEJACcgAgcFA0cAAwAGAAMGXgwBAAAJBQAJXgAFAAcEBQdgAAQACggECmAACAACCwgCYA0BCwEBC1INAQsLAVgAAQsBTDQ0AQA0PDQ8Ozk2NTAvLiwpKCUkIiEaFw4MCQYAHwEeDgUUKwEyFhcRFAYHISImJzUhIiYnETQ2PwE+ATsBMhYXFTYzDwEzAQczFzc1IxUUBgcjESE1NDYBESMVFAYnIxEDshceASAW/ekXHgH+0RceARYQ5A82FugXHgEmIUenp/6bp6dtsNYeF+kBHhYCJtceF+gCfCAW/VoXHgEgFqAgFgF3FjYP5BAWIBa3F3enAX2nwrDp6RYeAf6bjxY2/k4Cg+gWIAH+mgAABgAA/9QD6QLnAAgAEQAhACoAOgBKAF9AXEQ8OwMKCzQsAggJGxMCBAUDRwALAAoGCwpeAAcABgMHBmAACQAIAgkIYAADAAIBAwJgAAEFAAFUAAUABAAFBF4AAQEAWAAAAQBMSEZAPzg2JRMVFxYTFBMSDAUdKzcUBi4BND4BFjUUBiImNDYyFgEVFAYnISImPQE0NjchMhYBFAYiJjQ2MhYBFRQGIyEiJj0BNDYzITIWAxUUBgchIiY9ATQ2MyEyFtY+Wj4+Wj4+Wj4+Wj4DEgoI/VoICgoIAqYHDPztPlo+Plo+AxIKCP1aCAoKCAKmBwwBCgj9WggKCggCpgcMQCxAAjxcPAJA8i0+Plo+Pv7rawcMAQoIawcKAQwCAC0+Plo+Pv7rbAcKCgdsBwoKARZrBwoBDAZrCAoKAAYAAP9qA+kDTQAfAD0ATQBdAG0AfQIXQDdaWVUDFA93bgIOFG8BDQ4wAQcIZy8qAwoSRxwCAwU/HQ4DCwQGAQECBQEAAQlHXwEKFxMCAwJGS7AMUFhAYwAPFA9vFQEKEhEJCmUABAMLAwRlAAILAQMCZQAUDg0UVBYQAg4TAQ0IDg1eAAgABxIIB2AAEgARCRIRYAAJAAYFCQZfAAMEBQNUDAEFAAsCBQteAAEAAAFUAAEBAFgAAAEATBtLsCVQWEBkAA8UD28VAQoSEQkKZQAEAwsDBGUAAgsBCwIBbQAUDg0UVBYQAg4TAQ0IDg1eAAgABxIIB2AAEgARCRIRYAAJAAYFCQZfAAMEBQNUDAEFAAsCBQteAAEAAAFUAAEBAFgAAAEATBtLsCpQWEBlAA8UD28VAQoSERIKEW0ABAMLAwRlAAILAQsCAW0AFA4NFFQWEAIOEwENCA4NXgAIAAcSCAdgABIAEQkSEWAACQAGBQkGXwADBAUDVAwBBQALAgULXgABAAABVAABAQBYAAABAEwbQGYADxQPbxUBChIREgoRbQAEAwsDBAttAAILAQsCAW0AFA4NFFQWEAIOEwENCA4NXgAIAAcSCAdgABIAEQkSEWAACQAGBQkGXwADBAUDVAwBBQALAgULXgABAAABVAABAQBYAAABAExZWVlALE5OICB7eXNya2ljYU5dTl1cW1JRUE9LSUNCID0gPTw7JBsWERIYEyMiFwUdKxcUBgciJzcWMzI2NTQHJzY/ATY3NSIGJxUjNTMVBx4BExUjJjU0PgM3NCYHIgcnPgEzMhYVFA4CBzM1BRUUBichIiY9ATQ2MyEyFgEVIzUzNTQ3NSMGByc3MxUFFRQGIyEiJj0BNDYzITIWAxUUBgchIiY9ATQ2MyEyFtU+LDwkHxwgEBg7DgQOGAoKCSQJO7o1HCIBygQcIigWAxINGRQvDTYgKDgmLiYBRwNNCgj9WggKCggCpgcM/O27PAEBBRcoTDsDTgoI/VoICgoIAqYHDAEKCP1aCAoKCAKmBww2LTIBJTEZEBAjBB8GEh8NCAECAR5VMUEGKgFCWRQKHS4eGBgNDhABICEcIC4oHC4aHg8ismsHDAEKCGsICgwB8Dg4Qy0XBwoUKkfh2GwHCgoHbAcKCgEWawcKAQwGawgKCgACAAD/sQNZAwsAXABsAVpLsAlQWEAZNBACBQERAQAFLi0CBABmXgIKCQRHOQEBRRtLsApQWEAZNBACBQIRAQAFLi0CBABmXgIKCQRHOQEBRRtAGTQQAgUBEQEABS4tAgQAZl4CCgkERzkBAUVZWUuwCVBYQC4ACQgKCAllAAoKbgAFAAEFVAYCAgEHAwsDAAQBAGAABAgIBFQABAQIWAAIBAhMG0uwClBYQDMACQgKCAllAAoKbgABAgABVAAFAAIFVAYBAgcDCwMABAIAYAAECAgEVAAEBAhYAAgECEwbS7ASUFhALgAJCAoICWUACgpuAAUAAQVUBgICAQcDCwMABAEAYAAECAgEVAAEBAhYAAgECEwbQC8ACQgKCAkKbQAKCm4ABQABBVQGAgIBBwMLAwAEAQBgAAQICARUAAQECFgACAQITFlZWUAdAQBqaGJgU1FAPzg1MzEgHhQSDwcGAwBcAVwMBRQrEyYvATYzMhcWMzI3NjcyNwcXBiMiBwYVHwEWFxYXFjMyNzY3Njc2NzY1NC4BLwEmJyYPASc3MxcWNxcWFRQHBgcGBwYdARQXFhcWBwYHBgcOASMiLgEnJj0BNCcmATU0JiMhIgYdARQWMyEyNhsVBAIHDyIdShMvLkERHxEBASEkIQsHAQgDGRQiMTE7MB8YGwoUCQwECAQCAwoTGDgIAS9yK0MKAwIZFikDCAEFCAMMCA8VKSp5UV2EQw0JCQ4C+goI/MsICgoIAzUICgLWAQExAQMEAgIBAQgpBQ4HQqCdRSshExoQChIUEB8gKVcsOFAxISUMFAEBAjAGAggBFgcEDQcBBgMIDw8LBgvSbT0qGiQhHyU0VEMtV7ppDhT87yQICgoIJAgKCgAC////1QI8AucADgAdACNAIAABAAEBRwADAgNvAAIBAm8AAQABbwAAAGYVNCYUBAUYKyUUDwEGIi8BJjQ2NyEyFicUBiMhIi4BPwE2Mh8BFgI7CvoLHAv6CxYOAfQOFgEUD/4MDxQCDPoKHgr6CvMPCvoLC/oKHhQBFsgOFhYcC/oLC/oKAAAAAwAA/8wDWQL/AAMADgAqAEpARyIBBQEBRwcJAgEIBQgBBW0GBAIABQBwAAMAAggDAmAACAEFCFQACAgFWAAFCAVMAAApJyEgHBsWFBEQDQwJBgADAAMRCgUVKxMRIxE3FAYrASImNDYyFgERIxE0JiMiBgcGFREjNj0BJzMVIz4DNzIWw7jEOi4BLjg6XDgCi7cuMCMuDQa4AQG4AQsYJjwiX3QB9f3XAimrKTY2UjY2/kD+wwEoO0ImHREc/svfiqUbUBIaIBABfgAABf/9/7EDXwMLABMAHAAlADYAQwBCQD8dFAICAwFHAAkABgMJBmAFAQMEAQIBAwJgAAEAAAcBAGAABwgIB1QABwcIWAAIBwhMQUAXFxYTFBMZGRIKBR0rJQ4BLgEnJj4BFhceATI2Nz4BHgElFAYiJj4CFgUUBiIuAT4BFhc0LgIiDgIeAz4DNxQOASIuAj4BMh4BAnkVcI5yFAQOHBoEDkxeSg8EHBoQ/uYqOiwCKD4mASAqPCgCLDgujTpeho6IXDwCOGCEkoJiNklyxujIbgZ6vPS6fvpDVAJQRQ4aCQwQLDg4LA8OChrlHioqPCgCLBweKio8KAIsq0mEYDg4YISShF48BDRmfE11xHR0xOrEdHTEAAAAAA8AAP/5BDACfAALABcAIwAvADsARwBTAF8AawB3AIMAjwCfAKMAswCMQIlIAQIDAUcAHgAbBR4bXhoXFQ8LBQUWFA4KBAQDBQRgGRENCQQDGBAMCAQCAQMCYRMHAgESBgIAHAEAYB8BHB0dHFIfARwcHVgAHRwdTKCgsq+qp6CjoKOioZ+cmpiVko+MiYaDgH16d3RxbmtoZWJfXFlWUlBNSkdEQT47ODMzMzMzMzMzMiAFHSs3FRQrASI9ATQ7ATI3FRQrASI9ATQ7ATInFRQrASI9ATQ7ATIBFRQjISI9ATQzITIlFRQrASI9ATQ7ATInFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATInFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATIBFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATIXFRQrASI9ATQ7ATU0OwEyExEhEQERFAYjISImNRE0NjMhMhbWCTUJCTUJSAl9CQl9CUgJNQkJNQkCPAn+HgkJAeIJ/psJNgkJNglICTUJCTUJ1gg2CQk2CEcJNQkJNQnWCTUJCTUJ1wk2CQk2Cf7iCTYJCTYJjwk2CQk2CY8JfQkJPgk2CUf8XwPoKB/8Xx0qKh0DoR4qxjUJCTUJhjUJCTUJhjYJCTYJ/tk1CQk1CYY1CQk1CYY2CQk2CZg1CQk1CYY2CQk2CZg1CQk1CZg1CQk1CQEVNgkJNgkJNgkJNgkJxAkJNQmGCf5TAfT+DAH0/gwdKiodAfQeKioAAAADAAD/uQQWAroAFAAkADkAHkAbLhECAAEBRwMBAQABbwIBAABmNTQoJxcSBAUWKyUHBiInASY0NwE2Mh8BFhQPARcWFAEDDgEvAS4BNxM+AR8BHgEJAQYiLwEmND8BJyY0PwE2MhcBFhQBWBwFDgb+/AYGAQQFEAQcBgbb2wYBRNACDgYiCAYB0QIMByMHCAFs/vwGDgYcBQXb2wUFHAYOBgEEBUUcBQUBBQUOBgEEBgYcBRAE3NsGDgJO/S8HCAMJAwwIAtAIBgEKAg7+j/77BQUcBg4G29wFDgYcBgb+/AUQAAACAAD/sQLLAwsABgAhAChAJQcBAAIDAQEAAkcAAQABcAACAAACVAACAgBWAAACAEo8HhEDBRcrAREjETY3NhMRFA4GIi8BLgU1ETQ2MyEyFgJf+kM0g2skOkpCRh4PEAYYD0ZATjYmFg4Cgw4WAToBZf2GIylnAg/+UzBeSkQuKBAHBAsHKixGSGAvAa0OFhYAAAAAAv/9/7EDXwMLABQAIQAoQCUFAQEAAUcAAwAAAQMAYAABAgIBVAABAQJYAAIBAkwVFBcbBAUYKyU3NjQvATc2NC8BJiIPAQYUHwEWMgEUDgEiLgI+ATIeAQH7OQsLq6sLCzkKHgr9Cwv9CxwBaXLG6MhuBnq89Lp+SDkKHgqrqwscDDkKCv4KHgr9CwEhdcR0dMTqxHR0xAAC//3/sQNfAwsAFAAhAChAJQ0BAQABRwADAAABAwBgAAECAgFUAAEBAlgAAgECTBUUHBYEBRgrJTc2NC8BJiIPAQYUHwEHBhQfARYyARQOASIuAj4BMh4BAZD+Cgr+Ch4KOQsLq6sLCzkLHAHUcsboyG4Gerz0un5I/QscC/4KCjkLHgqrqwscCzkLASF1xHR0xOrEdHTEAAUAAP+WAxIDMwAKABUAKQBCAGQAIkAfVj88IAAFAUUAAQAAAVQAAQEAWAAAAQBMPj0yMQIFFCsBFgYnLgE2NzYeARcuAQcOARceAT4BEy4BLwEmBw4CBx4BHwEWPwE+ARMOAwcOASYnLgMnJic/ARYgNx4BBhMGAw4CBwYnJicuAi8CLgEnPgM/ATY3NhcWFxYUAccEQB8VEA4WFCoePghuNyMqAQNSZkR/CygMKKKaGBoiCxA0DzF/ezIPMjEECgQcEzB0bDsZKC4kCw4RAwp8AT58DAIIZQ8vAxgYE4zIi1EIDAgBBh8GDgUCEBIiCBtGadOmViIJAXMjLBMJLi4JCwggCjxAGQ9EJjNICVYBYQ8UAgcaGwQGEg8QFAIGEA8HAhT9zg44JigMGxoCCQUKFB4TNm0JBVNTAxQeAhNe/vARHBIIRhUPPwYQGAcqrSJiJw4aEBIDChoKFTEZKwsiAAAABAAA/2oDoQMLAAMABwALAA8AMUAuDwwHBAQBRQoJAgEEAEQDAQEAAW8FAgQDAABmCAgAAA4NCAsICwYFAAMAAwYFFCsBESURAREhEQERJREBESERAX3+gwF9/oMDof4FAfv+BQEh/pQ1ATcBnv6RATv+lv5JRgFxAer+RQF1AAACAAD/agONA0EAFQA2AExASS0BBQQLAQYFNhcBAAQCAwNHAAQFBG8AAgMBAwIBbQAFAAYHBQZeAAcAAwIHA2AAAQAAAVQAAQEAWAAAAQBMIREWJyImLCMIBRwrJRcOASMiLgE1NDY3Fw4BFRQWFzI+ASUXBwYjIicDISImJwMmNz4BFzIWBxQGJxczFSMXMzIfAQI7OSGoaleUVnRgCURSlGZHdkIBLSCPBwkWCoX++A0UAjYBBQcwHiU2ATomFOzjCf4XCX+8cmR8VpRXZaghSR58S2eSAUp6D0BHBBMBCxINAbMKDhwkATQlJzYEoUhHE/4AAwAA/2oELwNSAAwAJgAwAFVAUgwBAgBFAgEAAQBvAAEDAW8JBwUDAwQDbwwKCAYEBAALDQQLXg8BDQ4ODVQPAQ0NDlYADg0OSignLCsnMCgvJiQhIB0bGhkRERERERISMhIQBR0rAQUVIxQGJyEiJicjNRczETMRMxEzETMRMxEzETMyFgcVITU0NhczBTIWHQEhNTQ2NwIYAhdHFhD8rBAWAUePj0ePR49IjyEPGAH8XxgPIQN6EBb70RYRA1LWSA4WARQPSI/+UwGt/lMBrf5TAa3+UxQPJCQOFgFrFg5HRw8UAQAAAAH///+xA0gDCwAjADZAMxIBAwITAQADAkcAAgADAAIDYAAAAAUEAAVeAAQBAQRUAAQEAVgAAQQBTBUlIyclEAYFGisBIRYVFA4BIyIuAz4CMzIXByYjIg4BFB4BMzI+AzcjAa0BlAdmvHlYnnRCAkZwolaneHVEZkh6SEh6SDBSNCgQBfMBmyUieb5sRHKgrqByRHFwQ0p6lnpKHCY2LBUAAAAAFAAA/2oDEgNSAA8AHwAvAD8ATwBfAG8AfwCPAJ8ArwC/AM8A3wDvAP8BDwEfAS8BPwILQUYAAwABAAMAAAE5ATgBMQDpAOEAmQCRABkAEQAJAAIAAwEpASgBIQDZANEAiQCBACkAIQAJAAQABQEZAREAyQDBAHkAcQA5ADEACAAGAAcBCQEIAQEAuQCxAGkAYQBJAEEACQAIAAkA+QD4APEAWQBRAAUAFAAKAKkAoQACABUACwALAAEAAQAVAAgAR0uwCVBYQGAfAQsUFRULZSgBACYcEgMDAgADYCcdEwMCJBoQAwUEAgVgJRsRAwQiGA4DBwYEB2AjGQ8DBiAWDAMJCAYJYB4BChQIClQhFw0DCAAUCwgUYAAVAQEVVAAVFQFZAAEVAU0bQGEfAQsUFRQLFW0oAQAmHBIDAwIAA2AnHRMDAiQaEAMFBAIFYCUbEQMEIhgOAwcGBAdgIxkPAwYgFgwDCQgGCWAeAQoUCApUIRcNAwgAFAsIFGAAFQEBFVQAFRUBWQABFQFNWUFXAAEAAAE9ATsBNQEzAS0BKwElASMBHQEbARUBEwENAQsBBQEDAP0A+wD1APMA7QDrAOUA4wDdANsA1QDTAM0AywDFAMMAvQC7ALUAswCtAKsApQCjAJ0AmwCVAJMAjQCLAIUAgwB9AHsAdQBzAG0AawBlAGMAXQBbAFUAUwBNAEsARQBDAD0AOwA1ADMALQArACUAIwAdABsAFQATAAkABwAAAA8AAQAPACkABQAUKwEyFhcRFAYHISImJxE0NjcXFRQWOwEyNj0BNCYrASIGHQEUFjsBMjY9ATQmKwEiBh0BFBY7ATI2PQE0JisBIgYdARQWOwEyNj0BNCYrASIGBzU0JisBIgYdARQWOwEyNj0BNCYrASIGHQEUFjsBMjY9ATQmKwEiBh0BFBY7ATI2PQE0JisBIgYdARQWOwEyNj0BNCYrASIGHQEUFjsBMjYBNTQmKwEiBh0BFBY7ATI2ETU0JisBIgYdARQWOwEyNj0BNCYrASIGHQEUFjsBMjY9ATQmKwEiBh0BFBY7ATI2PQE0JisBIgYdARQWOwEyNhM1NCYrASIGBxUUFjsBMjY9ATQmKwEiBgcVFBY7ATI2PQE0JisBIgYHFRQWOwEyNj0BNCYrASIGBxUUFjsBMjY9ATQmKwEiBgcVFBY7ATI2Au4PFAEWDv02DxQBFg76CggjCAoKCCMICgoIIwgKCggjCAoKCCMICgoIIwgKCggjCAoKCCMICkgKCCMICgoIIwgKCggjCAoKCCMICgoIIwgKCggjCAoKCCMICgoIIwgKCggjCAoKCCMICgEeCgiyCAoKCLIICgoIJAcKCgckCAoKCCQHCgoHJAgKCggkBwoKByQICgoIJAcKCgckCAqPCggkBwoBDAYkCAoKCCQHCgEMBiQICgoIJAcKAQwGJAgKCggkBwoBDAYkCAoKCCQHCgEMBiQICgNSFg78YA8UARYOA6APFAGhIwgKCggjCAoKlyMICgoIIwgKCpYkCAoKCCQHCgqWJAgKCggkCAoKuyQICgoIJAgKCpckCAoKCCQICgqXJAcKCgckCAoKlyMICgoIIwgKCpcjCAoKCCMICgr9PWsICgoIawgKCgEmJAgKCggkCAoKlyQHCgoHJAgKCpcjCAoKCCMICgqXIwgKCggjCAoK/cwkCAoKCCQICgqXJAgKCggkCAoKlyQHCgoHJAgKCpcjCAoKCCMICgqXIwgKCggjCAoKAAAABAAA/2oDWwNSAA4AHQAsAD0AckBvOQwDAwcGKiECAQAbEgIFBANHCwEAKQEEGgECA0YLAQYHBm8ABwAHbwgBAAABBAABYAoBBAAFAgQFYAkBAgMDAlQJAQICA1gAAwIDTC4tHx4QDwEANjUtPS49JiUeLB8sFxYPHRAdCAcADgEODAUUKwEyNjcVFA4BIi4BJzUeARMyNjcVFA4BIi4BJzUeATcyNjcVFA4CLgEnNR4BEzIeAQcVFA4BIi4BJzU0PgEBrYTmQnLI5MpuA0LmhYTmQnLI5MpuA0LmhYTmQnLI5MpuA0LmhXTEdgJyyOTKbgN0xAGlMC9fJkImJkImXy8w/lQwL18nQiYmQidfLzDWMC9fJkImAio+KF8vMAKDJkInRydCJiZCJ0cnQiYAAAb//v9qA+oDUgAQABkAIQAqADMAOwByQG8YEwIDAhcUAgcDOTg1Hx4bBgYHKCUCBQYpJAIEBQVHCAEACQECAwACYAADAAcGAwdgCwEGAAUEBgVgCgEEAQEEVAoBBAQBWAABBAFMLCsjIhIRAQAwLyszLDMnJiIqIyoWFREZEhkJCAAQARAMBRQrATIeAw4CIi4CPgMXIgcXNjIXNyYBNyY0NycGFAEyNycGIicHFjcyNi4BDgIWJRc2NCcHFhQB9Ga4iEwEVIDAxMCAVARMiLhmal9sLl4ubWD+HGwQEGwzAa1qYG0uXi5sX2pZfgJ6tngGhAFjbDMzbBADUlCEvMi8hFBQhLzIvIRQRzNsEBBsM/2KbC5eLm1g1P69M2wQEGwz136wgAR4uHZ1bF/UYG0uXgAAAQAA/7EDxQMLAH4ATkBLWVQ0AwYFFwECAQgBAAIDRwgBBAkHAgUGBAVgAAYAAQIGAWAKAQIAAAJUCgECAgBYAwEAAgBMenlwb2tlYF9YVU9OSkR0Fj1gCwUYKwUiJiIGIyImNzQ+Ajc2PQE0JyYjISIPARQXHgEyFhcUBgciJiIGIyImNTQ+Ajc2NScRNzYmNC8BLgEnLgEGJjc0NjcyFjI2MzIWFRQGIgYHBhUXFjMhMjc2PQE0Jy4CNTQ2NzIWMjYzMhYVFAYiBgcGFRMUFx4BMhYXFAYDqxliMmIZDRABEhogCRIBBxX+iBYHARUJIh4UAQwPGmgxXhgNDhIWHgkSAQEBAgIEAggFCCIYFgEMDhpoMGAWDg4SGhwKFAEHDwGGDgcBEwouHA4OGGQvYBgODhQYIgcUARMJIBwSAQxPBAQYDRIQAgYGC0PaDAUDA+BPDAYEEBIOGAEEBBgNERAEBAcNQx8Bxg8NDhwKFAoQAgUEAhASDhgBBAQaDREQBAUMTsQCAgYMsk4MBgIMFg4YAQQEGg0REAQFDU398kIMBgQSEA4YAAUAAP9qA+gDUgAQABQAJQAvADkAbEBpMykCBwghAQUCHRUNDAQABQNHBAEFAUYGDAMLBAEHAgcBAm0AAgUHAgVrAAUABwUAawQBAABuCgEIBwcIVAoBCAgHVgkBBwgHShERAAA3NTIxLSsoJyQiHx4bGREUERQTEgAQAA83DQUVKwERFAYHERQGByEiJicREzYzIREjEQERFAYHISImJxEiJicRMzIXJRUjNTQ2OwEyFgUVIzU0NjsBMhYBiRYOFBD+4w8UAYsEDQGfjgI7Fg7+4w8UAQ8UAe0NBP4+xQoIoQgKAXfFCgihCAoCn/5UDxQB/r8PFAEWDgEdAegM/ngBiP4M/uMPFAEWDgFBFg4BrAytfX0ICgoIfX0ICgoAAAIAAP+xBHcDCwAFAAsANEAxCwoJAwMBAUcAAQMBbwADAgNvBAECAAACUgQBAgIAVgAAAgBKAAAIBwAFAAUREQUFFisFFSERMxEBEyEREwEEd/uJRwNajvxg+gFBB0gDWvzuAjv+DAFCAUH+vwAAAAABAAD/sQLKA1MASgBFQEIjAQUCEwEBAwJHHAEBRAACBAUEAgVtAAUDBAUDawAAAAQCAARgAAMBAQNUAAMDAVgAAQMBTEVEOzkxLyknKCUGBRYrETQ+AxcyHgEVFA4DJyImJwcOBQ8BJyY1NDY/ASY1NDY3MhYVFA4BFjMyPgQ3NCYjIgYVFB4CFRQGIycuAypKYG46WJheFDBAYDomShEPCggOEBIiEgcFCRgZHRI6LSImMAEyJB80JBoQBgF6Y2+WDhAOEA0JHSwYDAIFPGpQOh4BSo5ZNmZgRi4CJB8/KRg4FjAoHAMGWBEzgGFxJDovUAEuIiWKRy4cMDpAPBpgbJBvGS4aGgQPMgEJLD46AAQAAP+3A+gDBQASABUAHAAoACFAHichIBwWFRQTEQ4KAAEBRwABAAFvAAAAZiQjFAIFFSsBERQGByInJS4BNRE0NjcyFwUWFwElAREUDgEvAQEUAAcDEzYzMhcFFgFNDg0KCf79DBAMCggQAR4BJAEq/tYCdxAaDfYBK/7iGNq1CRQIBgEuAgJn/XEOEgEEgwUaDQJ8DA4BCI8COf4clQFF/bMOEAIIewItAv4wKAFhASYQA5cBAAAF//7/kgPqAyoABQAIAA4AFAAaACFAHhQIAQMARAQBAgECbwMBAQABbwAAAGYSFxITFgUFGSsTCQEuATclIQMBEyETNjIBFxYGBwkBIRM2Mhc6Abr+HAoIBAE6AXC4/tlv/v5vBBwC5TgECAr+HAG6/v5vBBwFAcj9ygFfBxgMrP3KA4z+qgFWDP6erAwYB/6hAjYBVgwMAAIAAP9oA+gDVAAWACcAIkAfFBAKAwACAUcAAgACbwAAAQBvAAEBZiQjHBsSEQMFFCslEzYmBwUOARYfASU2FxYPAjI/ARcWARQOAy4CND4CHgMCmFIFFhL+HhAMCA58AR4MBgQH5wkNDDx9JAFaUIS8yLyEUFCEvMi8hFB5AYIZFgi5BhAOBCa0CAUDBdJ/DTpdFAEPZriITARUgMDEwIBUBEyIuAAAAAEAAAABAADVqffIXw889QALA+gAAAAA2lQvaQAAAADaVC9p/+P/OgTiA4EAAAAIAAIAAAAAAAAAAQAAA1L/agAABOL/4//jBOIAAQAAAAAAAAAAAAAAAAAAAGcD6AAAAsoAAAPp//4D6P//A1kAAANZAAADoAAAA6AAAAMRAAADoAAAAjsAAAI7AAADoAAAA6AAAAOqAAAD6AAAA+gAAAMRAAACO///A1kAAALKAAACygAAA1kAAAOgAAAD6AAAAxAAAAMtAAADWf/9BAL/4wOE//4DoAAAA6AAAAMuAAAD6P/4A+f//gMRAAAD6AAAA+gAAAKCAAADoP//A+gAAAQv//8COwAAA+gAAANZAAADmAAAAxH//wOgAAADrQAAA+gAAAMRAAACOwAAA1z/+QNZAAADmAAAA5j//APoAAADoAAAA+j/+APU//cCvP/7A6AAAAPoAAAE4gAABMEAAAH0AAACEgAAA+gAAAPoAAADEQAAA6AAAAOYAAAD/QAAA+gAAANZAAADEf/5A+gAAAPoAAAD6AAAA1kAAAI7//8DWQAAA1n//QQvAAAELwAAAsoAAANZ//0DWf/9AxEAAAOgAAADoAAABHYAAANZ//8DWQAAA1kAAAPo//4D6AAAA+gAAAR2AAACygAAA+gAAAPo//4D6AAAAAAAAABEAKwBmgIkAuYDVgO0A/4EZgSOBMgFKgWuBnIG0AcQB1gHfgfkCBgITgimCQ4JWgnACmIKtAsOC1wMPAycDWYN3A4+DvgPyBAuEHYQxhFoEiwSahMIE+IUOBTAFbAWSBc+F+wYYhjCGWoZtBouGnIasBsSG14bzhwiHFodBh1iHYAdsB3mHhweRh6CH2ggWiDgIc4iAiKYIzYk7iY4Jnwm4iduKJApAilMKZgp5CqWKtYrUCvELBYuqi9CL9wwsDFAMXgyADJcMqgy+wABAAAAZwFAABQAAAAAAAIAUgBiAHMAAAESC3AAAAAAAAAAEgDeAAEAAAAAAAAANQAAAAEAAAAAAAEACAA1AAEAAAAAAAIABwA9AAEAAAAAAAMACABEAAEAAAAAAAQACABMAAEAAAAAAAUACwBUAAEAAAAAAAYACABfAAEAAAAAAAoAKwBnAAEAAAAAAAsAEwCSAAMAAQQJAAAAagClAAMAAQQJAAEAEAEPAAMAAQQJAAIADgEfAAMAAQQJAAMAEAEtAAMAAQQJAAQAEAE9AAMAAQQJAAUAFgFNAAMAAQQJAAYAEAFjAAMAAQQJAAoAVgFzAAMAAQQJAAsAJgHJQ29weXJpZ2h0IChDKSAyMDIwIGJ5IG9yaWdpbmFsIGF1dGhvcnMgQCBmb250ZWxsby5jb21mb250ZWxsb1JlZ3VsYXJmb250ZWxsb2ZvbnRlbGxvVmVyc2lvbiAxLjBmb250ZWxsb0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMgAwACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAAR1c2VyBmZvbGRlcgRsaXN0BWxvZ2luA2NvZwd0d2l0dGVyC2FydGljbGUtYWx0BmNhbmNlbARob21lCGRvd24tZGlyCGZhY2Vib29rCGFzdGVyaXNrBnVwbG9hZAlzdG9wd2F0Y2gGZXhwb3J0BWhlYXJ0BHBsdXMGdXAtZGlyBG1lbnUJbGVmdC1vcGVuCnJpZ2h0LW9wZW4FaW5ib3gGd3JlbmNoB2NvbW1lbnQNc3RhY2tvdmVyZmxvdwhxdWVzdGlvbgpvay1jaXJjbGVkB3dhcm5pbmcEbWFpbARsaW5rB2tleS1pbnYFdHJhc2gIZG93bmxvYWQHZ2xhc3NlcwZxcmNvZGUHc2h1ZmZsZQNleWUEbG9jawZzZWFyY2gEYmVsbAV1c2Vycwhsb2NhdGlvbglicmllZmNhc2UJaW5zdGFncmFtBWNsb2NrBXBob25lCGNhbGVuZGFyBXByaW50BGVkaXQEYm9sZAZpdGFsaWMGcm9ja2V0CHdoYXRzYXBwBWRvdC0zDGluZm8tY2lyY2xlZAh2aWRlb2NhbQtxdW90ZS1yaWdodAdwaWN0dXJlB3BhbGV0dGUEbGFtcAlib29rLW9wZW4Cb2sIY2hhdC1hbHQHYXJjaGl2ZQRwbGF5BXBhdXNlCWRvd24tb3Blbgd1cC1vcGVuBW1pbnVzCGV4Y2hhbmdlB25ldHdvcmsMaWNvbi1kaXNjb3JkCGxpbmstZXh0DmdpdGh1Yi1jaXJjbGVkBmZpbHRlcgRkb2NzC2xpc3QtYnVsbGV0DWxpc3QtbnVtYmVyZWQJdW5kZXJsaW5lBHNvcnQIbGlua2VkaW4Fc21pbGUIa2V5Ym9hcmQEY29kZQZzaGllbGQSYW5nbGUtY2lyY2xlZC1sZWZ0E2FuZ2xlLWNpcmNsZWQtcmlnaHQJYml0YnVja2V0B3dpbmRvd3MKd2hlZWxjaGFpcgRiYW5rBmdvb2dsZQ9idWlsZGluZy1maWxsZWQIZGF0YWJhc2UIbGlmZWJ1b3kGaGVhZGVyCmJpbm9jdWxhcnMKY2hhcnQtYXJlYQlwaW50ZXJlc3QGbWVkaXVtBmdpdGxhYgh0ZWxlZ3JhbQAAAAAAAAEAAf//AA8AAAAAAAAAAAAAAAAAAAAAABgAGAAYABgDgf86A4H/OrAALCCwAFVYRVkgIEu4AA5RS7AGU1pYsDQbsChZYGYgilVYsAIlYbkIAAgAY2MjYhshIbAAWbAAQyNEsgABAENgQi2wASywIGBmLbACLCBkILDAULAEJlqyKAEKQ0VjRVJbWCEjIRuKWCCwUFBYIbBAWRsgsDhQWCGwOFlZILEBCkNFY0VhZLAoUFghsQEKQ0VjRSCwMFBYIbAwWRsgsMBQWCBmIIqKYSCwClBYYBsgsCBQWCGwCmAbILA2UFghsDZgG2BZWVkbsAErWVkjsABQWGVZWS2wAywgRSCwBCVhZCCwBUNQWLAFI0KwBiNCGyEhWbABYC2wBCwjISMhIGSxBWJCILAGI0KxAQpDRWOxAQpDsAFgRWOwAyohILAGQyCKIIqwASuxMAUlsAQmUVhgUBthUllYI1khILBAU1iwASsbIbBAWSOwAFBYZVktsAUssAdDK7IAAgBDYEItsAYssAcjQiMgsAAjQmGwAmJmsAFjsAFgsAUqLbAH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RyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -9,7 +9,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?6356454#fontello') format('svg'); + src: url('../font/fontello.svg?91940793#fontello') format('svg'); } } */ @@ -115,6 +115,7 @@ .icon-minus:before { content: '\e844'; } /* '' */ .icon-exchange:before { content: '\e845'; } /* '' */ .icon-network:before { content: '\e846'; } /* '' */ +.icon-discord:before { content: '\e847'; } /* '' */ .icon-link-ext:before { content: '\f08e'; } /* '' */ .icon-github-circled:before { content: '\f09b'; } /* '' */ .icon-filter:before { content: '\f0b0'; } /* '' */ From 76e09fb78fc9863efe3571f04c6765c68313534c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 27 Jan 2020 08:14:14 +0200 Subject: [PATCH 097/237] Updated SDK platforms --- app/config/platforms.php | 1 + app/controllers/api/account.php | 20 +++++++++++++++++++- app/controllers/api/avatars.php | 6 ++++++ app/controllers/api/database.php | 10 ++++++++++ app/controllers/api/health.php | 8 ++++++++ app/controllers/api/locale.php | 6 ++++++ app/controllers/api/storage.php | 9 +++++++++ app/controllers/api/teams.php | 9 +++++++++ app/controllers/api/users.php | 10 ++++++++++ 9 files changed, 78 insertions(+), 1 deletion(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index 1c1a2442ee..b1f8504970 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -6,6 +6,7 @@ const APP_PLATFORM_ANDROID = 'android'; const APP_PLATFORM_UNITY = 'unity'; const APP_PLATFORM_FLUTTER = 'flutter'; const APP_PLATFORM_SERVER = 'server'; +const APP_PLATFORM_CLIENT = 'client'; return [ APP_PLATFORM_WEB => [ diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 4804c2f789..f052040b9a 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -44,6 +44,7 @@ $utopia->init(function() use ($providers, &$oauthKeys) { $utopia->get('/v1/account') ->desc('Get Account') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccount') ->label('sdk.description', '/docs/references/account/get.md') @@ -64,6 +65,7 @@ $utopia->get('/v1/account') $utopia->get('/v1/account/prefs') ->desc('Get Account Preferences') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountPrefs') ->label('sdk.description', '/docs/references/account/get-prefs.md') @@ -85,6 +87,7 @@ $utopia->get('/v1/account/prefs') $utopia->get('/v1/account/sessions') ->desc('Get Account Sessions') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountSessions') ->label('sdk.description', '/docs/references/account/get-sessions.md') @@ -142,6 +145,7 @@ $utopia->get('/v1/account/sessions') $utopia->get('/v1/account/logs') ->desc('Get Account Logs') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccountLogs') ->label('sdk.description', '/docs/references/account/get-logs.md') @@ -216,6 +220,7 @@ $utopia->post('/v1/account') ->desc('Create Account') ->label('webhook', 'account.create') ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccount') ->label('sdk.description', '/docs/references/account/create.md') @@ -311,6 +316,7 @@ $utopia->post('/v1/account/sessions') ->desc('Create Account Session') ->label('webhook', 'account.sessions.create') ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccountSession') ->label('sdk.description', '/docs/references/account/create-session.md') @@ -393,6 +399,7 @@ $utopia->get('/v1/account/sessions/oauth/:provider') ->desc('Create Account Session with OAuth') ->label('error', __DIR__.'/../../views/general/error.phtml') ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccountSessionOAuth') ->label('sdk.description', '/docs/references/account/create-session-oauth.md') @@ -621,6 +628,7 @@ $utopia->patch('/v1/account/name') ->desc('Update Account Name') ->label('webhook', 'account.update.name') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateAccountName') ->label('sdk.description', '/docs/references/account/update-name.md') @@ -656,6 +664,7 @@ $utopia->patch('/v1/account/password') ->desc('Update Account Password') ->label('webhook', 'account.update.password') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateAccountPassword') ->label('sdk.description', '/docs/references/account/update-password.md') @@ -696,6 +705,7 @@ $utopia->patch('/v1/account/email') ->desc('Update Account Email') ->label('webhook', 'account.update.email') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateEmail') ->label('sdk.description', '/docs/references/account/update-email.md') @@ -751,6 +761,7 @@ $utopia->patch('/v1/account/prefs') ->desc('Update Account Preferences') ->label('webhook', 'account.update.prefs') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updatePrefs') ->param('prefs', '', function () { return new Assoc();}, 'Prefs key-value JSON object.') @@ -790,6 +801,7 @@ $utopia->delete('/v1/account') ->desc('Delete Account') ->label('webhook', 'account.delete') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'delete') ->label('sdk.description', '/docs/references/account/delete.md') @@ -836,6 +848,7 @@ $utopia->delete('/v1/account/sessions/:id') ->desc('Delete Account Session') ->label('scope', 'account') ->label('webhook', 'account.sessions.delete') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteAccountSession') ->label('sdk.description', '/docs/references/account/delete-session.md') @@ -880,6 +893,7 @@ $utopia->delete('/v1/account/sessions/current') ->desc('Delete Current Account Session') ->label('webhook', 'account.sessions.delete') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteAccountCurrentSession') ->label('sdk.description', '/docs/references/account/delete-session-current.md') @@ -909,10 +923,11 @@ $utopia->delete('/v1/account/sessions/current') } ); - $utopia->delete('/v1/account/sessions') +$utopia->delete('/v1/account/sessions') ->desc('Delete All Account Sessions') ->label('scope', 'account') ->label('webhook', 'account.sessions.delete') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'deleteAccountSessions') ->label('sdk.description', '/docs/references/account/delete-sessions.md') @@ -953,6 +968,7 @@ $utopia->delete('/v1/account/sessions/current') $utopia->post('/v1/account/recovery') ->desc('Password Recovery') ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'createAccountRecovery') ->label('sdk.description', '/docs/references/account/create-recovery.md') @@ -1044,6 +1060,7 @@ $utopia->post('/v1/account/recovery') $utopia->put('/v1/account/recovery') ->desc('Password Reset') ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateAccountRecovery') ->label('sdk.description', '/docs/references/account/update-recovery.md') @@ -1191,6 +1208,7 @@ $utopia->put('/v1/account/recovery') $utopia->put('/v1/account/verification') ->desc('Updated Verification') ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') ->label('sdk.method', 'updateAccountVerification') ->label('sdk.description', '/docs/references/account/update-verification.md') diff --git a/app/controllers/api/avatars.php b/app/controllers/api/avatars.php index 017fa8acbb..d08983d7d0 100644 --- a/app/controllers/api/avatars.php +++ b/app/controllers/api/avatars.php @@ -94,6 +94,7 @@ $utopia->get('/v1/avatars/credit-cards/:code') ->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) ->param('quality', 100, function () { return new Range(0, 100); }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) ->label('scope', 'avatars.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getCreditCard') ->label('sdk.description', '/docs/references/avatars/get-credit-card.md') @@ -107,6 +108,7 @@ $utopia->get('/v1/avatars/browsers/:code') ->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) ->param('quality', 100, function () { return new Range(0, 100); }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) ->label('scope', 'avatars.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getBrowser') ->label('sdk.description', '/docs/references/avatars/get-browser.md') @@ -120,6 +122,7 @@ $utopia->get('/v1/avatars/flags/:code') ->param('height', 100, function () { return new Range(0, 2000); }, 'Image height. Pass an integer between 0 to 2000. Defaults to 100', true) ->param('quality', 100, function () { return new Range(0, 100); }, 'Image quality. Pass an integer between 0 to 100. Defaults to 100', true) ->label('scope', 'avatars.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getFlag') ->label('sdk.description', '/docs/references/avatars/get-flag.md') @@ -132,6 +135,7 @@ $utopia->get('/v1/avatars/image') ->param('width', 400, function () { return new Range(0, 2000); }, 'Resize preview image width, Pass an integer between 0 to 4000', true) ->param('height', 400, function () { return new Range(0, 2000); }, 'Resize preview image height, Pass an integer between 0 to 4000', true) ->label('scope', 'avatars.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getImage') ->label('sdk.description', '/docs/references/avatars/get-image.md') @@ -197,6 +201,7 @@ $utopia->get('/v1/avatars/favicon') ->desc('Get Favicon') ->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]) ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getFavicon') ->label('sdk.description', '/docs/references/avatars/get-favicon.md') @@ -349,6 +354,7 @@ $utopia->get('/v1/avatars/qr') ->param('margin', 1, function () { return new Range(0, 10); }, 'Margin From Edge. Pass an integer between 0 to 10. Defaults to 1.', true) ->param('download', 0, function () { return new Range(0, 1); }, 'Return resulting image with \'Content-Disposition: attachment \' headers for the browser to start downloading it. Pass 0 for no header, or 1 for otherwise. Default value is set to 0.', true) ->label('scope', 'avatars.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'avatars') ->label('sdk.method', 'getQR') ->label('sdk.description', '/docs/references/avatars/get-qr.md') diff --git a/app/controllers/api/database.php b/app/controllers/api/database.php index db42b6d473..aba5c94485 100644 --- a/app/controllers/api/database.php +++ b/app/controllers/api/database.php @@ -27,6 +27,7 @@ $utopia->get('/v1/database') ->desc('List Collections') ->label('scope', 'collections.read') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'listCollections') ->label('sdk.description', '/docs/references/database/list-collections.md') ->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true) @@ -74,6 +75,7 @@ $utopia->get('/v1/database/:collectionId') ->desc('Get Collection') ->label('scope', 'collections.read') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'getCollection') ->label('sdk.description', '/docs/references/database/get-collection.md') ->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.') @@ -94,6 +96,7 @@ $utopia->post('/v1/database') ->label('webhook', 'database.collections.create') ->label('scope', 'collections.write') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'createCollection') ->label('sdk.description', '/docs/references/database/create-collection.md') ->param('name', '', function () { return new Text(256); }, 'Collection name.') @@ -162,6 +165,7 @@ $utopia->put('/v1/database/:collectionId') ->label('scope', 'collections.write') ->label('webhook', 'database.collections.update') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'updateCollection') ->label('sdk.description', '/docs/references/database/update-collection.md') ->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.') @@ -225,6 +229,7 @@ $utopia->delete('/v1/database/:collectionId') ->label('scope', 'collections.write') ->label('webhook', 'database.collections.delete') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'deleteCollection') ->label('sdk.description', '/docs/references/database/delete-collection.md') ->param('collectionId', '', function () { return new UID(); }, 'Collection unique ID.') @@ -260,6 +265,7 @@ $utopia->get('/v1/database/:collectionId/documents') ->desc('List Documents') ->label('scope', 'documents.read') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'listDocuments') ->label('sdk.description', '/docs/references/database/list-documents.md') ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID.') @@ -326,6 +332,7 @@ $utopia->get('/v1/database/:collectionId/documents/:documentId') ->desc('Get Document') ->label('scope', 'documents.read') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'getDocument') ->label('sdk.description', '/docs/references/database/get-document.md') ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID') @@ -371,6 +378,7 @@ $utopia->post('/v1/database/:collectionId/documents') ->label('webhook', 'database.documents.create') ->label('scope', 'documents.write') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'createDocument') ->label('sdk.description', '/docs/references/database/create-document.md') ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID.') @@ -477,6 +485,7 @@ $utopia->patch('/v1/database/:collectionId/documents/:documentId') ->label('webhook', 'database.documents.update') ->label('scope', 'documents.write') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'updateDocument') ->label('sdk.description', '/docs/references/database/update-document.md') ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID') @@ -555,6 +564,7 @@ $utopia->delete('/v1/database/:collectionId/documents/:documentId') ->label('scope', 'documents.write') ->label('webhook', 'database.documents.delete') ->label('sdk.namespace', 'database') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.method', 'deleteDocument') ->label('sdk.description', '/docs/references/database/delete-document.md') ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID') diff --git a/app/controllers/api/health.php b/app/controllers/api/health.php index 7741dfd067..810799815d 100644 --- a/app/controllers/api/health.php +++ b/app/controllers/api/health.php @@ -10,6 +10,7 @@ use Appwrite\ClamAV\Network; $utopia->get('/v1/health') ->desc('Check API HTTP Health') ->label('scope', 'health.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') ->label('sdk.method', 'getDB') ->label('docs', false) @@ -22,6 +23,7 @@ $utopia->get('/v1/health') $utopia->get('/v1/health/db') ->desc('Check DB Health') ->label('scope', 'health.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') ->label('sdk.method', 'getDB') ->label('docs', false) @@ -36,6 +38,7 @@ $utopia->get('/v1/health/db') $utopia->get('/v1/health/cache') ->desc('Check Cache Health') ->label('scope', 'health.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') ->label('sdk.method', 'getCache') ->label('docs', false) @@ -50,6 +53,7 @@ $utopia->get('/v1/health/cache') $utopia->get('/v1/health/time') ->desc('Check Webhooks Health') ->label('scope', 'health.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') ->label('sdk.method', 'getTime') ->label('docs', false) @@ -96,6 +100,7 @@ $utopia->get('/v1/health/time') $utopia->get('/v1/health/webhooks') ->desc('Check Time Health') ->label('scope', 'health.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') ->label('sdk.method', 'getWebhooks') ->label('docs', false) @@ -108,6 +113,7 @@ $utopia->get('/v1/health/webhooks') $utopia->get('/v1/health/storage/local') ->desc('Check File System Health') ->label('scope', 'health.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') ->label('sdk.method', 'getStorageLocal') ->label('docs', false) @@ -130,6 +136,7 @@ $utopia->get('/v1/health/storage/local') $utopia->get('/v1/health/storage/anti-virus') ->desc('Check Anti virus Health') ->label('scope', 'health.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') ->label('sdk.method', 'getStorageAntiVirus') ->label('docs', false) @@ -147,6 +154,7 @@ $utopia->get('/v1/health/storage/anti-virus') $utopia->get('/v1/health/stats') ->desc('System Stats') ->label('scope', 'god') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') ->label('sdk.method', 'getStats') ->label('docs', false) diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index 0c5de69a1c..114e5da9de 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -11,6 +11,7 @@ include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/locale') ->desc('Get User Locale') ->label('scope', 'locale.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'locale') ->label('sdk.method', 'getLocale') ->label('sdk.description', '/docs/references/locale/get-locale.md') @@ -68,6 +69,7 @@ $utopia->get('/v1/locale') $utopia->get('/v1/locale/countries') ->desc('List Countries') ->label('scope', 'locale.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'locale') ->label('sdk.method', 'getCountries') ->label('sdk.description', '/docs/references/locale/get-countries.md') @@ -84,6 +86,7 @@ $utopia->get('/v1/locale/countries') $utopia->get('/v1/locale/countries/eu') ->desc('List EU Countries') ->label('scope', 'locale.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'locale') ->label('sdk.method', 'getCountriesEU') ->label('sdk.description', '/docs/references/locale/get-countries-eu.md') @@ -108,6 +111,7 @@ $utopia->get('/v1/locale/countries/eu') $utopia->get('/v1/locale/countries/phones') ->desc('List Countries Phone Codes') ->label('scope', 'locale.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'locale') ->label('sdk.method', 'getCountriesPhones') ->label('sdk.description', '/docs/references/locale/get-countries-phones.md') @@ -132,6 +136,7 @@ $utopia->get('/v1/locale/countries/phones') $utopia->get('/v1/locale/continents') ->desc('List Countries') ->label('scope', 'locale.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'locale') ->label('sdk.method', 'getContinents') ->label('sdk.description', '/docs/references/locale/get-continents.md') @@ -149,6 +154,7 @@ $utopia->get('/v1/locale/continents') $utopia->get('/v1/locale/currencies') ->desc('List Currencies') ->label('scope', 'locale.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'locale') ->label('sdk.method', 'getCurrencies') ->label('sdk.description', '/docs/references/locale/get-currencies.md') diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 77e2960536..ca7e213ccb 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -119,6 +119,7 @@ $mimes = [ $utopia->get('/v1/storage/files') ->desc('List Files') ->label('scope', 'files.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'listFiles') ->label('sdk.description', '/docs/references/storage/list-files.md') @@ -151,6 +152,7 @@ $utopia->get('/v1/storage/files') $utopia->get('/v1/storage/files/:fileId') ->desc('Get File') ->label('scope', 'files.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFile') ->label('sdk.description', '/docs/references/storage/get-file.md') @@ -170,6 +172,7 @@ $utopia->get('/v1/storage/files/:fileId') $utopia->get('/v1/storage/files/:fileId/preview') ->desc('Get File Preview') ->label('scope', 'files.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFilePreview') ->label('sdk.description', '/docs/references/storage/get-file-preview.md') @@ -282,6 +285,7 @@ $utopia->get('/v1/storage/files/:fileId/preview') $utopia->get('/v1/storage/files/:fileId/download') ->desc('Get File for Download') ->label('scope', 'files.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFileDownload') ->label('sdk.description', '/docs/references/storage/get-file-download.md') @@ -333,6 +337,7 @@ $utopia->get('/v1/storage/files/:fileId/download') $utopia->get('/v1/storage/files/:fileId/view') ->desc('Get File for View') ->label('scope', 'files.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFileView') ->label('sdk.description', '/docs/references/storage/get-file-view.md') @@ -402,6 +407,7 @@ $utopia->post('/v1/storage/files') ->desc('Create File') ->label('scope', 'files.write') ->label('webhook', 'storage.files.create') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'createFile') ->label('sdk.description', '/docs/references/storage/create-file.md') @@ -535,6 +541,7 @@ $utopia->put('/v1/storage/files/:fileId') ->desc('Update File') ->label('scope', 'files.write') ->label('webhook', 'storage.files.update') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'updateFile') ->label('sdk.description', '/docs/references/storage/update-file.md') @@ -579,6 +586,7 @@ $utopia->delete('/v1/storage/files/:fileId') ->desc('Delete File') ->label('scope', 'files.write') ->label('webhook', 'storage.files.delete') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'deleteFile') ->label('sdk.description', '/docs/references/storage/delete-file.md') @@ -619,6 +627,7 @@ $utopia->delete('/v1/storage/files/:fileId') $utopia->get('/v1/storage/files/:fileId/scan') ->desc('Scan Storage') ->label('scope', 'god') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') ->label('sdk.method', 'getFileScan') ->label('sdk.hide', true) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 637fb26494..d0fef46184 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -23,6 +23,7 @@ include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/teams') ->desc('List Teams') ->label('scope', 'teams.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'listTeams') ->label('sdk.description', '/docs/references/teams/list-teams.md') @@ -51,6 +52,7 @@ $utopia->get('/v1/teams') $utopia->get('/v1/teams/:teamId') ->desc('Get Team') ->label('scope', 'teams.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'getTeam') ->label('sdk.description', '/docs/references/teams/get-team.md') @@ -70,6 +72,7 @@ $utopia->get('/v1/teams/:teamId') $utopia->post('/v1/teams') ->desc('Create Team') ->label('scope', 'teams.write') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'createTeam') ->label('sdk.description', '/docs/references/teams/create-team.md') @@ -132,6 +135,7 @@ $utopia->post('/v1/teams') $utopia->put('/v1/teams/:teamId') ->desc('Update Team') ->label('scope', 'teams.write') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'updateTeam') ->label('sdk.description', '/docs/references/teams/update-team.md') @@ -160,6 +164,7 @@ $utopia->put('/v1/teams/:teamId') $utopia->delete('/v1/teams/:teamId') ->desc('Delete Team') ->label('scope', 'teams.write') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'deleteTeam') ->label('sdk.description', '/docs/references/teams/delete-team.md') @@ -198,6 +203,7 @@ $utopia->delete('/v1/teams/:teamId') $utopia->get('/v1/teams/:teamId/memberships') ->desc('Get Team Memberships') ->label('scope', 'teams.read') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'getTeamMemberships') ->label('sdk.description', '/docs/references/teams/get-team-members.md') @@ -254,6 +260,7 @@ $utopia->get('/v1/teams/:teamId/memberships') $utopia->post('/v1/teams/:teamId/memberships') ->desc('Create Team Membership') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'createTeamMembership') ->label('sdk.description', '/docs/references/teams/create-team-membership.md') @@ -409,6 +416,7 @@ $utopia->post('/v1/teams/:teamId/memberships') $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ->desc('Update Team Membership Status') ->label('scope', 'public') + ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'updateTeamMembershipStatus') ->label('sdk.description', '/docs/references/teams/update-team-membership-status.md') @@ -533,6 +541,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') $utopia->delete('/v1/teams/:teamId/memberships/:inviteId') ->desc('Delete Team Membership') ->label('scope', 'account') + ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') ->label('sdk.method', 'deleteTeamMembership') ->label('sdk.description', '/docs/references/teams/delete-team-membership.md') diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index 00e49eea57..f748057f91 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -24,6 +24,7 @@ include_once __DIR__ . '/../shared/api.php'; $utopia->get('/v1/users') ->desc('List Users') ->label('scope', 'users.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'listUsers') ->label('sdk.description', '/docs/references/users/list-users.md') @@ -77,6 +78,7 @@ $utopia->get('/v1/users') $utopia->get('/v1/users/:userId') ->desc('Get User') ->label('scope', 'users.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUser') ->label('sdk.description', '/docs/references/users/get-user.md') @@ -117,6 +119,7 @@ $utopia->get('/v1/users/:userId') $utopia->get('/v1/users/:userId/prefs') ->desc('Get User Preferences') ->label('scope', 'users.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUserPrefs') ->label('sdk.description', '/docs/references/users/get-user-prefs.md') @@ -145,6 +148,7 @@ $utopia->get('/v1/users/:userId/prefs') $utopia->get('/v1/users/:userId/sessions') ->desc('Get User Sessions') ->label('scope', 'users.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUserSessions') ->label('sdk.description', '/docs/references/users/get-user-sessions.md') @@ -207,6 +211,7 @@ $utopia->get('/v1/users/:userId/sessions') $utopia->get('/v1/users/:userId/logs') ->desc('Get User Logs') ->label('scope', 'users.read') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'getUserLogs') ->label('sdk.description', '/docs/references/users/get-user-logs.md') @@ -270,6 +275,7 @@ $utopia->get('/v1/users/:userId/logs') $utopia->post('/v1/users') ->desc('Create User') ->label('scope', 'users.write') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'createUser') ->label('sdk.description', '/docs/references/users/create-user.md') @@ -334,6 +340,7 @@ $utopia->post('/v1/users') $utopia->patch('/v1/users/:userId/status') ->desc('Update User Status') ->label('scope', 'users.write') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'updateUserStatus') ->label('sdk.description', '/docs/references/users/update-user-status.md') @@ -381,6 +388,7 @@ $utopia->patch('/v1/users/:userId/status') $utopia->patch('/v1/users/:userId/prefs') ->desc('Update User Preferences') ->label('scope', 'users.write') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'updateUserPrefs') ->label('sdk.description', '/docs/references/users/update-user-prefs.md') @@ -422,6 +430,7 @@ $utopia->patch('/v1/users/:userId/prefs') $utopia->delete('/v1/users/:userId/sessions/:session') ->desc('Delete User Session') ->label('scope', 'users.write') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'deleteUserSession') ->label('sdk.description', '/docs/references/users/delete-user-session.md') @@ -453,6 +462,7 @@ $utopia->delete('/v1/users/:userId/sessions/:session') $utopia->delete('/v1/users/:userId/sessions') ->desc('Delete User Sessions') ->label('scope', 'users.write') + ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') ->label('sdk.method', 'deleteUserSessions') ->label('sdk.description', '/docs/references/users/delete-user-sessions.md') From 4611b985b014d97f58451535d0ad2e63b016a339 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 27 Jan 2020 23:50:41 +0200 Subject: [PATCH 098/237] Updated docs and SDK samples --- app/config/platforms.php | 85 +- app/sdks/go/README.md | 2 +- app/sdks/go/account.go | 225 +- app/sdks/go/docs/examples/Account/Delete.md | 1 - .../Account/create-account-recovery.md | 33 + .../Account/create-account-session-o-auth.md | 33 + .../Account/create-account-session.md | 33 + .../Account/create-account-verification.md | 34 + .../docs/examples/Account/create-account.md | 33 + .../Account/delete-account-current-session.md | 34 + .../Account/delete-account-session.md | 34 + .../Account/delete-account-sessions.md | 34 + .../docs/examples/Account/get-account-logs.md | 34 + .../examples/Account/get-account-prefs.md | 34 + .../examples/Account/get-account-sessions.md | 34 + .../go/docs/examples/Account/get-account.md | 34 + .../examples/Account/update-account-name.md | 34 + .../Account/update-account-password.md | 34 + .../Account/update-account-recovery.md | 33 + .../Account/update-account-verification.md | 33 + .../go/docs/examples/Account/update-email.md | 1 - .../go/docs/examples/Account/update-prefs.md | 3 +- .../go/docs/examples/Avatars/get-browser.md | 1 - .../docs/examples/Avatars/get-credit-card.md | 1 - .../go/docs/examples/Avatars/get-favicon.md | 1 - app/sdks/go/docs/examples/Avatars/get-flag.md | 1 - .../go/docs/examples/Avatars/get-image.md | 1 - app/sdks/go/docs/examples/Avatars/get-q-r.md | 1 - .../examples/Database/create-collection.md | 1 - .../docs/examples/Database/create-document.md | 1 - .../examples/Database/delete-collection.md | 1 - .../docs/examples/Database/delete-document.md | 1 - .../docs/examples/Database/get-collection.md | 1 - .../go/docs/examples/Database/get-document.md | 1 - .../examples/Database/list-collections.md | 1 - .../docs/examples/Database/list-documents.md | 1 - .../examples/Database/update-collection.md | 1 - .../docs/examples/Database/update-document.md | 1 - .../go/docs/examples/Locale/get-continents.md | 1 - .../docs/examples/Locale/get-countries-e-u.md | 1 - .../examples/Locale/get-countries-phones.md | 1 - .../go/docs/examples/Locale/get-countries.md | 1 - .../go/docs/examples/Locale/get-currencies.md | 1 - .../go/docs/examples/Locale/get-locale.md | 1 - .../go/docs/examples/Projects/create-key.md | 1 - .../docs/examples/Projects/create-platform.md | 1 - .../docs/examples/Projects/create-project.md | 1 - .../go/docs/examples/Projects/create-task.md | 1 - .../docs/examples/Projects/create-webhook.md | 1 - .../go/docs/examples/Projects/delete-key.md | 1 - .../docs/examples/Projects/delete-platform.md | 1 - .../docs/examples/Projects/delete-project.md | 1 - .../go/docs/examples/Projects/delete-task.md | 1 - .../docs/examples/Projects/delete-webhook.md | 1 - app/sdks/go/docs/examples/Projects/get-key.md | 1 - .../go/docs/examples/Projects/get-platform.md | 1 - .../examples/Projects/get-project-usage.md | 1 - .../go/docs/examples/Projects/get-project.md | 1 - .../go/docs/examples/Projects/get-task.md | 1 - .../go/docs/examples/Projects/get-webhook.md | 1 - .../go/docs/examples/Projects/list-keys.md | 1 - .../docs/examples/Projects/list-platforms.md | 1 - .../docs/examples/Projects/list-projects.md | 1 - .../go/docs/examples/Projects/list-tasks.md | 1 - .../docs/examples/Projects/list-webhooks.md | 1 - .../go/docs/examples/Projects/update-key.md | 1 - .../docs/examples/Projects/update-platform.md | 1 - .../Projects/update-project-o-auth.md | 1 - .../docs/examples/Projects/update-project.md | 1 - .../go/docs/examples/Projects/update-task.md | 1 - .../docs/examples/Projects/update-webhook.md | 1 - .../go/docs/examples/Storage/create-file.md | 1 - .../go/docs/examples/Storage/delete-file.md | 1 - .../examples/Storage/get-file-download.md | 1 - .../docs/examples/Storage/get-file-preview.md | 1 - .../go/docs/examples/Storage/get-file-view.md | 1 - app/sdks/go/docs/examples/Storage/get-file.md | 1 - .../go/docs/examples/Storage/list-files.md | 1 - .../go/docs/examples/Storage/update-file.md | 1 - .../examples/Teams/create-team-membership.md | 1 - .../go/docs/examples/Teams/create-team.md | 1 - .../examples/Teams/delete-team-membership.md | 1 - .../go/docs/examples/Teams/delete-team.md | 1 - .../examples/Teams/get-team-memberships.md | 34 + app/sdks/go/docs/examples/Teams/get-team.md | 1 - app/sdks/go/docs/examples/Teams/list-teams.md | 1 - .../Teams/update-team-membership-status.md | 2 - .../go/docs/examples/Teams/update-team.md | 1 - .../go/docs/examples/Users/create-user.md | 1 - .../examples/Users/delete-user-session.md | 1 - .../examples/Users/delete-user-sessions.md | 1 - .../go/docs/examples/Users/get-user-logs.md | 1 - .../go/docs/examples/Users/get-user-prefs.md | 1 - .../docs/examples/Users/get-user-sessions.md | 1 - app/sdks/go/docs/examples/Users/get-user.md | 1 - app/sdks/go/docs/examples/Users/list-users.md | 1 - .../docs/examples/Users/update-user-prefs.md | 3 +- .../docs/examples/Users/update-user-status.md | 1 - app/sdks/go/locale.go | 6 +- app/sdks/go/storage.go | 10 +- app/sdks/go/teams.go | 42 +- app/sdks/javascript/LICENSE | 12 + app/sdks/javascript/README.md | 38 + .../account/create-account-recovery.md | 12 + .../account/create-account-session-o-auth.md | 12 + .../account/create-account-session.md | 12 + .../account/create-account-verification.md | 13 + .../docs/examples/account/create-account.md | 12 + .../account/delete-account-current-session.md | 13 + .../account/delete-account-session.md | 13 + .../account/delete-account-sessions.md | 13 + .../docs/examples/account/delete.md | 13 + .../docs/examples/account/get-account-logs.md | 13 + .../examples/account/get-account-prefs.md | 13 + .../examples/account/get-account-sessions.md | 13 + .../docs/examples/account/get-account.md | 13 + .../examples/account/update-account-name.md | 13 + .../account/update-account-password.md | 13 + .../account/update-account-recovery.md | 12 + .../account/update-account-verification.md | 12 + .../docs/examples/account/update-email.md | 13 + .../docs/examples/account/update-prefs.md | 13 + .../docs/examples/avatars/get-browser.md | 13 + .../docs/examples/avatars/get-credit-card.md | 13 + .../docs/examples/avatars/get-favicon.md | 13 + .../docs/examples/avatars/get-flag.md | 13 + .../docs/examples/avatars/get-image.md | 13 + .../docs/examples/avatars/get-q-r.md | 13 + .../examples/database/create-collection.md | 13 + .../docs/examples/database/create-document.md | 13 + .../examples/database/delete-collection.md | 13 + .../docs/examples/database/delete-document.md | 13 + .../docs/examples/database/get-collection.md | 13 + .../docs/examples/database/get-document.md | 13 + .../examples/database/list-collections.md | 13 + .../docs/examples/database/list-documents.md | 13 + .../examples/database/update-collection.md | 13 + .../docs/examples/database/update-document.md | 13 + .../docs/examples/locale/get-continents.md | 13 + .../docs/examples/locale/get-countries-e-u.md | 13 + .../examples/locale/get-countries-phones.md | 13 + .../docs/examples/locale/get-countries.md | 13 + .../docs/examples/locale/get-currencies.md | 13 + .../docs/examples/locale/get-locale.md | 13 + .../docs/examples/projects/create-key.md | 13 + .../docs/examples/projects/create-platform.md | 13 + .../docs/examples/projects/create-project.md | 13 + .../docs/examples/projects/create-task.md | 13 + .../docs/examples/projects/create-webhook.md | 13 + .../docs/examples/projects/delete-key.md | 13 + .../docs/examples/projects/delete-platform.md | 13 + .../docs/examples/projects/delete-project.md | 13 + .../docs/examples/projects/delete-task.md | 13 + .../docs/examples/projects/delete-webhook.md | 13 + .../docs/examples/projects/get-key.md | 13 + .../docs/examples/projects/get-platform.md | 13 + .../examples/projects/get-project-usage.md | 13 + .../docs/examples/projects/get-project.md | 13 + .../docs/examples/projects/get-task.md | 13 + .../docs/examples/projects/get-webhook.md | 13 + .../docs/examples/projects/list-keys.md | 13 + .../docs/examples/projects/list-platforms.md | 13 + .../docs/examples/projects/list-projects.md | 13 + .../docs/examples/projects/list-tasks.md | 13 + .../docs/examples/projects/list-webhooks.md | 13 + .../docs/examples/projects/update-key.md | 13 + .../docs/examples/projects/update-platform.md | 13 + .../projects/update-project-o-auth.md | 13 + .../docs/examples/projects/update-project.md | 13 + .../docs/examples/projects/update-task.md | 13 + .../docs/examples/projects/update-webhook.md | 13 + .../docs/examples/storage/create-file.md | 13 + .../docs/examples/storage/delete-file.md | 13 + .../examples/storage/get-file-download.md | 13 + .../docs/examples/storage/get-file-preview.md | 13 + .../docs/examples/storage/get-file-view.md | 13 + .../docs/examples/storage/get-file.md | 13 + .../docs/examples/storage/list-files.md | 13 + .../docs/examples/storage/update-file.md | 13 + .../examples/teams/create-team-membership.md | 13 + .../docs/examples/teams/create-team.md | 13 + .../examples/teams/delete-team-membership.md | 13 + .../docs/examples/teams/delete-team.md | 13 + .../examples/teams/get-team-memberships.md | 13 + .../docs/examples/teams/get-team.md | 13 + .../docs/examples/teams/list-teams.md | 13 + .../teams/update-team-membership-status.md | 12 + .../docs/examples/teams/update-team.md | 13 + .../docs/examples/users/create-user.md | 13 + .../examples/users/delete-user-session.md | 13 + .../examples/users/delete-user-sessions.md | 13 + .../docs/examples/users/get-user-logs.md | 13 + .../docs/examples/users/get-user-prefs.md | 13 + .../docs/examples/users/get-user-sessions.md | 13 + .../docs/examples/users/get-user.md | 13 + .../docs/examples/users/list-users.md | 13 + .../docs/examples/users/update-user-prefs.md | 13 + .../docs/examples/users/update-user-status.md | 13 + app/sdks/javascript/package.json | 14 + app/sdks/javascript/src/sdk.js | 3886 +++++++++++++++++ app/sdks/javascript/src/sdk.min.js | 351 ++ app/sdks/nodejs/LICENSE | 12 + app/sdks/nodejs/README.md | 22 + .../account/create-account-recovery.md | 17 + .../account/create-account-session-o-auth.md | 17 + .../account/create-account-session.md | 17 + .../account/create-account-verification.md | 18 + .../docs/examples/account/create-account.md | 17 + .../account/delete-account-current-session.md | 18 + .../account/delete-account-session.md | 18 + .../account/delete-account-sessions.md | 18 + .../nodejs/docs/examples/account/delete.md | 18 + .../docs/examples/account/get-account-logs.md | 18 + .../examples/account/get-account-prefs.md | 18 + .../examples/account/get-account-sessions.md | 18 + .../docs/examples/account/get-account.md | 18 + .../examples/account/update-account-name.md | 18 + .../account/update-account-password.md | 18 + .../account/update-account-recovery.md | 17 + .../account/update-account-verification.md | 17 + .../docs/examples/account/update-email.md | 18 + .../docs/examples/account/update-prefs.md | 18 + .../docs/examples/avatars/get-browser.md | 18 + .../docs/examples/avatars/get-credit-card.md | 18 + .../docs/examples/avatars/get-favicon.md | 18 + .../nodejs/docs/examples/avatars/get-flag.md | 18 + .../nodejs/docs/examples/avatars/get-image.md | 18 + .../nodejs/docs/examples/avatars/get-q-r.md | 18 + .../examples/database/create-collection.md | 18 + .../docs/examples/database/create-document.md | 18 + .../examples/database/delete-collection.md | 18 + .../docs/examples/database/delete-document.md | 18 + .../docs/examples/database/get-collection.md | 18 + .../docs/examples/database/get-document.md | 18 + .../examples/database/list-collections.md | 18 + .../docs/examples/database/list-documents.md | 18 + .../examples/database/update-collection.md | 18 + .../docs/examples/database/update-document.md | 18 + .../docs/examples/locale/get-continents.md | 18 + .../docs/examples/locale/get-countries-e-u.md | 18 + .../examples/locale/get-countries-phones.md | 18 + .../docs/examples/locale/get-countries.md | 18 + .../docs/examples/locale/get-currencies.md | 18 + .../nodejs/docs/examples/locale/get-locale.md | 18 + .../docs/examples/projects/create-key.md | 18 + .../docs/examples/projects/create-platform.md | 18 + .../docs/examples/projects/create-project.md | 18 + .../docs/examples/projects/create-task.md | 18 + .../docs/examples/projects/create-webhook.md | 18 + .../docs/examples/projects/delete-key.md | 18 + .../docs/examples/projects/delete-platform.md | 18 + .../docs/examples/projects/delete-project.md | 18 + .../docs/examples/projects/delete-task.md | 18 + .../docs/examples/projects/delete-webhook.md | 18 + .../nodejs/docs/examples/projects/get-key.md | 18 + .../docs/examples/projects/get-platform.md | 18 + .../examples/projects/get-project-usage.md | 18 + .../docs/examples/projects/get-project.md | 18 + .../nodejs/docs/examples/projects/get-task.md | 18 + .../docs/examples/projects/get-webhook.md | 18 + .../docs/examples/projects/list-keys.md | 18 + .../docs/examples/projects/list-platforms.md | 18 + .../docs/examples/projects/list-projects.md | 18 + .../docs/examples/projects/list-tasks.md | 18 + .../docs/examples/projects/list-webhooks.md | 18 + .../docs/examples/projects/update-key.md | 18 + .../docs/examples/projects/update-platform.md | 18 + .../projects/update-project-o-auth.md | 18 + .../docs/examples/projects/update-project.md | 18 + .../docs/examples/projects/update-task.md | 18 + .../docs/examples/projects/update-webhook.md | 18 + .../docs/examples/storage/create-file.md | 18 + .../docs/examples/storage/delete-file.md | 18 + .../examples/storage/get-file-download.md | 18 + .../docs/examples/storage/get-file-preview.md | 18 + .../docs/examples/storage/get-file-view.md | 18 + .../nodejs/docs/examples/storage/get-file.md | 18 + .../docs/examples/storage/list-files.md | 18 + .../docs/examples/storage/update-file.md | 18 + .../examples/teams/create-team-membership.md | 18 + .../nodejs/docs/examples/teams/create-team.md | 18 + .../examples/teams/delete-team-membership.md | 18 + .../nodejs/docs/examples/teams/delete-team.md | 18 + .../examples/teams/get-team-memberships.md | 18 + .../nodejs/docs/examples/teams/get-team.md | 18 + .../nodejs/docs/examples/teams/list-teams.md | 18 + .../teams/update-team-membership-status.md | 17 + .../nodejs/docs/examples/teams/update-team.md | 18 + .../nodejs/docs/examples/users/create-user.md | 18 + .../examples/users/delete-user-session.md | 18 + .../examples/users/delete-user-sessions.md | 18 + .../docs/examples/users/get-user-logs.md | 18 + .../docs/examples/users/get-user-prefs.md | 18 + .../docs/examples/users/get-user-sessions.md | 18 + .../nodejs/docs/examples/users/get-user.md | 18 + .../nodejs/docs/examples/users/list-users.md | 18 + .../docs/examples/users/update-user-prefs.md | 18 + .../docs/examples/users/update-user-status.md | 18 + app/sdks/nodejs/index.js | 21 + app/sdks/nodejs/lib/client.js | 122 + app/sdks/nodejs/lib/service.js | 10 + app/sdks/nodejs/lib/services/account.js | 475 ++ app/sdks/nodejs/lib/services/avatars.js | 164 + app/sdks/nodejs/lib/services/database.js | 266 ++ app/sdks/nodejs/lib/services/locale.js | 125 + app/sdks/nodejs/lib/services/projects.js | 609 +++ app/sdks/nodejs/lib/services/storage.js | 199 + app/sdks/nodejs/lib/services/teams.js | 240 + app/sdks/nodejs/lib/services/users.js | 216 + app/sdks/nodejs/package.json | 17 + app/sdks/php/README.md | 2 - app/sdks/php/docs/account.md | 169 +- .../account/create-account-recovery.md | 13 + .../account/create-account-session-o-auth.md | 13 + .../account/create-account-session.md | 13 + .../account/create-account-verification.md | 14 + .../docs/examples/account/create-account.md | 13 + .../account/delete-account-current-session.md | 14 + .../account/delete-account-session.md | 14 + .../account/delete-account-sessions.md | 14 + app/sdks/php/docs/examples/account/delete.md | 1 - .../docs/examples/account/get-account-logs.md | 14 + .../examples/account/get-account-prefs.md | 14 + .../examples/account/get-account-sessions.md | 14 + .../php/docs/examples/account/get-account.md | 14 + .../examples/account/update-account-name.md | 14 + .../account/update-account-password.md | 14 + .../account/update-account-recovery.md | 13 + .../account/update-account-verification.md | 13 + .../php/docs/examples/account/update-email.md | 1 - .../php/docs/examples/account/update-prefs.md | 3 +- .../php/docs/examples/avatars/get-browser.md | 1 - .../docs/examples/avatars/get-credit-card.md | 1 - .../php/docs/examples/avatars/get-favicon.md | 1 - .../php/docs/examples/avatars/get-flag.md | 1 - .../php/docs/examples/avatars/get-image.md | 1 - app/sdks/php/docs/examples/avatars/get-q-r.md | 1 - .../examples/database/create-collection.md | 1 - .../docs/examples/database/create-document.md | 1 - .../examples/database/delete-collection.md | 1 - .../docs/examples/database/delete-document.md | 1 - .../docs/examples/database/get-collection.md | 1 - .../docs/examples/database/get-document.md | 1 - .../examples/database/list-collections.md | 1 - .../docs/examples/database/list-documents.md | 1 - .../examples/database/update-collection.md | 1 - .../docs/examples/database/update-document.md | 1 - .../docs/examples/locale/get-continents.md | 1 - .../docs/examples/locale/get-countries-e-u.md | 1 - .../examples/locale/get-countries-phones.md | 1 - .../php/docs/examples/locale/get-countries.md | 1 - .../docs/examples/locale/get-currencies.md | 1 - .../php/docs/examples/locale/get-locale.md | 1 - .../php/docs/examples/projects/create-key.md | 1 - .../docs/examples/projects/create-platform.md | 1 - .../docs/examples/projects/create-project.md | 1 - .../php/docs/examples/projects/create-task.md | 1 - .../docs/examples/projects/create-webhook.md | 1 - .../php/docs/examples/projects/delete-key.md | 1 - .../docs/examples/projects/delete-platform.md | 1 - .../docs/examples/projects/delete-project.md | 1 - .../php/docs/examples/projects/delete-task.md | 1 - .../docs/examples/projects/delete-webhook.md | 1 - .../php/docs/examples/projects/get-key.md | 1 - .../docs/examples/projects/get-platform.md | 1 - .../examples/projects/get-project-usage.md | 1 - .../php/docs/examples/projects/get-project.md | 1 - .../php/docs/examples/projects/get-task.md | 1 - .../php/docs/examples/projects/get-webhook.md | 1 - .../php/docs/examples/projects/list-keys.md | 1 - .../docs/examples/projects/list-platforms.md | 1 - .../docs/examples/projects/list-projects.md | 1 - .../php/docs/examples/projects/list-tasks.md | 1 - .../docs/examples/projects/list-webhooks.md | 1 - .../php/docs/examples/projects/update-key.md | 1 - .../docs/examples/projects/update-platform.md | 1 - .../projects/update-project-o-auth.md | 1 - .../docs/examples/projects/update-project.md | 1 - .../php/docs/examples/projects/update-task.md | 1 - .../docs/examples/projects/update-webhook.md | 1 - .../php/docs/examples/storage/create-file.md | 1 - .../php/docs/examples/storage/delete-file.md | 1 - .../examples/storage/get-file-download.md | 1 - .../docs/examples/storage/get-file-preview.md | 1 - .../docs/examples/storage/get-file-view.md | 1 - .../php/docs/examples/storage/get-file.md | 1 - .../php/docs/examples/storage/list-files.md | 1 - .../php/docs/examples/storage/update-file.md | 1 - .../examples/teams/create-team-membership.md | 1 - .../php/docs/examples/teams/create-team.md | 1 - .../examples/teams/delete-team-membership.md | 1 - .../php/docs/examples/teams/delete-team.md | 1 - .../examples/teams/get-team-memberships.md | 14 + app/sdks/php/docs/examples/teams/get-team.md | 1 - .../php/docs/examples/teams/list-teams.md | 1 - .../teams/update-team-membership-status.md | 2 - .../php/docs/examples/teams/update-team.md | 1 - .../php/docs/examples/users/create-user.md | 1 - .../examples/users/delete-user-session.md | 1 - .../examples/users/delete-user-sessions.md | 1 - .../php/docs/examples/users/get-user-logs.md | 1 - .../php/docs/examples/users/get-user-prefs.md | 1 - .../docs/examples/users/get-user-sessions.md | 1 - app/sdks/php/docs/examples/users/get-user.md | 1 - .../php/docs/examples/users/list-users.md | 1 - .../docs/examples/users/update-user-prefs.md | 3 +- .../docs/examples/users/update-user-status.md | 1 - app/sdks/php/docs/locale.md | 6 +- app/sdks/php/docs/storage.md | 4 +- app/sdks/php/docs/teams.md | 32 +- app/sdks/php/docs/users.md | 6 +- app/sdks/php/src/Appwrite/Client.php | 1 + .../php/src/Appwrite/Services/Account.php | 320 +- app/sdks/php/src/Appwrite/Services/Locale.php | 5 +- .../php/src/Appwrite/Services/Storage.php | 10 +- app/sdks/php/src/Appwrite/Services/Teams.php | 57 +- app/sdks/php/src/Appwrite/Services/Users.php | 4 +- app/sdks/python/README.md | 2 +- app/sdks/python/appwrite/client.py | 12 +- app/sdks/python/appwrite/services/account.py | 141 +- app/sdks/python/appwrite/services/storage.py | 4 +- app/sdks/python/appwrite/services/teams.py | 27 +- app/sdks/python/appwrite/services/users.py | 4 +- app/sdks/ruby/README.md | 2 +- app/sdks/ruby/lib/appwrite.rb | 1 - app/sdks/ruby/lib/appwrite/client.rb | 24 +- .../ruby/lib/appwrite/services/account.rb | 145 +- .../ruby/lib/appwrite/services/storage.rb | 4 +- app/sdks/ruby/lib/appwrite/services/teams.rb | 28 +- app/tasks/sdks.php | 282 +- docs/references/account/create-recovery.md | 2 +- .../references/account/create-verification.md | 2 +- docs/references/account/update-recovery.md | 2 +- .../references/account/update-verification.md | 2 +- .../teams/update-team-membership-status.md | 2 +- 435 files changed, 11803 insertions(+), 569 deletions(-) create mode 100644 app/sdks/go/docs/examples/Account/create-account-recovery.md create mode 100644 app/sdks/go/docs/examples/Account/create-account-session-o-auth.md create mode 100644 app/sdks/go/docs/examples/Account/create-account-session.md create mode 100644 app/sdks/go/docs/examples/Account/create-account-verification.md create mode 100644 app/sdks/go/docs/examples/Account/create-account.md create mode 100644 app/sdks/go/docs/examples/Account/delete-account-current-session.md create mode 100644 app/sdks/go/docs/examples/Account/delete-account-session.md create mode 100644 app/sdks/go/docs/examples/Account/delete-account-sessions.md create mode 100644 app/sdks/go/docs/examples/Account/get-account-logs.md create mode 100644 app/sdks/go/docs/examples/Account/get-account-prefs.md create mode 100644 app/sdks/go/docs/examples/Account/get-account-sessions.md create mode 100644 app/sdks/go/docs/examples/Account/get-account.md create mode 100644 app/sdks/go/docs/examples/Account/update-account-name.md create mode 100644 app/sdks/go/docs/examples/Account/update-account-password.md create mode 100644 app/sdks/go/docs/examples/Account/update-account-recovery.md create mode 100644 app/sdks/go/docs/examples/Account/update-account-verification.md create mode 100644 app/sdks/go/docs/examples/Teams/get-team-memberships.md create mode 100644 app/sdks/javascript/LICENSE create mode 100644 app/sdks/javascript/README.md create mode 100644 app/sdks/javascript/docs/examples/account/create-account-recovery.md create mode 100644 app/sdks/javascript/docs/examples/account/create-account-session-o-auth.md create mode 100644 app/sdks/javascript/docs/examples/account/create-account-session.md create mode 100644 app/sdks/javascript/docs/examples/account/create-account-verification.md create mode 100644 app/sdks/javascript/docs/examples/account/create-account.md create mode 100644 app/sdks/javascript/docs/examples/account/delete-account-current-session.md create mode 100644 app/sdks/javascript/docs/examples/account/delete-account-session.md create mode 100644 app/sdks/javascript/docs/examples/account/delete-account-sessions.md create mode 100644 app/sdks/javascript/docs/examples/account/delete.md create mode 100644 app/sdks/javascript/docs/examples/account/get-account-logs.md create mode 100644 app/sdks/javascript/docs/examples/account/get-account-prefs.md create mode 100644 app/sdks/javascript/docs/examples/account/get-account-sessions.md create mode 100644 app/sdks/javascript/docs/examples/account/get-account.md create mode 100644 app/sdks/javascript/docs/examples/account/update-account-name.md create mode 100644 app/sdks/javascript/docs/examples/account/update-account-password.md create mode 100644 app/sdks/javascript/docs/examples/account/update-account-recovery.md create mode 100644 app/sdks/javascript/docs/examples/account/update-account-verification.md create mode 100644 app/sdks/javascript/docs/examples/account/update-email.md create mode 100644 app/sdks/javascript/docs/examples/account/update-prefs.md create mode 100644 app/sdks/javascript/docs/examples/avatars/get-browser.md create mode 100644 app/sdks/javascript/docs/examples/avatars/get-credit-card.md create mode 100644 app/sdks/javascript/docs/examples/avatars/get-favicon.md create mode 100644 app/sdks/javascript/docs/examples/avatars/get-flag.md create mode 100644 app/sdks/javascript/docs/examples/avatars/get-image.md create mode 100644 app/sdks/javascript/docs/examples/avatars/get-q-r.md create mode 100644 app/sdks/javascript/docs/examples/database/create-collection.md create mode 100644 app/sdks/javascript/docs/examples/database/create-document.md create mode 100644 app/sdks/javascript/docs/examples/database/delete-collection.md create mode 100644 app/sdks/javascript/docs/examples/database/delete-document.md create mode 100644 app/sdks/javascript/docs/examples/database/get-collection.md create mode 100644 app/sdks/javascript/docs/examples/database/get-document.md create mode 100644 app/sdks/javascript/docs/examples/database/list-collections.md create mode 100644 app/sdks/javascript/docs/examples/database/list-documents.md create mode 100644 app/sdks/javascript/docs/examples/database/update-collection.md create mode 100644 app/sdks/javascript/docs/examples/database/update-document.md create mode 100644 app/sdks/javascript/docs/examples/locale/get-continents.md create mode 100644 app/sdks/javascript/docs/examples/locale/get-countries-e-u.md create mode 100644 app/sdks/javascript/docs/examples/locale/get-countries-phones.md create mode 100644 app/sdks/javascript/docs/examples/locale/get-countries.md create mode 100644 app/sdks/javascript/docs/examples/locale/get-currencies.md create mode 100644 app/sdks/javascript/docs/examples/locale/get-locale.md create mode 100644 app/sdks/javascript/docs/examples/projects/create-key.md create mode 100644 app/sdks/javascript/docs/examples/projects/create-platform.md create mode 100644 app/sdks/javascript/docs/examples/projects/create-project.md create mode 100644 app/sdks/javascript/docs/examples/projects/create-task.md create mode 100644 app/sdks/javascript/docs/examples/projects/create-webhook.md create mode 100644 app/sdks/javascript/docs/examples/projects/delete-key.md create mode 100644 app/sdks/javascript/docs/examples/projects/delete-platform.md create mode 100644 app/sdks/javascript/docs/examples/projects/delete-project.md create mode 100644 app/sdks/javascript/docs/examples/projects/delete-task.md create mode 100644 app/sdks/javascript/docs/examples/projects/delete-webhook.md create mode 100644 app/sdks/javascript/docs/examples/projects/get-key.md create mode 100644 app/sdks/javascript/docs/examples/projects/get-platform.md create mode 100644 app/sdks/javascript/docs/examples/projects/get-project-usage.md create mode 100644 app/sdks/javascript/docs/examples/projects/get-project.md create mode 100644 app/sdks/javascript/docs/examples/projects/get-task.md create mode 100644 app/sdks/javascript/docs/examples/projects/get-webhook.md create mode 100644 app/sdks/javascript/docs/examples/projects/list-keys.md create mode 100644 app/sdks/javascript/docs/examples/projects/list-platforms.md create mode 100644 app/sdks/javascript/docs/examples/projects/list-projects.md create mode 100644 app/sdks/javascript/docs/examples/projects/list-tasks.md create mode 100644 app/sdks/javascript/docs/examples/projects/list-webhooks.md create mode 100644 app/sdks/javascript/docs/examples/projects/update-key.md create mode 100644 app/sdks/javascript/docs/examples/projects/update-platform.md create mode 100644 app/sdks/javascript/docs/examples/projects/update-project-o-auth.md create mode 100644 app/sdks/javascript/docs/examples/projects/update-project.md create mode 100644 app/sdks/javascript/docs/examples/projects/update-task.md create mode 100644 app/sdks/javascript/docs/examples/projects/update-webhook.md create mode 100644 app/sdks/javascript/docs/examples/storage/create-file.md create mode 100644 app/sdks/javascript/docs/examples/storage/delete-file.md create mode 100644 app/sdks/javascript/docs/examples/storage/get-file-download.md create mode 100644 app/sdks/javascript/docs/examples/storage/get-file-preview.md create mode 100644 app/sdks/javascript/docs/examples/storage/get-file-view.md create mode 100644 app/sdks/javascript/docs/examples/storage/get-file.md create mode 100644 app/sdks/javascript/docs/examples/storage/list-files.md create mode 100644 app/sdks/javascript/docs/examples/storage/update-file.md create mode 100644 app/sdks/javascript/docs/examples/teams/create-team-membership.md create mode 100644 app/sdks/javascript/docs/examples/teams/create-team.md create mode 100644 app/sdks/javascript/docs/examples/teams/delete-team-membership.md create mode 100644 app/sdks/javascript/docs/examples/teams/delete-team.md create mode 100644 app/sdks/javascript/docs/examples/teams/get-team-memberships.md create mode 100644 app/sdks/javascript/docs/examples/teams/get-team.md create mode 100644 app/sdks/javascript/docs/examples/teams/list-teams.md create mode 100644 app/sdks/javascript/docs/examples/teams/update-team-membership-status.md create mode 100644 app/sdks/javascript/docs/examples/teams/update-team.md create mode 100644 app/sdks/javascript/docs/examples/users/create-user.md create mode 100644 app/sdks/javascript/docs/examples/users/delete-user-session.md create mode 100644 app/sdks/javascript/docs/examples/users/delete-user-sessions.md create mode 100644 app/sdks/javascript/docs/examples/users/get-user-logs.md create mode 100644 app/sdks/javascript/docs/examples/users/get-user-prefs.md create mode 100644 app/sdks/javascript/docs/examples/users/get-user-sessions.md create mode 100644 app/sdks/javascript/docs/examples/users/get-user.md create mode 100644 app/sdks/javascript/docs/examples/users/list-users.md create mode 100644 app/sdks/javascript/docs/examples/users/update-user-prefs.md create mode 100644 app/sdks/javascript/docs/examples/users/update-user-status.md create mode 100644 app/sdks/javascript/package.json create mode 100644 app/sdks/javascript/src/sdk.js create mode 100644 app/sdks/javascript/src/sdk.min.js create mode 100644 app/sdks/nodejs/LICENSE create mode 100644 app/sdks/nodejs/README.md create mode 100644 app/sdks/nodejs/docs/examples/account/create-account-recovery.md create mode 100644 app/sdks/nodejs/docs/examples/account/create-account-session-o-auth.md create mode 100644 app/sdks/nodejs/docs/examples/account/create-account-session.md create mode 100644 app/sdks/nodejs/docs/examples/account/create-account-verification.md create mode 100644 app/sdks/nodejs/docs/examples/account/create-account.md create mode 100644 app/sdks/nodejs/docs/examples/account/delete-account-current-session.md create mode 100644 app/sdks/nodejs/docs/examples/account/delete-account-session.md create mode 100644 app/sdks/nodejs/docs/examples/account/delete-account-sessions.md create mode 100644 app/sdks/nodejs/docs/examples/account/delete.md create mode 100644 app/sdks/nodejs/docs/examples/account/get-account-logs.md create mode 100644 app/sdks/nodejs/docs/examples/account/get-account-prefs.md create mode 100644 app/sdks/nodejs/docs/examples/account/get-account-sessions.md create mode 100644 app/sdks/nodejs/docs/examples/account/get-account.md create mode 100644 app/sdks/nodejs/docs/examples/account/update-account-name.md create mode 100644 app/sdks/nodejs/docs/examples/account/update-account-password.md create mode 100644 app/sdks/nodejs/docs/examples/account/update-account-recovery.md create mode 100644 app/sdks/nodejs/docs/examples/account/update-account-verification.md create mode 100644 app/sdks/nodejs/docs/examples/account/update-email.md create mode 100644 app/sdks/nodejs/docs/examples/account/update-prefs.md create mode 100644 app/sdks/nodejs/docs/examples/avatars/get-browser.md create mode 100644 app/sdks/nodejs/docs/examples/avatars/get-credit-card.md create mode 100644 app/sdks/nodejs/docs/examples/avatars/get-favicon.md create mode 100644 app/sdks/nodejs/docs/examples/avatars/get-flag.md create mode 100644 app/sdks/nodejs/docs/examples/avatars/get-image.md create mode 100644 app/sdks/nodejs/docs/examples/avatars/get-q-r.md create mode 100644 app/sdks/nodejs/docs/examples/database/create-collection.md create mode 100644 app/sdks/nodejs/docs/examples/database/create-document.md create mode 100644 app/sdks/nodejs/docs/examples/database/delete-collection.md create mode 100644 app/sdks/nodejs/docs/examples/database/delete-document.md create mode 100644 app/sdks/nodejs/docs/examples/database/get-collection.md create mode 100644 app/sdks/nodejs/docs/examples/database/get-document.md create mode 100644 app/sdks/nodejs/docs/examples/database/list-collections.md create mode 100644 app/sdks/nodejs/docs/examples/database/list-documents.md create mode 100644 app/sdks/nodejs/docs/examples/database/update-collection.md create mode 100644 app/sdks/nodejs/docs/examples/database/update-document.md create mode 100644 app/sdks/nodejs/docs/examples/locale/get-continents.md create mode 100644 app/sdks/nodejs/docs/examples/locale/get-countries-e-u.md create mode 100644 app/sdks/nodejs/docs/examples/locale/get-countries-phones.md create mode 100644 app/sdks/nodejs/docs/examples/locale/get-countries.md create mode 100644 app/sdks/nodejs/docs/examples/locale/get-currencies.md create mode 100644 app/sdks/nodejs/docs/examples/locale/get-locale.md create mode 100644 app/sdks/nodejs/docs/examples/projects/create-key.md create mode 100644 app/sdks/nodejs/docs/examples/projects/create-platform.md create mode 100644 app/sdks/nodejs/docs/examples/projects/create-project.md create mode 100644 app/sdks/nodejs/docs/examples/projects/create-task.md create mode 100644 app/sdks/nodejs/docs/examples/projects/create-webhook.md create mode 100644 app/sdks/nodejs/docs/examples/projects/delete-key.md create mode 100644 app/sdks/nodejs/docs/examples/projects/delete-platform.md create mode 100644 app/sdks/nodejs/docs/examples/projects/delete-project.md create mode 100644 app/sdks/nodejs/docs/examples/projects/delete-task.md create mode 100644 app/sdks/nodejs/docs/examples/projects/delete-webhook.md create mode 100644 app/sdks/nodejs/docs/examples/projects/get-key.md create mode 100644 app/sdks/nodejs/docs/examples/projects/get-platform.md create mode 100644 app/sdks/nodejs/docs/examples/projects/get-project-usage.md create mode 100644 app/sdks/nodejs/docs/examples/projects/get-project.md create mode 100644 app/sdks/nodejs/docs/examples/projects/get-task.md create mode 100644 app/sdks/nodejs/docs/examples/projects/get-webhook.md create mode 100644 app/sdks/nodejs/docs/examples/projects/list-keys.md create mode 100644 app/sdks/nodejs/docs/examples/projects/list-platforms.md create mode 100644 app/sdks/nodejs/docs/examples/projects/list-projects.md create mode 100644 app/sdks/nodejs/docs/examples/projects/list-tasks.md create mode 100644 app/sdks/nodejs/docs/examples/projects/list-webhooks.md create mode 100644 app/sdks/nodejs/docs/examples/projects/update-key.md create mode 100644 app/sdks/nodejs/docs/examples/projects/update-platform.md create mode 100644 app/sdks/nodejs/docs/examples/projects/update-project-o-auth.md create mode 100644 app/sdks/nodejs/docs/examples/projects/update-project.md create mode 100644 app/sdks/nodejs/docs/examples/projects/update-task.md create mode 100644 app/sdks/nodejs/docs/examples/projects/update-webhook.md create mode 100644 app/sdks/nodejs/docs/examples/storage/create-file.md create mode 100644 app/sdks/nodejs/docs/examples/storage/delete-file.md create mode 100644 app/sdks/nodejs/docs/examples/storage/get-file-download.md create mode 100644 app/sdks/nodejs/docs/examples/storage/get-file-preview.md create mode 100644 app/sdks/nodejs/docs/examples/storage/get-file-view.md create mode 100644 app/sdks/nodejs/docs/examples/storage/get-file.md create mode 100644 app/sdks/nodejs/docs/examples/storage/list-files.md create mode 100644 app/sdks/nodejs/docs/examples/storage/update-file.md create mode 100644 app/sdks/nodejs/docs/examples/teams/create-team-membership.md create mode 100644 app/sdks/nodejs/docs/examples/teams/create-team.md create mode 100644 app/sdks/nodejs/docs/examples/teams/delete-team-membership.md create mode 100644 app/sdks/nodejs/docs/examples/teams/delete-team.md create mode 100644 app/sdks/nodejs/docs/examples/teams/get-team-memberships.md create mode 100644 app/sdks/nodejs/docs/examples/teams/get-team.md create mode 100644 app/sdks/nodejs/docs/examples/teams/list-teams.md create mode 100644 app/sdks/nodejs/docs/examples/teams/update-team-membership-status.md create mode 100644 app/sdks/nodejs/docs/examples/teams/update-team.md create mode 100644 app/sdks/nodejs/docs/examples/users/create-user.md create mode 100644 app/sdks/nodejs/docs/examples/users/delete-user-session.md create mode 100644 app/sdks/nodejs/docs/examples/users/delete-user-sessions.md create mode 100644 app/sdks/nodejs/docs/examples/users/get-user-logs.md create mode 100644 app/sdks/nodejs/docs/examples/users/get-user-prefs.md create mode 100644 app/sdks/nodejs/docs/examples/users/get-user-sessions.md create mode 100644 app/sdks/nodejs/docs/examples/users/get-user.md create mode 100644 app/sdks/nodejs/docs/examples/users/list-users.md create mode 100644 app/sdks/nodejs/docs/examples/users/update-user-prefs.md create mode 100644 app/sdks/nodejs/docs/examples/users/update-user-status.md create mode 100644 app/sdks/nodejs/index.js create mode 100644 app/sdks/nodejs/lib/client.js create mode 100644 app/sdks/nodejs/lib/service.js create mode 100644 app/sdks/nodejs/lib/services/account.js create mode 100644 app/sdks/nodejs/lib/services/avatars.js create mode 100644 app/sdks/nodejs/lib/services/database.js create mode 100644 app/sdks/nodejs/lib/services/locale.js create mode 100644 app/sdks/nodejs/lib/services/projects.js create mode 100644 app/sdks/nodejs/lib/services/storage.js create mode 100644 app/sdks/nodejs/lib/services/teams.js create mode 100644 app/sdks/nodejs/lib/services/users.js create mode 100644 app/sdks/nodejs/package.json create mode 100644 app/sdks/php/docs/examples/account/create-account-recovery.md create mode 100644 app/sdks/php/docs/examples/account/create-account-session-o-auth.md create mode 100644 app/sdks/php/docs/examples/account/create-account-session.md create mode 100644 app/sdks/php/docs/examples/account/create-account-verification.md create mode 100644 app/sdks/php/docs/examples/account/create-account.md create mode 100644 app/sdks/php/docs/examples/account/delete-account-current-session.md create mode 100644 app/sdks/php/docs/examples/account/delete-account-session.md create mode 100644 app/sdks/php/docs/examples/account/delete-account-sessions.md create mode 100644 app/sdks/php/docs/examples/account/get-account-logs.md create mode 100644 app/sdks/php/docs/examples/account/get-account-prefs.md create mode 100644 app/sdks/php/docs/examples/account/get-account-sessions.md create mode 100644 app/sdks/php/docs/examples/account/get-account.md create mode 100644 app/sdks/php/docs/examples/account/update-account-name.md create mode 100644 app/sdks/php/docs/examples/account/update-account-password.md create mode 100644 app/sdks/php/docs/examples/account/update-account-recovery.md create mode 100644 app/sdks/php/docs/examples/account/update-account-verification.md create mode 100644 app/sdks/php/docs/examples/teams/get-team-memberships.md diff --git a/app/config/platforms.php b/app/config/platforms.php index b1f8504970..2eeabbcc73 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -8,6 +8,20 @@ const APP_PLATFORM_FLUTTER = 'flutter'; const APP_PLATFORM_SERVER = 'server'; const APP_PLATFORM_CLIENT = 'client'; +$langDart = [ + 'key' => 'dart', + 'name' => 'Dart', + 'version' => '0.0.6', + 'url' => 'https://github.com/appwrite/sdk-for-dart', + 'enabled' => true, + 'beta' => false, + 'prism' => 'dart', + 'source' => realpath(__DIR__ . '/../sdks/dart'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-dart.git', + 'gitRepoName' => 'sdk-for-dart', + 'gitUserName' => 'appwrite', +]; + return [ APP_PLATFORM_WEB => [ 'name' => 'Web', @@ -17,20 +31,27 @@ return [ [ 'key' => 'javascript', 'name' => 'JS', - 'repository' => 'https://github.com/appwrite/sdk-for-js', + 'version' => '1.0.28', + 'url' => 'https://github.com/appwrite/sdk-for-js', 'enabled' => true, 'beta' => false, 'prism' => 'javascript', - 'source' => realpath(__DIR__ . '/../sdks/js'), + 'source' => realpath(__DIR__ . '/../sdks/javascript'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-js.git', + 'gitRepoName' => 'sdk-for-js', + 'gitUserName' => 'appwrite', ], [ 'key' => 'typescript', 'name' => 'TypeScript', - 'repository' => '', - 'enabled' => true, + 'url' => '', + 'enabled' => false, 'beta' => false, 'prism' => 'typescript', - 'source' => '', + 'source' => false, + 'gitUrl' => 'git@github.com:appwrite/sdk-for-typescript.git', + 'gitRepoName' => 'sdk-for-typescript', + 'gitUserName' => 'appwrite', ], ], ], @@ -43,20 +64,26 @@ return [ [ 'key' => 'swift', 'name' => 'Swift', - 'repository' => '', + 'url' => '', 'enabled' => false, 'beta' => false, 'prism' => 'swift', - 'source' => '', + 'source' => false, + 'gitUrl' => 'git@github.com:appwrite/sdk-for-swift.git', + 'gitRepoName' => 'sdk-for-swift', + 'gitUserName' => 'appwrite', ], [ 'key' => 'objective-c', 'name' => 'Objective C', - 'repository' => '', + 'url' => '', 'enabled' => false, 'beta' => false, 'prism' => '', - 'source' => '', + 'source' => false, + 'gitUrl' => 'git@github.com:appwrite/sdk-for-objective-c.git', + 'gitRepoName' => 'sdk-for-objective-c', + 'gitUserName' => 'appwrite', ], ], ], @@ -69,20 +96,26 @@ return [ [ 'key' => 'kotlin', 'name' => 'Kotlin', - 'repository' => '', + 'url' => '', 'enabled' => false, 'beta' => false, 'prism' => 'kotlin', 'source' => false, + 'gitUrl' => 'git@github.com:appwrite/sdk-for-kotlin.git', + 'gitRepoName' => 'sdk-for-kotlin', + 'gitUserName' => 'appwrite', ], [ 'key' => 'java', 'name' => 'Java', - 'repository' => '', + 'url' => '', 'enabled' => false, 'beta' => false, 'prism' => 'java', 'source' => false, + 'gitUrl' => 'git@github.com:appwrite/sdk-for-java.git', + 'gitRepoName' => 'sdk-for-java', + 'gitUserName' => 'appwrite', ], ], ], @@ -95,46 +128,66 @@ return [ [ 'key' => 'nodejs', 'name' => 'Node.js', - 'repository' => 'https://github.com/appwrite/sdk-for-node', + 'version' => '1.0.31', + 'url' => 'https://github.com/appwrite/sdk-for-node', 'enabled' => true, 'beta' => false, 'prism' => 'javascript', 'source' => realpath(__DIR__ . '/../sdks/node'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-node.git', + 'gitRepoName' => 'sdk-for-node', + 'gitUserName' => 'appwrite', ], [ 'key' => 'php', 'name' => 'PHP', - 'repository' => 'https://github.com/appwrite/sdk-for-php', + 'version' => '1.0.16', + 'url' => 'https://github.com/appwrite/sdk-for-php', 'enabled' => true, 'prism' => 'php', 'source' => realpath(__DIR__ . '/../sdks/php'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-php.git', + 'gitRepoName' => 'sdk-for-php', + 'gitUserName' => 'appwrite', ], [ 'key' => 'python', 'name' => 'Python', - 'repository' => 'https://github.com/appwrite/sdk-for-python', + 'version' => '0.0.3', + 'url' => 'https://github.com/appwrite/sdk-for-python', 'enabled' => true, 'beta' => true, 'prism' => 'python', 'source' => realpath(__DIR__ . '/../sdks/python'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-python.git', + 'gitRepoName' => 'sdk-for-python', + 'gitUserName' => 'appwrite', ], [ 'key' => 'go', 'name' => 'Go', - 'repository' => 'https://github.com/appwrite/sdk-for-go', + 'version' => '0.0.5', + 'url' => 'https://github.com/appwrite/sdk-for-go', 'enabled' => true, 'beta' => true, 'prism' => 'go', 'source' => realpath(__DIR__ . '/../sdks/go'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-go.git', + 'gitRepoName' => 'sdk-for-go', + 'gitUserName' => 'appwrite', ], [ 'key' => 'ruby', 'name' => 'Ruby', - 'repository' => 'https://github.com/appwrite/sdk-for-ruby', + 'version' => '1.0.8', + 'url' => 'https://github.com/appwrite/sdk-for-ruby', 'enabled' => true, 'beta' => true, 'prism' => 'ruby', 'source' => realpath(__DIR__ . '/../sdks/ruby'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-ruby.git', + 'gitRepoName' => 'sdk-for-ruby', + 'gitUserName' => 'appwrite', ], ], ], diff --git a/app/sdks/go/README.md b/app/sdks/go/README.md index 672d0fa488..35fd446507 100644 --- a/app/sdks/go/README.md +++ b/app/sdks/go/README.md @@ -3,7 +3,7 @@ ![License](https://img.shields.io/github/license/appwrite/sdk-for-go.svg?v=1) ![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) -**WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).** +**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.** Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) diff --git a/app/sdks/go/account.go b/app/sdks/go/account.go index debadc42f5..e255dfde52 100644 --- a/app/sdks/go/account.go +++ b/app/sdks/go/account.go @@ -1,6 +1,7 @@ package appwrite import ( + "strings" ) // Account service @@ -8,8 +9,8 @@ type Account struct { client *Client } -// Get get currently logged in user data as JSON object. -func (srv *Account) Get() (map[string]interface{}, error) { +// GetAccount get currently logged in user data as JSON object. +func (srv *Account) GetAccount() (map[string]interface{}, error) { path := "/account" params := map[string]interface{}{ @@ -18,6 +19,38 @@ func (srv *Account) Get() (map[string]interface{}, error) { return srv.client.Call("GET", path, nil, params) } +// CreateAccount use this endpoint to allow a new user to register an account +// in your project. Use the success and failure URLs to redirect users back to +// your application after signup completes. +// +// If registration completes successfully user will be sent with a +// confirmation email in order to confirm he is the owner of the account email +// address. Use the confirmation parameter to redirect the user from the +// confirmation email back to your app. When the user is redirected, use the +// /auth/confirm endpoint to complete the account confirmation. +// +// Please note that in order to avoid a [Redirect +// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) +// the only valid redirect URLs are the ones from domains you have set when +// adding your platforms in the console interface. +// +// When accessing this route using Javascript from the browser, success and +// failure parameter URLs are required. Appwrite server will respond with a +// 301 redirect status code and will set the user session cookie. This +// behavior is enforced because modern browsers are limiting 3rd party cookies +// in XHR of fetch requests to protect user privacy. +func (srv *Account) CreateAccount(Email string, Password string, Name string) (map[string]interface{}, error) { + path := "/account" + + params := map[string]interface{}{ + "email": Email, + "password": Password, + "name": Name, + } + + return srv.client.Call("POST", path, nil, params) +} + // Delete delete a currently logged in user account. Behind the scene, the // user record is not deleted but permanently blocked from any access. This is // done to avoid deleted accounts being overtaken by new users with the same @@ -47,8 +80,20 @@ func (srv *Account) UpdateEmail(Email string, Password string) (map[string]inter return srv.client.Call("PATCH", path, nil, params) } -// UpdateName update currently logged in user account name. -func (srv *Account) UpdateName(Name string) (map[string]interface{}, error) { +// GetAccountLogs get currently logged in user list of latest security +// activity logs. Each log returns user IP address, location and date and time +// of log. +func (srv *Account) GetAccountLogs() (map[string]interface{}, error) { + path := "/account/logs" + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// UpdateAccountName update currently logged in user account name. +func (srv *Account) UpdateAccountName(Name string) (map[string]interface{}, error) { path := "/account/name" params := map[string]interface{}{ @@ -58,9 +103,9 @@ func (srv *Account) UpdateName(Name string) (map[string]interface{}, error) { return srv.client.Call("PATCH", path, nil, params) } -// UpdatePassword update currently logged in user password. For validation, -// user is required to pass the password twice. -func (srv *Account) UpdatePassword(Password string, OldPassword string) (map[string]interface{}, error) { +// UpdateAccountPassword update currently logged in user password. For +// validation, user is required to pass the password twice. +func (srv *Account) UpdateAccountPassword(Password string, OldPassword string) (map[string]interface{}, error) { path := "/account/password" params := map[string]interface{}{ @@ -71,8 +116,8 @@ func (srv *Account) UpdatePassword(Password string, OldPassword string) (map[str return srv.client.Call("PATCH", path, nil, params) } -// GetPrefs get currently logged in user preferences key-value object. -func (srv *Account) GetPrefs() (map[string]interface{}, error) { +// GetAccountPrefs get currently logged in user preferences key-value object. +func (srv *Account) GetAccountPrefs() (map[string]interface{}, error) { path := "/account/prefs" params := map[string]interface{}{ @@ -93,20 +138,48 @@ func (srv *Account) UpdatePrefs(Prefs string) (map[string]interface{}, error) { return srv.client.Call("PATCH", path, nil, params) } -// GetSecurity get currently logged in user list of latest security activity -// logs. Each log returns user IP address, location and date and time of log. -func (srv *Account) GetSecurity() (map[string]interface{}, error) { - path := "/account/security" +// CreateAccountRecovery sends the user an email with a temporary secret token +// for password reset. When the user clicks the confirmation link he is +// redirected back to your app password reset redirect URL with a secret token +// and email address values attached to the URL query string. Use the query +// string params to submit a request to the /auth/password/reset endpoint to +// complete the process. +func (srv *Account) CreateAccountRecovery(Email string, Url string) (map[string]interface{}, error) { + path := "/account/recovery" params := map[string]interface{}{ + "email": Email, + "url": Url, } - return srv.client.Call("GET", path, nil, params) + return srv.client.Call("POST", path, nil, params) } -// GetSessions get currently logged in user list of active sessions across -// different devices. -func (srv *Account) GetSessions() (map[string]interface{}, error) { +// UpdateAccountRecovery use this endpoint to complete the user account +// password reset. Both the **userId** and **token** arguments will be passed +// as query parameters to the redirect URL you have provided when sending your +// request to the /auth/recovery endpoint. +// +// Please note that in order to avoid a [Redirect +// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) +// the only valid redirect URLs are the ones from domains you have set when +// adding your platforms in the console interface. +func (srv *Account) UpdateAccountRecovery(UserId string, Secret string, PasswordA string, PasswordB string) (map[string]interface{}, error) { + path := "/account/recovery" + + params := map[string]interface{}{ + "userId": UserId, + "secret": Secret, + "password-a": PasswordA, + "password-b": PasswordB, + } + + return srv.client.Call("PUT", path, nil, params) +} + +// GetAccountSessions get currently logged in user list of active sessions +// across different devices. +func (srv *Account) GetAccountSessions() (map[string]interface{}, error) { path := "/account/sessions" params := map[string]interface{}{ @@ -114,3 +187,121 @@ func (srv *Account) GetSessions() (map[string]interface{}, error) { return srv.client.Call("GET", path, nil, params) } + +// CreateAccountSession allow the user to login into his account by providing +// a valid email and password combination. Use the success and failure +// arguments to provide a redirect URL's back to your app when login is +// completed. +// +// Please note that in order to avoid a [Redirect +// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) +// the only valid redirect URLs are the ones from domains you have set when +// adding your platforms in the console interface. +// +// When accessing this route using Javascript from the browser, success and +// failure parameter URLs are required. Appwrite server will respond with a +// 301 redirect status code and will set the user session cookie. This +// behavior is enforced because modern browsers are limiting 3rd party cookies +// in XHR of fetch requests to protect user privacy. +func (srv *Account) CreateAccountSession(Email string, Password string) (map[string]interface{}, error) { + path := "/account/sessions" + + params := map[string]interface{}{ + "email": Email, + "password": Password, + } + + return srv.client.Call("POST", path, nil, params) +} + +// DeleteAccountSessions delete all sessions from the user account and remove +// any sessions cookies from the end client. +func (srv *Account) DeleteAccountSessions() (map[string]interface{}, error) { + path := "/account/sessions" + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} + +// DeleteAccountCurrentSession use this endpoint to log out the currently +// logged in user from his account. When successful this endpoint will delete +// the user session and remove the session secret cookie from the user client. +func (srv *Account) DeleteAccountCurrentSession() (map[string]interface{}, error) { + path := "/account/sessions/current" + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} + +// CreateAccountSessionOAuth allow the user to login to his account using the +// OAuth provider of his choice. Each OAuth provider should be enabled from +// the Appwrite console first. Use the success and failure arguments to +// provide a redirect URL's back to your app when login is completed. +func (srv *Account) CreateAccountSessionOAuth(Provider string, Success string, Failure string) (map[string]interface{}, error) { + r := strings.NewReplacer("{provider}", Provider) + path := r.Replace("/account/sessions/oauth/{provider}") + + params := map[string]interface{}{ + "success": Success, + "failure": Failure, + } + + return srv.client.Call("GET", path, nil, params) +} + +// DeleteAccountSession use this endpoint to log out the currently logged in +// user from all his account sessions across all his different devices. When +// using the option id argument, only the session unique ID provider will be +// deleted. +func (srv *Account) DeleteAccountSession(Id string) (map[string]interface{}, error) { + r := strings.NewReplacer("{id}", Id) + path := r.Replace("/account/sessions/{id}") + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} + +// CreateAccountVerification use this endpoint to send a verification message +// to your user email address to confirm they are the valid owners of that +// address. Both the **userId** and **token** arguments will be passed as +// query parameters to the URL you have provider to be attached to the +// verification email. The provided URL should redirect the user back for your +// app and allow you to complete the verification process by verifying both +// the **userId** and **token** parameters. Learn more about how to [complete +// the verification process](/docs/account#updateAccountVerification). +// +// Please note that in order to avoid a [Redirect +// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) +// the only valid redirect URLs are the ones from domains you have set when +// adding your platforms in the console interface. +func (srv *Account) CreateAccountVerification(Url string) (map[string]interface{}, error) { + path := "/account/verification" + + params := map[string]interface{}{ + "url": Url, + } + + return srv.client.Call("POST", path, nil, params) +} + +// UpdateAccountVerification use this endpoint to complete the user email +// verification process. Use both the **userId** and **token** parameters that +// were attached to your app URL to verify the user email ownership. If +// confirmed this route will return a 200 status code. +func (srv *Account) UpdateAccountVerification(UserId string, Secret string, PasswordB string) (map[string]interface{}, error) { + path := "/account/verification" + + params := map[string]interface{}{ + "userId": UserId, + "secret": Secret, + "password-b": PasswordB, + } + + return srv.client.Call("PUT", path, nil, params) +} diff --git a/app/sdks/go/docs/examples/Account/Delete.md b/app/sdks/go/docs/examples/Account/Delete.md index a029c47c14..67ace9a461 100644 --- a/app/sdks/go/docs/examples/Account/Delete.md +++ b/app/sdks/go/docs/examples/Account/Delete.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Account service passing Client var srv := appwrite.Account{ diff --git a/app/sdks/go/docs/examples/Account/create-account-recovery.md b/app/sdks/go/docs/examples/Account/create-account-recovery.md new file mode 100644 index 0000000000..9dfef57968 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/create-account-recovery.md @@ -0,0 +1,33 @@ +# Account Examples + +## CreateAccountRecovery + +```go + package appwrite-createaccountrecovery + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call CreateAccountRecovery method and handle results + var res, err := srv.CreateAccountRecovery("email@example.com", "https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account-session-o-auth.md b/app/sdks/go/docs/examples/Account/create-account-session-o-auth.md new file mode 100644 index 0000000000..7bcf83b527 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/create-account-session-o-auth.md @@ -0,0 +1,33 @@ +# Account Examples + +## CreateAccountSessionOAuth + +```go + package appwrite-createaccountsessionoauth + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call CreateAccountSessionOAuth method and handle results + var res, err := srv.CreateAccountSessionOAuth("bitbucket", "https://example.com", "https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account-session.md b/app/sdks/go/docs/examples/Account/create-account-session.md new file mode 100644 index 0000000000..979313a4bb --- /dev/null +++ b/app/sdks/go/docs/examples/Account/create-account-session.md @@ -0,0 +1,33 @@ +# Account Examples + +## CreateAccountSession + +```go + package appwrite-createaccountsession + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call CreateAccountSession method and handle results + var res, err := srv.CreateAccountSession("email@example.com", "password") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account-verification.md b/app/sdks/go/docs/examples/Account/create-account-verification.md new file mode 100644 index 0000000000..ceda5fc3c8 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/create-account-verification.md @@ -0,0 +1,34 @@ +# Account Examples + +## CreateAccountVerification + +```go + package appwrite-createaccountverification + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call CreateAccountVerification method and handle results + var res, err := srv.CreateAccountVerification("https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account.md b/app/sdks/go/docs/examples/Account/create-account.md new file mode 100644 index 0000000000..f942eed4bc --- /dev/null +++ b/app/sdks/go/docs/examples/Account/create-account.md @@ -0,0 +1,33 @@ +# Account Examples + +## CreateAccount + +```go + package appwrite-createaccount + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call CreateAccount method and handle results + var res, err := srv.CreateAccount("email@example.com", "password") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/delete-account-current-session.md b/app/sdks/go/docs/examples/Account/delete-account-current-session.md new file mode 100644 index 0000000000..4ba93be456 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/delete-account-current-session.md @@ -0,0 +1,34 @@ +# Account Examples + +## DeleteAccountCurrentSession + +```go + package appwrite-deleteaccountcurrentsession + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call DeleteAccountCurrentSession method and handle results + var res, err := srv.DeleteAccountCurrentSession() + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/delete-account-session.md b/app/sdks/go/docs/examples/Account/delete-account-session.md new file mode 100644 index 0000000000..2ef9751568 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/delete-account-session.md @@ -0,0 +1,34 @@ +# Account Examples + +## DeleteAccountSession + +```go + package appwrite-deleteaccountsession + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call DeleteAccountSession method and handle results + var res, err := srv.DeleteAccountSession("[ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/delete-account-sessions.md b/app/sdks/go/docs/examples/Account/delete-account-sessions.md new file mode 100644 index 0000000000..b1934ba852 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/delete-account-sessions.md @@ -0,0 +1,34 @@ +# Account Examples + +## DeleteAccountSessions + +```go + package appwrite-deleteaccountsessions + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call DeleteAccountSessions method and handle results + var res, err := srv.DeleteAccountSessions() + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-account-logs.md b/app/sdks/go/docs/examples/Account/get-account-logs.md new file mode 100644 index 0000000000..fe8a036959 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/get-account-logs.md @@ -0,0 +1,34 @@ +# Account Examples + +## GetAccountLogs + +```go + package appwrite-getaccountlogs + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call GetAccountLogs method and handle results + var res, err := srv.GetAccountLogs() + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-account-prefs.md b/app/sdks/go/docs/examples/Account/get-account-prefs.md new file mode 100644 index 0000000000..a1483646f8 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/get-account-prefs.md @@ -0,0 +1,34 @@ +# Account Examples + +## GetAccountPrefs + +```go + package appwrite-getaccountprefs + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call GetAccountPrefs method and handle results + var res, err := srv.GetAccountPrefs() + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-account-sessions.md b/app/sdks/go/docs/examples/Account/get-account-sessions.md new file mode 100644 index 0000000000..b6f9dd92ba --- /dev/null +++ b/app/sdks/go/docs/examples/Account/get-account-sessions.md @@ -0,0 +1,34 @@ +# Account Examples + +## GetAccountSessions + +```go + package appwrite-getaccountsessions + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call GetAccountSessions method and handle results + var res, err := srv.GetAccountSessions() + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-account.md b/app/sdks/go/docs/examples/Account/get-account.md new file mode 100644 index 0000000000..5ece106aed --- /dev/null +++ b/app/sdks/go/docs/examples/Account/get-account.md @@ -0,0 +1,34 @@ +# Account Examples + +## GetAccount + +```go + package appwrite-getaccount + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call GetAccount method and handle results + var res, err := srv.GetAccount() + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-account-name.md b/app/sdks/go/docs/examples/Account/update-account-name.md new file mode 100644 index 0000000000..c5f47a0592 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/update-account-name.md @@ -0,0 +1,34 @@ +# Account Examples + +## UpdateAccountName + +```go + package appwrite-updateaccountname + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call UpdateAccountName method and handle results + var res, err := srv.UpdateAccountName("[NAME]") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-account-password.md b/app/sdks/go/docs/examples/Account/update-account-password.md new file mode 100644 index 0000000000..2025742290 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/update-account-password.md @@ -0,0 +1,34 @@ +# Account Examples + +## UpdateAccountPassword + +```go + package appwrite-updateaccountpassword + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call UpdateAccountPassword method and handle results + var res, err := srv.UpdateAccountPassword("password", "password") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-account-recovery.md b/app/sdks/go/docs/examples/Account/update-account-recovery.md new file mode 100644 index 0000000000..4463522761 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/update-account-recovery.md @@ -0,0 +1,33 @@ +# Account Examples + +## UpdateAccountRecovery + +```go + package appwrite-updateaccountrecovery + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call UpdateAccountRecovery method and handle results + var res, err := srv.UpdateAccountRecovery("[USER_ID]", "[SECRET]", "password", "password") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-account-verification.md b/app/sdks/go/docs/examples/Account/update-account-verification.md new file mode 100644 index 0000000000..494db24089 --- /dev/null +++ b/app/sdks/go/docs/examples/Account/update-account-verification.md @@ -0,0 +1,33 @@ +# Account Examples + +## UpdateAccountVerification + +```go + package appwrite-updateaccountverification + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + + // Create a new Account service passing Client + var srv := appwrite.Account{ + client: &clt + } + + // Call UpdateAccountVerification method and handle results + var res, err := srv.UpdateAccountVerification("[USER_ID]", "[SECRET]", "password") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-email.md b/app/sdks/go/docs/examples/Account/update-email.md index 6f9895257e..5866aac613 100644 --- a/app/sdks/go/docs/examples/Account/update-email.md +++ b/app/sdks/go/docs/examples/Account/update-email.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Account service passing Client var srv := appwrite.Account{ diff --git a/app/sdks/go/docs/examples/Account/update-prefs.md b/app/sdks/go/docs/examples/Account/update-prefs.md index 869e12572d..44cd77c898 100644 --- a/app/sdks/go/docs/examples/Account/update-prefs.md +++ b/app/sdks/go/docs/examples/Account/update-prefs.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Account service passing Client var srv := appwrite.Account{ @@ -25,7 +24,7 @@ } // Call UpdatePrefs method and handle results - var res, err := srv.UpdatePrefs("{}") + var res, err := srv.UpdatePrefs("") if err != nil { panic(err) } diff --git a/app/sdks/go/docs/examples/Avatars/get-browser.md b/app/sdks/go/docs/examples/Avatars/get-browser.md index 9628da910b..f94c34aab4 100644 --- a/app/sdks/go/docs/examples/Avatars/get-browser.md +++ b/app/sdks/go/docs/examples/Avatars/get-browser.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-credit-card.md b/app/sdks/go/docs/examples/Avatars/get-credit-card.md index 488077cfc3..4d3c60600a 100644 --- a/app/sdks/go/docs/examples/Avatars/get-credit-card.md +++ b/app/sdks/go/docs/examples/Avatars/get-credit-card.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-favicon.md b/app/sdks/go/docs/examples/Avatars/get-favicon.md index c235967d6b..4cb5a5c5e3 100644 --- a/app/sdks/go/docs/examples/Avatars/get-favicon.md +++ b/app/sdks/go/docs/examples/Avatars/get-favicon.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-flag.md b/app/sdks/go/docs/examples/Avatars/get-flag.md index 955c96c530..0428944e12 100644 --- a/app/sdks/go/docs/examples/Avatars/get-flag.md +++ b/app/sdks/go/docs/examples/Avatars/get-flag.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-image.md b/app/sdks/go/docs/examples/Avatars/get-image.md index 11d1c6523d..9fc5892c68 100644 --- a/app/sdks/go/docs/examples/Avatars/get-image.md +++ b/app/sdks/go/docs/examples/Avatars/get-image.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-q-r.md b/app/sdks/go/docs/examples/Avatars/get-q-r.md index 0874c0e6be..4d5b93ebdc 100644 --- a/app/sdks/go/docs/examples/Avatars/get-q-r.md +++ b/app/sdks/go/docs/examples/Avatars/get-q-r.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Database/create-collection.md b/app/sdks/go/docs/examples/Database/create-collection.md index 48e5977c60..3c940b0f8f 100644 --- a/app/sdks/go/docs/examples/Database/create-collection.md +++ b/app/sdks/go/docs/examples/Database/create-collection.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/create-document.md b/app/sdks/go/docs/examples/Database/create-document.md index ccaa02f578..b6411c0638 100644 --- a/app/sdks/go/docs/examples/Database/create-document.md +++ b/app/sdks/go/docs/examples/Database/create-document.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/delete-collection.md b/app/sdks/go/docs/examples/Database/delete-collection.md index 85928bde3b..574fc498d1 100644 --- a/app/sdks/go/docs/examples/Database/delete-collection.md +++ b/app/sdks/go/docs/examples/Database/delete-collection.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/delete-document.md b/app/sdks/go/docs/examples/Database/delete-document.md index 256a0abccb..4a8442861e 100644 --- a/app/sdks/go/docs/examples/Database/delete-document.md +++ b/app/sdks/go/docs/examples/Database/delete-document.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/get-collection.md b/app/sdks/go/docs/examples/Database/get-collection.md index 120ad0a19e..46b70412e7 100644 --- a/app/sdks/go/docs/examples/Database/get-collection.md +++ b/app/sdks/go/docs/examples/Database/get-collection.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/get-document.md b/app/sdks/go/docs/examples/Database/get-document.md index 8866442b6b..2c7a6fdb60 100644 --- a/app/sdks/go/docs/examples/Database/get-document.md +++ b/app/sdks/go/docs/examples/Database/get-document.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/list-collections.md b/app/sdks/go/docs/examples/Database/list-collections.md index 1db6530df7..f4fe864615 100644 --- a/app/sdks/go/docs/examples/Database/list-collections.md +++ b/app/sdks/go/docs/examples/Database/list-collections.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/list-documents.md b/app/sdks/go/docs/examples/Database/list-documents.md index 6c46ead8db..5542d89b9a 100644 --- a/app/sdks/go/docs/examples/Database/list-documents.md +++ b/app/sdks/go/docs/examples/Database/list-documents.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/update-collection.md b/app/sdks/go/docs/examples/Database/update-collection.md index 7cf07ac2c0..1fd860d466 100644 --- a/app/sdks/go/docs/examples/Database/update-collection.md +++ b/app/sdks/go/docs/examples/Database/update-collection.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/update-document.md b/app/sdks/go/docs/examples/Database/update-document.md index 88f57eefa9..5b225d62f3 100644 --- a/app/sdks/go/docs/examples/Database/update-document.md +++ b/app/sdks/go/docs/examples/Database/update-document.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Locale/get-continents.md b/app/sdks/go/docs/examples/Locale/get-continents.md index faeab3a977..ee76b8f574 100644 --- a/app/sdks/go/docs/examples/Locale/get-continents.md +++ b/app/sdks/go/docs/examples/Locale/get-continents.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-countries-e-u.md b/app/sdks/go/docs/examples/Locale/get-countries-e-u.md index ca8ed7ca48..b79057d7e7 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries-e-u.md +++ b/app/sdks/go/docs/examples/Locale/get-countries-e-u.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-countries-phones.md b/app/sdks/go/docs/examples/Locale/get-countries-phones.md index 8847258258..aaa02a6585 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries-phones.md +++ b/app/sdks/go/docs/examples/Locale/get-countries-phones.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-countries.md b/app/sdks/go/docs/examples/Locale/get-countries.md index be286c1979..f206e66ea6 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries.md +++ b/app/sdks/go/docs/examples/Locale/get-countries.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-currencies.md b/app/sdks/go/docs/examples/Locale/get-currencies.md index fcbb679fd3..69fba7c7bd 100644 --- a/app/sdks/go/docs/examples/Locale/get-currencies.md +++ b/app/sdks/go/docs/examples/Locale/get-currencies.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-locale.md b/app/sdks/go/docs/examples/Locale/get-locale.md index 67cfcdccc9..002b841f2a 100644 --- a/app/sdks/go/docs/examples/Locale/get-locale.md +++ b/app/sdks/go/docs/examples/Locale/get-locale.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Projects/create-key.md b/app/sdks/go/docs/examples/Projects/create-key.md index 7fa69e4b67..d5197d2a1e 100644 --- a/app/sdks/go/docs/examples/Projects/create-key.md +++ b/app/sdks/go/docs/examples/Projects/create-key.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/create-platform.md b/app/sdks/go/docs/examples/Projects/create-platform.md index 7f2d247741..fd4a61884d 100644 --- a/app/sdks/go/docs/examples/Projects/create-platform.md +++ b/app/sdks/go/docs/examples/Projects/create-platform.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/create-project.md b/app/sdks/go/docs/examples/Projects/create-project.md index 44525bdcd2..74ffc04444 100644 --- a/app/sdks/go/docs/examples/Projects/create-project.md +++ b/app/sdks/go/docs/examples/Projects/create-project.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/create-task.md b/app/sdks/go/docs/examples/Projects/create-task.md index 25c617ec9b..aa642b536a 100644 --- a/app/sdks/go/docs/examples/Projects/create-task.md +++ b/app/sdks/go/docs/examples/Projects/create-task.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/create-webhook.md b/app/sdks/go/docs/examples/Projects/create-webhook.md index 58e5dc548f..60b62ed828 100644 --- a/app/sdks/go/docs/examples/Projects/create-webhook.md +++ b/app/sdks/go/docs/examples/Projects/create-webhook.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/delete-key.md b/app/sdks/go/docs/examples/Projects/delete-key.md index 3160b37d1c..b4929842f0 100644 --- a/app/sdks/go/docs/examples/Projects/delete-key.md +++ b/app/sdks/go/docs/examples/Projects/delete-key.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/delete-platform.md b/app/sdks/go/docs/examples/Projects/delete-platform.md index a9e3f0d3b9..1f04f26bd2 100644 --- a/app/sdks/go/docs/examples/Projects/delete-platform.md +++ b/app/sdks/go/docs/examples/Projects/delete-platform.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/delete-project.md b/app/sdks/go/docs/examples/Projects/delete-project.md index 446f640c0d..b8b7f2d60d 100644 --- a/app/sdks/go/docs/examples/Projects/delete-project.md +++ b/app/sdks/go/docs/examples/Projects/delete-project.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/delete-task.md b/app/sdks/go/docs/examples/Projects/delete-task.md index a5275e3b04..934a80f405 100644 --- a/app/sdks/go/docs/examples/Projects/delete-task.md +++ b/app/sdks/go/docs/examples/Projects/delete-task.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/delete-webhook.md b/app/sdks/go/docs/examples/Projects/delete-webhook.md index 377708f6a3..f30e3906e6 100644 --- a/app/sdks/go/docs/examples/Projects/delete-webhook.md +++ b/app/sdks/go/docs/examples/Projects/delete-webhook.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/get-key.md b/app/sdks/go/docs/examples/Projects/get-key.md index abe636ba31..d58e13d211 100644 --- a/app/sdks/go/docs/examples/Projects/get-key.md +++ b/app/sdks/go/docs/examples/Projects/get-key.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/get-platform.md b/app/sdks/go/docs/examples/Projects/get-platform.md index 14a9d3bda5..1a0d3fc29f 100644 --- a/app/sdks/go/docs/examples/Projects/get-platform.md +++ b/app/sdks/go/docs/examples/Projects/get-platform.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/get-project-usage.md b/app/sdks/go/docs/examples/Projects/get-project-usage.md index 2bb6bc4dc5..89f87f3345 100644 --- a/app/sdks/go/docs/examples/Projects/get-project-usage.md +++ b/app/sdks/go/docs/examples/Projects/get-project-usage.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/get-project.md b/app/sdks/go/docs/examples/Projects/get-project.md index 8e0986f592..b942ba7249 100644 --- a/app/sdks/go/docs/examples/Projects/get-project.md +++ b/app/sdks/go/docs/examples/Projects/get-project.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/get-task.md b/app/sdks/go/docs/examples/Projects/get-task.md index c6efdf553b..1168f7ab6f 100644 --- a/app/sdks/go/docs/examples/Projects/get-task.md +++ b/app/sdks/go/docs/examples/Projects/get-task.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/get-webhook.md b/app/sdks/go/docs/examples/Projects/get-webhook.md index b46bf392b5..349f0fea47 100644 --- a/app/sdks/go/docs/examples/Projects/get-webhook.md +++ b/app/sdks/go/docs/examples/Projects/get-webhook.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/list-keys.md b/app/sdks/go/docs/examples/Projects/list-keys.md index e084035bb5..cd405846b3 100644 --- a/app/sdks/go/docs/examples/Projects/list-keys.md +++ b/app/sdks/go/docs/examples/Projects/list-keys.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/list-platforms.md b/app/sdks/go/docs/examples/Projects/list-platforms.md index ecce7449e1..c0aa3adda9 100644 --- a/app/sdks/go/docs/examples/Projects/list-platforms.md +++ b/app/sdks/go/docs/examples/Projects/list-platforms.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/list-projects.md b/app/sdks/go/docs/examples/Projects/list-projects.md index f17ea76beb..14c283306d 100644 --- a/app/sdks/go/docs/examples/Projects/list-projects.md +++ b/app/sdks/go/docs/examples/Projects/list-projects.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/list-tasks.md b/app/sdks/go/docs/examples/Projects/list-tasks.md index 84f5356c34..37dd64fa1a 100644 --- a/app/sdks/go/docs/examples/Projects/list-tasks.md +++ b/app/sdks/go/docs/examples/Projects/list-tasks.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/list-webhooks.md b/app/sdks/go/docs/examples/Projects/list-webhooks.md index aee6b8da62..2e277cc6d6 100644 --- a/app/sdks/go/docs/examples/Projects/list-webhooks.md +++ b/app/sdks/go/docs/examples/Projects/list-webhooks.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/update-key.md b/app/sdks/go/docs/examples/Projects/update-key.md index 205caef8c8..7a34cfd090 100644 --- a/app/sdks/go/docs/examples/Projects/update-key.md +++ b/app/sdks/go/docs/examples/Projects/update-key.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/update-platform.md b/app/sdks/go/docs/examples/Projects/update-platform.md index bc966f73a8..d85b5b04d6 100644 --- a/app/sdks/go/docs/examples/Projects/update-platform.md +++ b/app/sdks/go/docs/examples/Projects/update-platform.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/update-project-o-auth.md b/app/sdks/go/docs/examples/Projects/update-project-o-auth.md index 58f23b698b..a402bed516 100644 --- a/app/sdks/go/docs/examples/Projects/update-project-o-auth.md +++ b/app/sdks/go/docs/examples/Projects/update-project-o-auth.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/update-project.md b/app/sdks/go/docs/examples/Projects/update-project.md index 7663ec4c4e..b4f8e90090 100644 --- a/app/sdks/go/docs/examples/Projects/update-project.md +++ b/app/sdks/go/docs/examples/Projects/update-project.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/update-task.md b/app/sdks/go/docs/examples/Projects/update-task.md index f977fd5540..31ca901e94 100644 --- a/app/sdks/go/docs/examples/Projects/update-task.md +++ b/app/sdks/go/docs/examples/Projects/update-task.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Projects/update-webhook.md b/app/sdks/go/docs/examples/Projects/update-webhook.md index 0120707ad5..fde81679cc 100644 --- a/app/sdks/go/docs/examples/Projects/update-webhook.md +++ b/app/sdks/go/docs/examples/Projects/update-webhook.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Projects service passing Client var srv := appwrite.Projects{ diff --git a/app/sdks/go/docs/examples/Storage/create-file.md b/app/sdks/go/docs/examples/Storage/create-file.md index 1d0bf35af8..72f5ca8da9 100644 --- a/app/sdks/go/docs/examples/Storage/create-file.md +++ b/app/sdks/go/docs/examples/Storage/create-file.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/delete-file.md b/app/sdks/go/docs/examples/Storage/delete-file.md index c6ecabdf99..420814abb0 100644 --- a/app/sdks/go/docs/examples/Storage/delete-file.md +++ b/app/sdks/go/docs/examples/Storage/delete-file.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/get-file-download.md b/app/sdks/go/docs/examples/Storage/get-file-download.md index 4513337425..8c90942705 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-download.md +++ b/app/sdks/go/docs/examples/Storage/get-file-download.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/get-file-preview.md b/app/sdks/go/docs/examples/Storage/get-file-preview.md index a30a271d93..4c24617095 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-preview.md +++ b/app/sdks/go/docs/examples/Storage/get-file-preview.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/get-file-view.md b/app/sdks/go/docs/examples/Storage/get-file-view.md index 7782cb3b1e..712ab69ab3 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-view.md +++ b/app/sdks/go/docs/examples/Storage/get-file-view.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/get-file.md b/app/sdks/go/docs/examples/Storage/get-file.md index 0e7bff0952..fccfbbc793 100644 --- a/app/sdks/go/docs/examples/Storage/get-file.md +++ b/app/sdks/go/docs/examples/Storage/get-file.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/list-files.md b/app/sdks/go/docs/examples/Storage/list-files.md index 7c5d800f6e..e8058befc5 100644 --- a/app/sdks/go/docs/examples/Storage/list-files.md +++ b/app/sdks/go/docs/examples/Storage/list-files.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/update-file.md b/app/sdks/go/docs/examples/Storage/update-file.md index 01b44bc620..bf73435ca6 100644 --- a/app/sdks/go/docs/examples/Storage/update-file.md +++ b/app/sdks/go/docs/examples/Storage/update-file.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Teams/create-team-membership.md b/app/sdks/go/docs/examples/Teams/create-team-membership.md index 9d74105ec5..5b9b53494a 100644 --- a/app/sdks/go/docs/examples/Teams/create-team-membership.md +++ b/app/sdks/go/docs/examples/Teams/create-team-membership.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/create-team.md b/app/sdks/go/docs/examples/Teams/create-team.md index 7922f904f8..79c8fa0daf 100644 --- a/app/sdks/go/docs/examples/Teams/create-team.md +++ b/app/sdks/go/docs/examples/Teams/create-team.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/delete-team-membership.md b/app/sdks/go/docs/examples/Teams/delete-team-membership.md index 80cdc936b0..5f545111dd 100644 --- a/app/sdks/go/docs/examples/Teams/delete-team-membership.md +++ b/app/sdks/go/docs/examples/Teams/delete-team-membership.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/delete-team.md b/app/sdks/go/docs/examples/Teams/delete-team.md index fa15cce6d6..34f5dac131 100644 --- a/app/sdks/go/docs/examples/Teams/delete-team.md +++ b/app/sdks/go/docs/examples/Teams/delete-team.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/get-team-memberships.md b/app/sdks/go/docs/examples/Teams/get-team-memberships.md new file mode 100644 index 0000000000..ab17cdcd08 --- /dev/null +++ b/app/sdks/go/docs/examples/Teams/get-team-memberships.md @@ -0,0 +1,34 @@ +# Teams Examples + +## GetTeamMemberships + +```go + package appwrite-getteammemberships + + import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" + ) + + func main() { + // Create a Client + var clt := appwrite.Client{} + + // Set Client required headers + clt.SetProject("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &clt + } + + // Call GetTeamMemberships method and handle results + var res, err := srv.GetTeamMemberships("[TEAM_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) + } +``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/get-team.md b/app/sdks/go/docs/examples/Teams/get-team.md index 8418da4d14..ed75792881 100644 --- a/app/sdks/go/docs/examples/Teams/get-team.md +++ b/app/sdks/go/docs/examples/Teams/get-team.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/list-teams.md b/app/sdks/go/docs/examples/Teams/list-teams.md index 089daf4697..8a132ef97e 100644 --- a/app/sdks/go/docs/examples/Teams/list-teams.md +++ b/app/sdks/go/docs/examples/Teams/list-teams.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/update-team-membership-status.md b/app/sdks/go/docs/examples/Teams/update-team-membership-status.md index 7d4346d2a3..effb5eed67 100644 --- a/app/sdks/go/docs/examples/Teams/update-team-membership-status.md +++ b/app/sdks/go/docs/examples/Teams/update-team-membership-status.md @@ -16,8 +16,6 @@ var clt := appwrite.Client{} // Set Client required headers - clt.SetProject("") - clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/update-team.md b/app/sdks/go/docs/examples/Teams/update-team.md index d32a67800a..4635d3068e 100644 --- a/app/sdks/go/docs/examples/Teams/update-team.md +++ b/app/sdks/go/docs/examples/Teams/update-team.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Users/create-user.md b/app/sdks/go/docs/examples/Users/create-user.md index b790840277..17b770577f 100644 --- a/app/sdks/go/docs/examples/Users/create-user.md +++ b/app/sdks/go/docs/examples/Users/create-user.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/delete-user-session.md b/app/sdks/go/docs/examples/Users/delete-user-session.md index 6bc880b88a..c583cf1ea1 100644 --- a/app/sdks/go/docs/examples/Users/delete-user-session.md +++ b/app/sdks/go/docs/examples/Users/delete-user-session.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/delete-user-sessions.md b/app/sdks/go/docs/examples/Users/delete-user-sessions.md index 8d36d951d5..61e0d255b2 100644 --- a/app/sdks/go/docs/examples/Users/delete-user-sessions.md +++ b/app/sdks/go/docs/examples/Users/delete-user-sessions.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/get-user-logs.md b/app/sdks/go/docs/examples/Users/get-user-logs.md index 227d123413..02c484f58f 100644 --- a/app/sdks/go/docs/examples/Users/get-user-logs.md +++ b/app/sdks/go/docs/examples/Users/get-user-logs.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/get-user-prefs.md b/app/sdks/go/docs/examples/Users/get-user-prefs.md index fc9515a4af..fb94dc1f1c 100644 --- a/app/sdks/go/docs/examples/Users/get-user-prefs.md +++ b/app/sdks/go/docs/examples/Users/get-user-prefs.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/get-user-sessions.md b/app/sdks/go/docs/examples/Users/get-user-sessions.md index 99dd8b3fff..c5c6deb9c8 100644 --- a/app/sdks/go/docs/examples/Users/get-user-sessions.md +++ b/app/sdks/go/docs/examples/Users/get-user-sessions.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/get-user.md b/app/sdks/go/docs/examples/Users/get-user.md index d61430718b..0d3fbc760c 100644 --- a/app/sdks/go/docs/examples/Users/get-user.md +++ b/app/sdks/go/docs/examples/Users/get-user.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/list-users.md b/app/sdks/go/docs/examples/Users/list-users.md index 8332347ba8..71fc3c0bfc 100644 --- a/app/sdks/go/docs/examples/Users/list-users.md +++ b/app/sdks/go/docs/examples/Users/list-users.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/update-user-prefs.md b/app/sdks/go/docs/examples/Users/update-user-prefs.md index 50614f238e..2315287fbb 100644 --- a/app/sdks/go/docs/examples/Users/update-user-prefs.md +++ b/app/sdks/go/docs/examples/Users/update-user-prefs.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ @@ -25,7 +24,7 @@ } // Call UpdateUserPrefs method and handle results - var res, err := srv.UpdateUserPrefs("[USER_ID]", "{}") + var res, err := srv.UpdateUserPrefs("[USER_ID]", "") if err != nil { panic(err) } diff --git a/app/sdks/go/docs/examples/Users/update-user-status.md b/app/sdks/go/docs/examples/Users/update-user-status.md index d5570ca041..23ea9afc1c 100644 --- a/app/sdks/go/docs/examples/Users/update-user-status.md +++ b/app/sdks/go/docs/examples/Users/update-user-status.md @@ -17,7 +17,6 @@ // Set Client required headers clt.SetProject("") - clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go index fa66971182..cf6a0cfdd3 100644 --- a/app/sdks/go/locale.go +++ b/app/sdks/go/locale.go @@ -12,6 +12,8 @@ type Locale struct { // user country code, country name, continent name, continent code, ip address // and suggested currency. You can use the locale header to get the data in a // supported language. +// +// ([IP Geolocation by DB-IP](https://db-ip.com)) func (srv *Locale) GetLocale() (map[string]interface{}, error) { path := "/locale" @@ -44,9 +46,7 @@ func (srv *Locale) GetCountries() (map[string]interface{}, error) { } // GetCountriesEU list of all countries that are currently members of the EU. -// You can use the locale header to get the data in a supported language. UK -// brexit date is currently set to 2019-10-31 and will be updated if and when -// needed. +// You can use the locale header to get the data in a supported language. func (srv *Locale) GetCountriesEU() (map[string]interface{}, error) { path := "/locale/countries/eu" diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go index c0023cf9af..e4edd23bf4 100644 --- a/app/sdks/go/storage.go +++ b/app/sdks/go/storage.go @@ -28,11 +28,11 @@ func (srv *Storage) ListFiles(Search string, Limit int, Offset int, OrderType st // CreateFile create a new file. The user who creates the file will // automatically be assigned to read and write access unless he has passed // custom values for read and write arguments. -func (srv *Storage) CreateFile(Files string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { +func (srv *Storage) CreateFile(File string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { path := "/storage/files" params := map[string]interface{}{ - "files": Files, + "file": File, "read": Read, "write": Write, } @@ -91,10 +91,10 @@ func (srv *Storage) GetFileDownload(FileId string) (map[string]interface{}, erro return srv.client.Call("GET", path, nil, params) } -// GetFilePreview get file preview image. Currently, this method supports +// GetFilePreview get a file preview image. Currently, this method supports // preview for image files (jpg, png, and gif), other supported formats, like -// pdf, docs, slides, and spreadsheets will return file icon image. You can -// also pass query string arguments for cutting and resizing your preview +// pdf, docs, slides, and spreadsheets, will return the file icon image. You +// can also pass query string arguments for cutting and resizing your preview // image. func (srv *Storage) GetFilePreview(FileId string, Width int, Height int, Quality int, Background string, Output string) (map[string]interface{}, error) { r := strings.NewReplacer("{fileId}", FileId) diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index 7a4263f593..f9b7b949cb 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -78,11 +78,11 @@ func (srv *Teams) DeleteTeam(TeamId string) (map[string]interface{}, error) { return srv.client.Call("DELETE", path, nil, params) } -// GetTeamMembers get team members by the team unique ID. All team members +// GetTeamMemberships get team members by the team unique ID. All team members // have read access for this list of resources. -func (srv *Teams) GetTeamMembers(TeamId string) (map[string]interface{}, error) { +func (srv *Teams) GetTeamMemberships(TeamId string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId) - path := r.Replace("/teams/{teamId}/members") + path := r.Replace("/teams/{teamId}/memberships") params := map[string]interface{}{ } @@ -95,16 +95,16 @@ func (srv *Teams) GetTeamMembers(TeamId string) (map[string]interface{}, error) // address. If member doesn't exists in the project it will be automatically // created. // -// Use the redirect parameter to redirect the user from the invitation email -// back to your app. When the user is redirected, use the -// /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the -// user to the team. +// Use the 'url' parameter to redirect the user from the invitation email back +// to your app. When the user is redirected, use the [Update Team Membership +// Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join +// the user to the team. // -// Please notice that in order to avoid a [Redirect +// Please note that in order to avoid a [Redirect // Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) // the only valid redirect URL's are the once from domains you have set when // added your platforms in the console interface. -func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []interface{}, Redirect string, Name string) (map[string]interface{}, error) { +func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []interface{}, Url string, Name string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId) path := r.Replace("/teams/{teamId}/memberships") @@ -112,14 +112,15 @@ func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []inte "email": Email, "name": Name, "roles": Roles, - "redirect": Redirect, + "url": Url, } return srv.client.Call("POST", path, nil, params) } // DeleteTeamMembership this endpoint allows a user to leave a team or for a -// team owner to delete the membership of any other team member. +// team owner to delete the membership of any other team member. You can also +// use this endpoint to delete a user membership even if he didn't accept it. func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId, "{inviteId}", InviteId) path := r.Replace("/teams/{teamId}/memberships/{inviteId}") @@ -130,25 +131,12 @@ func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[stri return srv.client.Call("DELETE", path, nil, params) } -// CreateTeamMembershipResend use this endpoint to resend your invitation -// email for a user to join a team. -func (srv *Teams) CreateTeamMembershipResend(TeamId string, InviteId string, Redirect string) (map[string]interface{}, error) { - r := strings.NewReplacer("{teamId}", TeamId, "{inviteId}", InviteId) - path := r.Replace("/teams/{teamId}/memberships/{inviteId}/resend") - - params := map[string]interface{}{ - "redirect": Redirect, - } - - return srv.client.Call("POST", path, nil, params) -} - // UpdateTeamMembershipStatus use this endpoint to let user accept an // invitation to join a team after he is being redirect back to your app from // the invitation email. Use the success and failure URL's to redirect users // back to your application after the request completes. // -// Please notice that in order to avoid a [Redirect +// Please note that in order to avoid a [Redirect // Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) // the only valid redirect URL's are the once from domains you have set when // added your platforms in the console interface. @@ -158,15 +146,13 @@ func (srv *Teams) CreateTeamMembershipResend(TeamId string, InviteId string, Red // failure. This behavior was applied to help the web clients deal with // browsers who don't allow to set 3rd party HTTP cookies needed for saving // the account session token. -func (srv *Teams) UpdateTeamMembershipStatus(TeamId string, InviteId string, UserId string, Secret string, Success string, Failure string) (map[string]interface{}, error) { +func (srv *Teams) UpdateTeamMembershipStatus(TeamId string, InviteId string, UserId string, Secret string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId, "{inviteId}", InviteId) path := r.Replace("/teams/{teamId}/memberships/{inviteId}/status") params := map[string]interface{}{ "userId": UserId, "secret": Secret, - "success": Success, - "failure": Failure, } return srv.client.Call("PATCH", path, nil, params) diff --git a/app/sdks/javascript/LICENSE b/app/sdks/javascript/LICENSE new file mode 100644 index 0000000000..fc7c051a91 --- /dev/null +++ b/app/sdks/javascript/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/sdks/javascript/README.md b/app/sdks/javascript/README.md new file mode 100644 index 0000000000..581527d4a0 --- /dev/null +++ b/app/sdks/javascript/README.md @@ -0,0 +1,38 @@ +# Appwrite SDK for JavaScript + +![License](https://img.shields.io/github/license/appwrite/sdk-for-js.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) + +Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) + +![Appwrite](https://appwrite.io/images/github.png) + +## Installation + +### NPM + +To install via [NPM](https://www.npmjs.com/): + +```bash +npm install appwrite --save +``` + +If you're using a bundler (like [Browserify](http://browserify.org/) or [webpack](https://webpack.js.org/)), you can import the Appwrite module when you need it: + +```js +import * as Appwrite from "appwrite"; +``` + +### CDN + +To install with a CDN (content delivery network) add the following scripts to the bottom of your tag, but before you use any Appwrite services: + +```html + +``` + + + +## License + +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-account-recovery.md b/app/sdks/javascript/docs/examples/account/create-account-recovery.md new file mode 100644 index 0000000000..c72cb2e55e --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/create-account-recovery.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.createAccountRecovery('email@example.com', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-account-session-o-auth.md b/app/sdks/javascript/docs/examples/account/create-account-session-o-auth.md new file mode 100644 index 0000000000..f5fa4781e1 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/create-account-session-o-auth.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.createAccountSessionOAuth('bitbucket', 'https://example.com', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-account-session.md b/app/sdks/javascript/docs/examples/account/create-account-session.md new file mode 100644 index 0000000000..030c8a0997 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/create-account-session.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.createAccountSession('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-account-verification.md b/app/sdks/javascript/docs/examples/account/create-account-verification.md new file mode 100644 index 0000000000..1f3191732e --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/create-account-verification.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.createAccountVerification('https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-account.md b/app/sdks/javascript/docs/examples/account/create-account.md new file mode 100644 index 0000000000..0c10009e12 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/create-account.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.createAccount('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/delete-account-current-session.md b/app/sdks/javascript/docs/examples/account/delete-account-current-session.md new file mode 100644 index 0000000000..1ec94ce7e6 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/delete-account-current-session.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.deleteAccountCurrentSession(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/delete-account-session.md b/app/sdks/javascript/docs/examples/account/delete-account-session.md new file mode 100644 index 0000000000..bd916923e0 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/delete-account-session.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.deleteAccountSession('[ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/delete-account-sessions.md b/app/sdks/javascript/docs/examples/account/delete-account-sessions.md new file mode 100644 index 0000000000..5c89537df8 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/delete-account-sessions.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.deleteAccountSessions(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/delete.md b/app/sdks/javascript/docs/examples/account/delete.md new file mode 100644 index 0000000000..c199f0f719 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/delete.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.delete(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/get-account-logs.md b/app/sdks/javascript/docs/examples/account/get-account-logs.md new file mode 100644 index 0000000000..f913b22d34 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/get-account-logs.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.getAccountLogs(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/get-account-prefs.md b/app/sdks/javascript/docs/examples/account/get-account-prefs.md new file mode 100644 index 0000000000..043c9f2e71 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/get-account-prefs.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.getAccountPrefs(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/get-account-sessions.md b/app/sdks/javascript/docs/examples/account/get-account-sessions.md new file mode 100644 index 0000000000..ab550e510f --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/get-account-sessions.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.getAccountSessions(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/get-account.md b/app/sdks/javascript/docs/examples/account/get-account.md new file mode 100644 index 0000000000..951c0339c4 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/get-account.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.getAccount(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-account-name.md b/app/sdks/javascript/docs/examples/account/update-account-name.md new file mode 100644 index 0000000000..e527233999 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/update-account-name.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.updateAccountName('[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-account-password.md b/app/sdks/javascript/docs/examples/account/update-account-password.md new file mode 100644 index 0000000000..fcf39adf17 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/update-account-password.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.updateAccountPassword('password', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-account-recovery.md b/app/sdks/javascript/docs/examples/account/update-account-recovery.md new file mode 100644 index 0000000000..2bf315b42e --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/update-account-recovery.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.updateAccountRecovery('[USER_ID]', '[SECRET]', 'password', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-account-verification.md b/app/sdks/javascript/docs/examples/account/update-account-verification.md new file mode 100644 index 0000000000..796e8d2aa5 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/update-account-verification.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.updateAccountVerification('[USER_ID]', '[SECRET]', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-email.md b/app/sdks/javascript/docs/examples/account/update-email.md new file mode 100644 index 0000000000..e9fb9c9ed2 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/update-email.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.updateEmail('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-prefs.md b/app/sdks/javascript/docs/examples/account/update-prefs.md new file mode 100644 index 0000000000..9deb78a41f --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/update-prefs.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.updatePrefs(''); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/avatars/get-browser.md b/app/sdks/javascript/docs/examples/avatars/get-browser.md new file mode 100644 index 0000000000..84c992621e --- /dev/null +++ b/app/sdks/javascript/docs/examples/avatars/get-browser.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.avatars.getBrowser('aa'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/avatars/get-credit-card.md b/app/sdks/javascript/docs/examples/avatars/get-credit-card.md new file mode 100644 index 0000000000..c9fb87edc7 --- /dev/null +++ b/app/sdks/javascript/docs/examples/avatars/get-credit-card.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.avatars.getCreditCard('amex'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/avatars/get-favicon.md b/app/sdks/javascript/docs/examples/avatars/get-favicon.md new file mode 100644 index 0000000000..5876eb2b5a --- /dev/null +++ b/app/sdks/javascript/docs/examples/avatars/get-favicon.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.avatars.getFavicon('https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/avatars/get-flag.md b/app/sdks/javascript/docs/examples/avatars/get-flag.md new file mode 100644 index 0000000000..694c6b399e --- /dev/null +++ b/app/sdks/javascript/docs/examples/avatars/get-flag.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.avatars.getFlag('af'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/avatars/get-image.md b/app/sdks/javascript/docs/examples/avatars/get-image.md new file mode 100644 index 0000000000..b807ff734e --- /dev/null +++ b/app/sdks/javascript/docs/examples/avatars/get-image.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.avatars.getImage('https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/avatars/get-q-r.md b/app/sdks/javascript/docs/examples/avatars/get-q-r.md new file mode 100644 index 0000000000..e64d83a5c4 --- /dev/null +++ b/app/sdks/javascript/docs/examples/avatars/get-q-r.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.avatars.getQR('[TEXT]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/create-collection.md b/app/sdks/javascript/docs/examples/database/create-collection.md new file mode 100644 index 0000000000..a93fe45778 --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/create-collection.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.createCollection('[NAME]', [], [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/create-document.md b/app/sdks/javascript/docs/examples/database/create-document.md new file mode 100644 index 0000000000..aa251ae2b2 --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/create-document.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.createDocument('[COLLECTION_ID]', '{}', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/delete-collection.md b/app/sdks/javascript/docs/examples/database/delete-collection.md new file mode 100644 index 0000000000..1a116c58b9 --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/delete-collection.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.deleteCollection('[COLLECTION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/delete-document.md b/app/sdks/javascript/docs/examples/database/delete-document.md new file mode 100644 index 0000000000..7dd7fc4db4 --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/delete-document.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.deleteDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/get-collection.md b/app/sdks/javascript/docs/examples/database/get-collection.md new file mode 100644 index 0000000000..abe8d482d4 --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/get-collection.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.getCollection('[COLLECTION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/get-document.md b/app/sdks/javascript/docs/examples/database/get-document.md new file mode 100644 index 0000000000..1bcb5b00ac --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/get-document.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.getDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/list-collections.md b/app/sdks/javascript/docs/examples/database/list-collections.md new file mode 100644 index 0000000000..3160903309 --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/list-collections.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.listCollections(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/list-documents.md b/app/sdks/javascript/docs/examples/database/list-documents.md new file mode 100644 index 0000000000..68ce8d6c23 --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/list-documents.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.listDocuments('[COLLECTION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/update-collection.md b/app/sdks/javascript/docs/examples/database/update-collection.md new file mode 100644 index 0000000000..726c244c79 --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/update-collection.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.updateCollection('[COLLECTION_ID]', '[NAME]', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/database/update-document.md b/app/sdks/javascript/docs/examples/database/update-document.md new file mode 100644 index 0000000000..7809b97bfd --- /dev/null +++ b/app/sdks/javascript/docs/examples/database/update-document.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.database.updateDocument('[COLLECTION_ID]', '[DOCUMENT_ID]', '{}', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/locale/get-continents.md b/app/sdks/javascript/docs/examples/locale/get-continents.md new file mode 100644 index 0000000000..a8de63eb91 --- /dev/null +++ b/app/sdks/javascript/docs/examples/locale/get-continents.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.locale.getContinents(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/locale/get-countries-e-u.md b/app/sdks/javascript/docs/examples/locale/get-countries-e-u.md new file mode 100644 index 0000000000..44ceffd7e7 --- /dev/null +++ b/app/sdks/javascript/docs/examples/locale/get-countries-e-u.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.locale.getCountriesEU(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/locale/get-countries-phones.md b/app/sdks/javascript/docs/examples/locale/get-countries-phones.md new file mode 100644 index 0000000000..afd084f5d4 --- /dev/null +++ b/app/sdks/javascript/docs/examples/locale/get-countries-phones.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.locale.getCountriesPhones(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/locale/get-countries.md b/app/sdks/javascript/docs/examples/locale/get-countries.md new file mode 100644 index 0000000000..521195bfaa --- /dev/null +++ b/app/sdks/javascript/docs/examples/locale/get-countries.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.locale.getCountries(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/locale/get-currencies.md b/app/sdks/javascript/docs/examples/locale/get-currencies.md new file mode 100644 index 0000000000..8032307f86 --- /dev/null +++ b/app/sdks/javascript/docs/examples/locale/get-currencies.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.locale.getCurrencies(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/locale/get-locale.md b/app/sdks/javascript/docs/examples/locale/get-locale.md new file mode 100644 index 0000000000..4cc5a3f3b2 --- /dev/null +++ b/app/sdks/javascript/docs/examples/locale/get-locale.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.locale.getLocale(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-key.md b/app/sdks/javascript/docs/examples/projects/create-key.md new file mode 100644 index 0000000000..3c12c8a8c2 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/create-key.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.createKey('[PROJECT_ID]', '[NAME]', []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-platform.md b/app/sdks/javascript/docs/examples/projects/create-platform.md new file mode 100644 index 0000000000..b67b84ba56 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/create-platform.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.createPlatform('[PROJECT_ID]', 'web', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-project.md b/app/sdks/javascript/docs/examples/projects/create-project.md new file mode 100644 index 0000000000..a1b6922fed --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/create-project.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.createProject('[NAME]', '[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-task.md b/app/sdks/javascript/docs/examples/projects/create-task.md new file mode 100644 index 0000000000..3262b4d9fe --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/create-task.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-webhook.md b/app/sdks/javascript/docs/examples/projects/create-webhook.md new file mode 100644 index 0000000000..66a76c26c2 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/create-webhook.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-key.md b/app/sdks/javascript/docs/examples/projects/delete-key.md new file mode 100644 index 0000000000..e5ae8e426c --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/delete-key.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.deleteKey('[PROJECT_ID]', '[KEY_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-platform.md b/app/sdks/javascript/docs/examples/projects/delete-platform.md new file mode 100644 index 0000000000..450f9cd0a6 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/delete-platform.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.deletePlatform('[PROJECT_ID]', '[PLATFORM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-project.md b/app/sdks/javascript/docs/examples/projects/delete-project.md new file mode 100644 index 0000000000..b60d4de3c9 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/delete-project.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.deleteProject('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-task.md b/app/sdks/javascript/docs/examples/projects/delete-task.md new file mode 100644 index 0000000000..3208d38bf8 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/delete-task.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.deleteTask('[PROJECT_ID]', '[TASK_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-webhook.md b/app/sdks/javascript/docs/examples/projects/delete-webhook.md new file mode 100644 index 0000000000..030a3b77f1 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/delete-webhook.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.deleteWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-key.md b/app/sdks/javascript/docs/examples/projects/get-key.md new file mode 100644 index 0000000000..7207b33bf7 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/get-key.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.getKey('[PROJECT_ID]', '[KEY_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-platform.md b/app/sdks/javascript/docs/examples/projects/get-platform.md new file mode 100644 index 0000000000..6f353f3aca --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/get-platform.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.getPlatform('[PROJECT_ID]', '[PLATFORM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-project-usage.md b/app/sdks/javascript/docs/examples/projects/get-project-usage.md new file mode 100644 index 0000000000..87a2e3148a --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/get-project-usage.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.getProjectUsage('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-project.md b/app/sdks/javascript/docs/examples/projects/get-project.md new file mode 100644 index 0000000000..084e48c253 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/get-project.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.getProject('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-task.md b/app/sdks/javascript/docs/examples/projects/get-task.md new file mode 100644 index 0000000000..e5195bce8c --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/get-task.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.getTask('[PROJECT_ID]', '[TASK_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-webhook.md b/app/sdks/javascript/docs/examples/projects/get-webhook.md new file mode 100644 index 0000000000..a2b6089c3e --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/get-webhook.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.getWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-keys.md b/app/sdks/javascript/docs/examples/projects/list-keys.md new file mode 100644 index 0000000000..14ef64fb6f --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/list-keys.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.listKeys('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-platforms.md b/app/sdks/javascript/docs/examples/projects/list-platforms.md new file mode 100644 index 0000000000..7cfd9341a7 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/list-platforms.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.listPlatforms('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-projects.md b/app/sdks/javascript/docs/examples/projects/list-projects.md new file mode 100644 index 0000000000..3ba3afc41e --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/list-projects.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.listProjects(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-tasks.md b/app/sdks/javascript/docs/examples/projects/list-tasks.md new file mode 100644 index 0000000000..fd8ab61ffa --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/list-tasks.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.listTasks('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-webhooks.md b/app/sdks/javascript/docs/examples/projects/list-webhooks.md new file mode 100644 index 0000000000..b19851c8b1 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/list-webhooks.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.listWebhooks('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-key.md b/app/sdks/javascript/docs/examples/projects/update-key.md new file mode 100644 index 0000000000..063f4daea4 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/update-key.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.updateKey('[PROJECT_ID]', '[KEY_ID]', '[NAME]', []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-platform.md b/app/sdks/javascript/docs/examples/projects/update-platform.md new file mode 100644 index 0000000000..e28846f050 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/update-platform.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.updatePlatform('[PROJECT_ID]', '[PLATFORM_ID]', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-project-o-auth.md b/app/sdks/javascript/docs/examples/projects/update-project-o-auth.md new file mode 100644 index 0000000000..9ab78a4ea9 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/update-project-o-auth.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.updateProjectOAuth('[PROJECT_ID]', 'bitbucket'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-project.md b/app/sdks/javascript/docs/examples/projects/update-project.md new file mode 100644 index 0000000000..6fcaa49f37 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/update-project.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.updateProject('[PROJECT_ID]', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-task.md b/app/sdks/javascript/docs/examples/projects/update-task.md new file mode 100644 index 0000000000..54116a41d0 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/update-task.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-webhook.md b/app/sdks/javascript/docs/examples/projects/update-webhook.md new file mode 100644 index 0000000000..ce876d5a64 --- /dev/null +++ b/app/sdks/javascript/docs/examples/projects/update-webhook.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/create-file.md b/app/sdks/javascript/docs/examples/storage/create-file.md new file mode 100644 index 0000000000..53157d19a3 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/create-file.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.createFile(document.getElementById('uploader').files[0], [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/delete-file.md b/app/sdks/javascript/docs/examples/storage/delete-file.md new file mode 100644 index 0000000000..4e39bd9811 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/delete-file.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.deleteFile('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-file-download.md b/app/sdks/javascript/docs/examples/storage/get-file-download.md new file mode 100644 index 0000000000..a53142184c --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/get-file-download.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.getFileDownload('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-file-preview.md b/app/sdks/javascript/docs/examples/storage/get-file-preview.md new file mode 100644 index 0000000000..1cce3acd24 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/get-file-preview.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.getFilePreview('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-file-view.md b/app/sdks/javascript/docs/examples/storage/get-file-view.md new file mode 100644 index 0000000000..4844b22ce3 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/get-file-view.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.getFileView('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-file.md b/app/sdks/javascript/docs/examples/storage/get-file.md new file mode 100644 index 0000000000..32b11a2175 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/get-file.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.getFile('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/list-files.md b/app/sdks/javascript/docs/examples/storage/list-files.md new file mode 100644 index 0000000000..0033bb254d --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/list-files.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.listFiles(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/update-file.md b/app/sdks/javascript/docs/examples/storage/update-file.md new file mode 100644 index 0000000000..72d6ee3166 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/update-file.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.updateFile('[FILE_ID]', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/create-team-membership.md b/app/sdks/javascript/docs/examples/teams/create-team-membership.md new file mode 100644 index 0000000000..60f996c209 --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/create-team-membership.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.createTeamMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/create-team.md b/app/sdks/javascript/docs/examples/teams/create-team.md new file mode 100644 index 0000000000..2dafeac2ab --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/create-team.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.createTeam('[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/delete-team-membership.md b/app/sdks/javascript/docs/examples/teams/delete-team-membership.md new file mode 100644 index 0000000000..551dfd7dbb --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/delete-team-membership.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.deleteTeamMembership('[TEAM_ID]', '[INVITE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/delete-team.md b/app/sdks/javascript/docs/examples/teams/delete-team.md new file mode 100644 index 0000000000..3f9cd8b6f5 --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/delete-team.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.deleteTeam('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/get-team-memberships.md b/app/sdks/javascript/docs/examples/teams/get-team-memberships.md new file mode 100644 index 0000000000..20ce7b2bea --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/get-team-memberships.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.getTeamMemberships('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/get-team.md b/app/sdks/javascript/docs/examples/teams/get-team.md new file mode 100644 index 0000000000..7e1f8254fe --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/get-team.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.getTeam('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/list-teams.md b/app/sdks/javascript/docs/examples/teams/list-teams.md new file mode 100644 index 0000000000..abd4fa420b --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/list-teams.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.listTeams(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/update-team-membership-status.md b/app/sdks/javascript/docs/examples/teams/update-team-membership-status.md new file mode 100644 index 0000000000..d4d83e9705 --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/update-team-membership-status.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.teams.updateTeamMembershipStatus('[TEAM_ID]', '[INVITE_ID]', '[USER_ID]', '[SECRET]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/update-team.md b/app/sdks/javascript/docs/examples/teams/update-team.md new file mode 100644 index 0000000000..2ec35ec906 --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/update-team.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.updateTeam('[TEAM_ID]', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/create-user.md b/app/sdks/javascript/docs/examples/users/create-user.md new file mode 100644 index 0000000000..1242fe70c2 --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/create-user.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.createUser('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/delete-user-session.md b/app/sdks/javascript/docs/examples/users/delete-user-session.md new file mode 100644 index 0000000000..4b5df53439 --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/delete-user-session.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.deleteUserSession('[USER_ID]', '[SESSION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/delete-user-sessions.md b/app/sdks/javascript/docs/examples/users/delete-user-sessions.md new file mode 100644 index 0000000000..1a6851ce15 --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/delete-user-sessions.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.deleteUserSessions('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/get-user-logs.md b/app/sdks/javascript/docs/examples/users/get-user-logs.md new file mode 100644 index 0000000000..85175b0e1e --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/get-user-logs.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.getUserLogs('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/get-user-prefs.md b/app/sdks/javascript/docs/examples/users/get-user-prefs.md new file mode 100644 index 0000000000..0d9c8dbb22 --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/get-user-prefs.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.getUserPrefs('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/get-user-sessions.md b/app/sdks/javascript/docs/examples/users/get-user-sessions.md new file mode 100644 index 0000000000..8cc7b1f85b --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/get-user-sessions.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.getUserSessions('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/get-user.md b/app/sdks/javascript/docs/examples/users/get-user.md new file mode 100644 index 0000000000..feb40dff2d --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/get-user.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.getUser('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/list-users.md b/app/sdks/javascript/docs/examples/users/list-users.md new file mode 100644 index 0000000000..561826cbd1 --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/list-users.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.listUsers(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/update-user-prefs.md b/app/sdks/javascript/docs/examples/users/update-user-prefs.md new file mode 100644 index 0000000000..7c9918cc07 --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/update-user-prefs.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.updateUserPrefs('[USER_ID]', ''); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/update-user-status.md b/app/sdks/javascript/docs/examples/users/update-user-status.md new file mode 100644 index 0000000000..15b7376ca7 --- /dev/null +++ b/app/sdks/javascript/docs/examples/users/update-user-status.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.users.updateUserStatus('[USER_ID]', '1'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/package.json b/app/sdks/javascript/package.json new file mode 100644 index 0000000000..e718733189 --- /dev/null +++ b/app/sdks/javascript/package.json @@ -0,0 +1,14 @@ +{ + "name": "appwrite", + "homepage": "https://appwrite.io/support", + "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)", + "version": "1.0.28", + "license": "BSD-3-Clause", + "main": "src/sdk.js", + "repository": { + "type": "git", + "url": "https://github.com/appwrite/sdk-for-js" + }, + "devDependencies": {}, + "dependencies": {} +} \ No newline at end of file diff --git a/app/sdks/javascript/src/sdk.js b/app/sdks/javascript/src/sdk.js new file mode 100644 index 0000000000..8e286fd404 --- /dev/null +++ b/app/sdks/javascript/src/sdk.js @@ -0,0 +1,3886 @@ +(function (window) { + + 'use strict'; + + window.Appwrite = function () { + + let config = { + endpoint: 'https://appwrite.io/v1', + project: '', + key: '', + locale: '', + mode: '', + }; + + /** + * @param {string} endpoint + * @returns {this} + */ + let setEndpoint = function(endpoint) { + config.endpoint = endpoint; + + return this; + }; + + /** + * Set Project + * + * Your Appwrite project ID + * + * @param value string + * + * @return this + */ + let setProject = function (value) + { + http.addGlobalHeader('X-Appwrite-Project', value); + + config.project = value; + + return this; + }; + + /** + * Set Key + * + * Your Appwrite project secret key + * + * @param value string + * + * @return this + */ + let setKey = function (value) + { + http.addGlobalHeader('X-Appwrite-Key', value); + + config.key = value; + + return this; + }; + + /** + * Set Locale + * + * @param value string + * + * @return this + */ + let setLocale = function (value) + { + http.addGlobalHeader('X-Appwrite-Locale', value); + + config.locale = value; + + return this; + }; + + /** + * Set Mode + * + * @param value string + * + * @return this + */ + let setMode = function (value) + { + http.addGlobalHeader('X-Appwrite-Mode', value); + + config.mode = value; + + return this; + }; + + let http = function(document) { + let globalParams = [], + globalHeaders = []; + + let addParam = function (url, param, value) { + let a = document.createElement('a'), regex = /(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g; + let match, str = []; + a.href = url; + param = encodeURIComponent(param); + + while (match = regex.exec(a.search)) if (param !== match[1]) str.push(match[1] + (match[2] ? "=" + match[2] : "")); + + str.push(param + (value ? "=" + encodeURIComponent(value) : "")); + + a.search = str.join("&"); + + return a.href; + }; + + /** + * @param {Object} params + * @returns {string} + */ + let buildQuery = function(params) { + let str = []; + + for (let p in params) { + if(Array.isArray(params[p])) { + for (let index = 0; index < params[p].length; index++) { + let param = params[p][index]; + str.push(encodeURIComponent(p + '[]') + "=" + encodeURIComponent(param)); + } + } + else { + str.push(encodeURIComponent(p) + "=" + encodeURIComponent(params[p])); + } + } + + return str.join("&"); + }; + + let addGlobalHeader = function(key, value) { + globalHeaders[key] = {key: key.toLowerCase(), value: value.toLowerCase()}; + }; + + let addGlobalParam = function(key, value) { + globalParams.push({key: key, value: value}); + }; + + addGlobalHeader('x-sdk-version', 'appwrite:javascript:1.0.28'); + addGlobalHeader('content-type', ''); + + /** + * @param {string} method + * @param {string} path string + * @param {Object} headers + * @param {Object} params + * @param {function} progress + * @returns {Promise} + */ + let call = function (method, path, headers = {}, params = {}, progress = null) { + let i; + + path = config.endpoint + path; + + if (-1 === ['GET', 'POST', 'PUT', 'DELETE', 'TRACE', 'HEAD', 'OPTIONS', 'CONNECT', 'PATCH'].indexOf(method)) { + throw new Error('var method must contain a valid HTTP method name'); + } + + if (typeof path !== 'string') { + throw new Error('var path must be of type string'); + } + + if (typeof headers !== 'object') { + throw new Error('var headers must be of type object'); + } + + for (i = 0; i < globalParams.length; i++) { // Add global params to URL + path = addParam(path, globalParams[i].key, globalParams[i].value); + } + + for (let key in globalHeaders) { // Add Global Headers + if (globalHeaders.hasOwnProperty(key)) { + if (!headers[globalHeaders[key].key]) { + headers[globalHeaders[key].key] = globalHeaders[key].value; + } + } + } + + if(method === 'GET') { + for (let param in params) { + if (param.hasOwnProperty(key)) { + path = addParam(path, key + (Array.isArray(param) ? '[]' : ''), params[key]); + } + } + } + + switch (headers['content-type']) { // Parse request by content type + case 'application/json': + params = JSON.stringify(params); + break; + + case 'multipart/form-data': + let formData = new FormData(); + + Object.keys(params).forEach(function(key) { + let param = params[key]; + formData.append(key + (Array.isArray(param) ? '[]' : ''), param); + }); + + params = formData; + break; + } + + return new Promise(function (resolve, reject) { + + let request = new XMLHttpRequest(), key; + + request.withCredentials = true; + request.open(method, path, true); + + for (key in headers) { // Set Headers + if (headers.hasOwnProperty(key)) { + if (key === 'content-type' && headers[key] === 'multipart/form-data') { // Skip to avoid missing boundary + continue; + } + + request.setRequestHeader(key, headers[key]); + } + } + + request.onload = function () { + if (4 === request.readyState && 399 >= request.status) { + let data = request.response; + let contentType = this.getResponseHeader('content-type') || ''; + contentType = contentType.substring(0, contentType.indexOf(';')); + + switch (contentType) { + case 'application/json': + data = JSON.parse(data); + break; + } + + resolve(data); + + } else { + reject(new Error(request.statusText)); + } + }; + + if (progress) { + request.addEventListener('progress', progress); + request.upload.addEventListener('progress', progress, false); + } + + // Handle network errors + request.onerror = function () { + reject(new Error("Network Error")); + }; + + request.send(params); + }) + }; + + return { + 'get': function(path, headers = {}, params = {}) { + return call('GET', path + ((Object.keys(params).length > 0) ? '?' + buildQuery(params) : ''), headers, {}); + }, + 'post': function(path, headers = {}, params = {}, progress = null) { + return call('POST', path, headers, params, progress); + }, + 'put': function(path, headers = {}, params = {}, progress = null) { + return call('PUT', path, headers, params, progress); + }, + 'patch': function(path, headers = {}, params = {}, progress = null) { + return call('PATCH', path, headers, params, progress); + }, + 'delete': function(path, headers = {}, params = {}, progress = null) { + return call('DELETE', path, headers, params, progress); + }, + 'addGlobalParam': addGlobalParam, + 'addGlobalHeader': addGlobalHeader + } + }(window.document); + + let iframe = function(method, url, params) { + let form = document.createElement('form'); + + form.setAttribute('method', method); + form.setAttribute('action', config.endpoint + url); + + for(let key in params) { + if(params.hasOwnProperty(key)) { + let hiddenField = document.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", key); + hiddenField.setAttribute("value", params[key]); + + form.appendChild(hiddenField); + } + } + + document.body.appendChild(form); + + return form.submit(); + }; + + let account = { + + /** + * Get Account + * + * Get currently logged in user data as JSON object. + * + * @throws {Error} + * @return {Promise} + */ + getAccount: function() { + let path = '/account'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Account + * + * Use this endpoint to allow a new user to register an account in your + * project. Use the success and failure URLs to redirect users back to your + * application after signup completes. + * + * If registration completes successfully user will be sent with a + * confirmation email in order to confirm he is the owner of the account email + * address. Use the confirmation parameter to redirect the user from the + * confirmation email back to your app. When the user is redirected, use the + * /auth/confirm endpoint to complete the account confirmation. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * When accessing this route using Javascript from the browser, success and + * failure parameter URLs are required. Appwrite server will respond with a + * 301 redirect status code and will set the user session cookie. This + * behavior is enforced because modern browsers are limiting 3rd party cookies + * in XHR of fetch requests to protect user privacy. + * + * @param {string} email + * @param {string} password + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + createAccount: function(email, password, name = '') { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + let path = '/account'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(password) { + payload['password'] = password; + } + + if(name) { + payload['name'] = name; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Account + * + * Delete a currently logged in user account. Behind the scene, the user + * record is not deleted but permanently blocked from any access. This is done + * to avoid deleted accounts being overtaken by new users with the same email + * address. Any user-related resources like documents or storage files should + * be deleted separately. + * + * @throws {Error} + * @return {Promise} + */ + delete: function() { + let path = '/account'; + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Account Email + * + * Update currently logged in user account email address. After changing user + * address, user confirmation status is being reset and a new confirmation + * mail is sent. For security measures, user password is required to complete + * this request. + * + * @param {string} email + * @param {string} password + * @throws {Error} + * @return {Promise} + */ + updateEmail: function(email, password) { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + let path = '/account/email'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(password) { + payload['password'] = password; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Account Logs + * + * Get currently logged in user list of latest security activity logs. Each + * log returns user IP address, location and date and time of log. + * + * @throws {Error} + * @return {Promise} + */ + getAccountLogs: function() { + let path = '/account/logs'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Account Name + * + * Update currently logged in user account name. + * + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + updateAccountName: function(name) { + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/account/name'; + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Account Password + * + * Update currently logged in user password. For validation, user is required + * to pass the password twice. + * + * @param {string} password + * @param {string} oldPassword + * @throws {Error} + * @return {Promise} + */ + updateAccountPassword: function(password, oldPassword) { + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + if(oldPassword === undefined) { + throw new Error('Missing required parameter: "oldPassword"'); + } + + let path = '/account/password'; + + let payload = {}; + + if(password) { + payload['password'] = password; + } + + if(oldPassword) { + payload['old-password'] = oldPassword; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Account Preferences + * + * Get currently logged in user preferences key-value object. + * + * @throws {Error} + * @return {Promise} + */ + getAccountPrefs: function() { + let path = '/account/prefs'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Account Preferences + * + * Update currently logged in user account preferences. You can pass only the + * specific settings you wish to update. + * + * @param {string} prefs + * @throws {Error} + * @return {Promise} + */ + updatePrefs: function(prefs) { + if(prefs === undefined) { + throw new Error('Missing required parameter: "prefs"'); + } + + let path = '/account/prefs'; + + let payload = {}; + + if(prefs) { + payload['prefs'] = prefs; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Password Recovery + * + * Sends the user an email with a temporary secret token for password reset. + * When the user clicks the confirmation link he is redirected back to your + * app password reset redirect URL with a secret token and email address + * values attached to the URL query string. Use the query string params to + * submit a request to the /auth/password/reset endpoint to complete the + * process. + * + * @param {string} email + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + createAccountRecovery: function(email, url) { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/account/recovery'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(url) { + payload['url'] = url; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Password Reset + * + * Use this endpoint to complete the user account password reset. Both the + * **userId** and **token** arguments will be passed as query parameters to + * the redirect URL you have provided when sending your request to the + * /auth/recovery endpoint. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * @param {string} userId + * @param {string} secret + * @param {string} passwordA + * @param {string} passwordB + * @throws {Error} + * @return {Promise} + */ + updateAccountRecovery: function(userId, secret, passwordA, passwordB) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(secret === undefined) { + throw new Error('Missing required parameter: "secret"'); + } + + if(passwordA === undefined) { + throw new Error('Missing required parameter: "passwordA"'); + } + + if(passwordB === undefined) { + throw new Error('Missing required parameter: "passwordB"'); + } + + let path = '/account/recovery'; + + let payload = {}; + + if(userId) { + payload['userId'] = userId; + } + + if(secret) { + payload['secret'] = secret; + } + + if(passwordA) { + payload['password-a'] = passwordA; + } + + if(passwordB) { + payload['password-b'] = passwordB; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Account Sessions + * + * Get currently logged in user list of active sessions across different + * devices. + * + * @throws {Error} + * @return {Promise} + */ + getAccountSessions: function() { + let path = '/account/sessions'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Account Session + * + * Allow the user to login into his account by providing a valid email and + * password combination. Use the success and failure arguments to provide a + * redirect URL's back to your app when login is completed. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * When accessing this route using Javascript from the browser, success and + * failure parameter URLs are required. Appwrite server will respond with a + * 301 redirect status code and will set the user session cookie. This + * behavior is enforced because modern browsers are limiting 3rd party cookies + * in XHR of fetch requests to protect user privacy. + * + * @param {string} email + * @param {string} password + * @throws {Error} + * @return {Promise} + */ + createAccountSession: function(email, password) { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + let path = '/account/sessions'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(password) { + payload['password'] = password; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete All Account Sessions + * + * Delete all sessions from the user account and remove any sessions cookies + * from the end client. + * + * @throws {Error} + * @return {Promise} + */ + deleteAccountSessions: function() { + let path = '/account/sessions'; + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Current Account Session + * + * Use this endpoint to log out the currently logged in user from his account. + * When successful this endpoint will delete the user session and remove the + * session secret cookie from the user client. + * + * @throws {Error} + * @return {Promise} + */ + deleteAccountCurrentSession: function() { + let path = '/account/sessions/current'; + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Account Session with OAuth + * + * Allow the user to login to his account using the OAuth provider of his + * choice. Each OAuth provider should be enabled from the Appwrite console + * first. Use the success and failure arguments to provide a redirect URL's + * back to your app when login is completed. + * + * @param {string} provider + * @param {string} success + * @param {string} failure + * @throws {Error} + * @return {Promise} + */ + createAccountSessionOAuth: function(provider, success, failure) { + if(provider === undefined) { + throw new Error('Missing required parameter: "provider"'); + } + + if(success === undefined) { + throw new Error('Missing required parameter: "success"'); + } + + if(failure === undefined) { + throw new Error('Missing required parameter: "failure"'); + } + + let path = '/account/sessions/oauth/{provider}'.replace(new RegExp('{provider}', 'g'), provider); + + let payload = {}; + + if(success) { + payload['success'] = success; + } + + if(failure) { + payload['failure'] = failure; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Account Session + * + * Use this endpoint to log out the currently logged in user from all his + * account sessions across all his different devices. When using the option id + * argument, only the session unique ID provider will be deleted. + * + * @param {string} id + * @throws {Error} + * @return {Promise} + */ + deleteAccountSession: function(id) { + if(id === undefined) { + throw new Error('Missing required parameter: "id"'); + } + + let path = '/account/sessions/{id}'.replace(new RegExp('{id}', 'g'), id); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Verification + * + * Use this endpoint to send a verification message to your user email address + * to confirm they are the valid owners of that address. Both the **userId** + * and **token** arguments will be passed as query parameters to the URL you + * have provider to be attached to the verification email. The provided URL + * should redirect the user back for your app and allow you to complete the + * verification process by verifying both the **userId** and **token** + * parameters. Learn more about how to [complete the verification + * process](/docs/account#updateAccountVerification). + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + createAccountVerification: function(url) { + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/account/verification'; + + let payload = {}; + + if(url) { + payload['url'] = url; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Updated Verification + * + * Use this endpoint to complete the user email verification process. Use both + * the **userId** and **token** parameters that were attached to your app URL + * to verify the user email ownership. If confirmed this route will return a + * 200 status code. + * + * @param {string} userId + * @param {string} secret + * @param {string} passwordB + * @throws {Error} + * @return {Promise} + */ + updateAccountVerification: function(userId, secret, passwordB) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(secret === undefined) { + throw new Error('Missing required parameter: "secret"'); + } + + if(passwordB === undefined) { + throw new Error('Missing required parameter: "passwordB"'); + } + + let path = '/account/verification'; + + let payload = {}; + + if(userId) { + payload['userId'] = userId; + } + + if(secret) { + payload['secret'] = secret; + } + + if(passwordB) { + payload['password-b'] = passwordB; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let avatars = { + + /** + * Get Browser Icon + * + * You can use this endpoint to show different browser icons to your users. + * The code argument receives the browser code as it appears in your user + * /account/sessions endpoint. Use width, height and quality arguments to + * change the output settings. + * + * @param {string} code + * @param {number} width + * @param {number} height + * @param {number} quality + * @throws {Error} + * @return {Promise} + */ + getBrowser: function(code, width = 100, height = 100, quality = 100) { + if(code === undefined) { + throw new Error('Missing required parameter: "code"'); + } + + let path = '/avatars/browsers/{code}'.replace(new RegExp('{code}', 'g'), code); + + let payload = {}; + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + if(quality) { + payload['quality'] = quality; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Credit Card Icon + * + * Need to display your users with your billing method or their payment + * methods? The credit card endpoint will return you the icon of the credit + * card provider you need. Use width, height and quality arguments to change + * the output settings. + * + * @param {string} code + * @param {number} width + * @param {number} height + * @param {number} quality + * @throws {Error} + * @return {Promise} + */ + getCreditCard: function(code, width = 100, height = 100, quality = 100) { + if(code === undefined) { + throw new Error('Missing required parameter: "code"'); + } + + let path = '/avatars/credit-cards/{code}'.replace(new RegExp('{code}', 'g'), code); + + let payload = {}; + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + if(quality) { + payload['quality'] = quality; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Favicon + * + * Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote + * website URL. + * + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + getFavicon: function(url) { + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/avatars/favicon'; + + let payload = {}; + + if(url) { + payload['url'] = url; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Country Flag + * + * You can use this endpoint to show different country flags icons to your + * users. The code argument receives the 2 letter country code. Use width, + * height and quality arguments to change the output settings. + * + * @param {string} code + * @param {number} width + * @param {number} height + * @param {number} quality + * @throws {Error} + * @return {Promise} + */ + getFlag: function(code, width = 100, height = 100, quality = 100) { + if(code === undefined) { + throw new Error('Missing required parameter: "code"'); + } + + let path = '/avatars/flags/{code}'.replace(new RegExp('{code}', 'g'), code); + + let payload = {}; + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + if(quality) { + payload['quality'] = quality; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Image from URL + * + * Use this endpoint to fetch a remote image URL and crop it to any image size + * you want. This endpoint is very useful if you need to crop and display + * remote images in your app or in case you want to make sure a 3rd party + * image is properly served using a TLS protocol. + * + * @param {string} url + * @param {number} width + * @param {number} height + * @throws {Error} + * @return {Promise} + */ + getImage: function(url, width = 400, height = 400) { + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/avatars/image'; + + let payload = {}; + + if(url) { + payload['url'] = url; + } + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get QR Code + * + * Converts a given plain text to a QR code image. You can use the query + * parameters to change the size and style of the resulting image. + * + * @param {string} text + * @param {number} size + * @param {number} margin + * @param {number} download + * @throws {Error} + * @return {Promise} + */ + getQR: function(text, size = 400, margin = 1, download = 0) { + if(text === undefined) { + throw new Error('Missing required parameter: "text"'); + } + + let path = '/avatars/qr'; + + let payload = {}; + + if(text) { + payload['text'] = text; + } + + if(size) { + payload['size'] = size; + } + + if(margin) { + payload['margin'] = margin; + } + + if(download) { + payload['download'] = download; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let database = { + + /** + * List Collections + * + * Get a list of all the user collections. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project collections. [Learn more about different API + * modes](/docs/admin). + * + * @param {string} search + * @param {number} limit + * @param {number} offset + * @param {string} orderType + * @throws {Error} + * @return {Promise} + */ + listCollections: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/database'; + + let payload = {}; + + if(search) { + payload['search'] = search; + } + + if(limit) { + payload['limit'] = limit; + } + + if(offset) { + payload['offset'] = offset; + } + + if(orderType) { + payload['orderType'] = orderType; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Collection + * + * Create a new Collection. + * + * @param {string} name + * @param {array} read + * @param {array} write + * @param {array} rules + * @throws {Error} + * @return {Promise} + */ + createCollection: function(name, read, write, rules) { + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + if(rules === undefined) { + throw new Error('Missing required parameter: "rules"'); + } + + let path = '/database'; + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + if(rules) { + payload['rules'] = rules; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Collection + * + * Get collection by its unique ID. This endpoint response returns a JSON + * object with the collection metadata. + * + * @param {string} collectionId + * @throws {Error} + * @return {Promise} + */ + getCollection: function(collectionId) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Collection + * + * Update collection by its unique ID. + * + * @param {string} collectionId + * @param {string} name + * @param {array} read + * @param {array} write + * @param {array} rules + * @throws {Error} + * @return {Promise} + */ + updateCollection: function(collectionId, name, read, write, rules = []) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + if(rules) { + payload['rules'] = rules; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Collection + * + * Delete a collection by its unique ID. Only users with write permissions + * have access to delete this resource. + * + * @param {string} collectionId + * @throws {Error} + * @return {Promise} + */ + deleteCollection: function(collectionId) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Documents + * + * Get a list of all the user documents. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project documents. [Learn more about different API + * modes](/docs/admin). + * + * @param {string} collectionId + * @param {array} filters + * @param {number} offset + * @param {number} limit + * @param {string} orderField + * @param {string} orderType + * @param {string} orderCast + * @param {string} search + * @param {number} first + * @param {number} last + * @throws {Error} + * @return {Promise} + */ + listDocuments: function(collectionId, filters = [], offset = 0, limit = 50, orderField = '$uid', orderType = 'ASC', orderCast = 'string', search = '', first = 0, last = 0) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + if(filters) { + payload['filters'] = filters; + } + + if(offset) { + payload['offset'] = offset; + } + + if(limit) { + payload['limit'] = limit; + } + + if(orderField) { + payload['order-field'] = orderField; + } + + if(orderType) { + payload['order-type'] = orderType; + } + + if(orderCast) { + payload['order-cast'] = orderCast; + } + + if(search) { + payload['search'] = search; + } + + if(first) { + payload['first'] = first; + } + + if(last) { + payload['last'] = last; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Document + * + * Create a new Document. + * + * @param {string} collectionId + * @param {string} data + * @param {array} read + * @param {array} write + * @param {string} parentDocument + * @param {string} parentProperty + * @param {string} parentPropertyType + * @throws {Error} + * @return {Promise} + */ + createDocument: function(collectionId, data, read, write, parentDocument = '', parentProperty = '', parentPropertyType = 'assign') { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(data === undefined) { + throw new Error('Missing required parameter: "data"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + if(data) { + payload['data'] = data; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + if(parentDocument) { + payload['parentDocument'] = parentDocument; + } + + if(parentProperty) { + payload['parentProperty'] = parentProperty; + } + + if(parentPropertyType) { + payload['parentPropertyType'] = parentPropertyType; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Document + * + * Get document by its unique ID. This endpoint response returns a JSON object + * with the document data. + * + * @param {string} collectionId + * @param {string} documentId + * @throws {Error} + * @return {Promise} + */ + getDocument: function(collectionId, documentId) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(documentId === undefined) { + throw new Error('Missing required parameter: "documentId"'); + } + + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Document + * + * + * @param {string} collectionId + * @param {string} documentId + * @param {string} data + * @param {array} read + * @param {array} write + * @throws {Error} + * @return {Promise} + */ + updateDocument: function(collectionId, documentId, data, read, write) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(documentId === undefined) { + throw new Error('Missing required parameter: "documentId"'); + } + + if(data === undefined) { + throw new Error('Missing required parameter: "data"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + let payload = {}; + + if(data) { + payload['data'] = data; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Document + * + * Delete document by its unique ID. This endpoint deletes only the parent + * documents, his attributes and relations to other documents. Child documents + * **will not** be deleted. + * + * @param {string} collectionId + * @param {string} documentId + * @throws {Error} + * @return {Promise} + */ + deleteDocument: function(collectionId, documentId) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(documentId === undefined) { + throw new Error('Missing required parameter: "documentId"'); + } + + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let locale = { + + /** + * Get User Locale + * + * Get the current user location based on IP. Returns an object with user + * country code, country name, continent name, continent code, ip address and + * suggested currency. You can use the locale header to get the data in a + * supported language. + * + * ([IP Geolocation by DB-IP](https://db-ip.com)) + * + * @throws {Error} + * @return {Promise} + */ + getLocale: function() { + let path = '/locale'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Countries + * + * List of all continents. You can use the locale header to get the data in a + * supported language. + * + * @throws {Error} + * @return {Promise} + */ + getContinents: function() { + let path = '/locale/continents'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Countries + * + * List of all countries. You can use the locale header to get the data in a + * supported language. + * + * @throws {Error} + * @return {Promise} + */ + getCountries: function() { + let path = '/locale/countries'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List EU Countries + * + * List of all countries that are currently members of the EU. You can use the + * locale header to get the data in a supported language. + * + * @throws {Error} + * @return {Promise} + */ + getCountriesEU: function() { + let path = '/locale/countries/eu'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Countries Phone Codes + * + * List of all countries phone codes. You can use the locale header to get the + * data in a supported language. + * + * @throws {Error} + * @return {Promise} + */ + getCountriesPhones: function() { + let path = '/locale/countries/phones'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Currencies + * + * List of all currencies, including currency symol, name, plural, and decimal + * digits for all major and minor currencies. You can use the locale header to + * get the data in a supported language. + * + * @throws {Error} + * @return {Promise} + */ + getCurrencies: function() { + let path = '/locale/currencies'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let projects = { + + /** + * List Projects + * + * + * @throws {Error} + * @return {Promise} + */ + listProjects: function() { + let path = '/projects'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Project + * + * + * @param {string} name + * @param {string} teamId + * @param {string} description + * @param {string} logo + * @param {string} url + * @param {string} legalName + * @param {string} legalCountry + * @param {string} legalState + * @param {string} legalCity + * @param {string} legalAddress + * @param {string} legalTaxId + * @throws {Error} + * @return {Promise} + */ + createProject: function(name, teamId, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + let path = '/projects'; + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(teamId) { + payload['teamId'] = teamId; + } + + if(description) { + payload['description'] = description; + } + + if(logo) { + payload['logo'] = logo; + } + + if(url) { + payload['url'] = url; + } + + if(legalName) { + payload['legalName'] = legalName; + } + + if(legalCountry) { + payload['legalCountry'] = legalCountry; + } + + if(legalState) { + payload['legalState'] = legalState; + } + + if(legalCity) { + payload['legalCity'] = legalCity; + } + + if(legalAddress) { + payload['legalAddress'] = legalAddress; + } + + if(legalTaxId) { + payload['legalTaxId'] = legalTaxId; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Project + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + getProject: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Project + * + * + * @param {string} projectId + * @param {string} name + * @param {string} description + * @param {string} logo + * @param {string} url + * @param {string} legalName + * @param {string} legalCountry + * @param {string} legalState + * @param {string} legalCity + * @param {string} legalAddress + * @param {string} legalTaxId + * @throws {Error} + * @return {Promise} + */ + updateProject: function(projectId, name, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(description) { + payload['description'] = description; + } + + if(logo) { + payload['logo'] = logo; + } + + if(url) { + payload['url'] = url; + } + + if(legalName) { + payload['legalName'] = legalName; + } + + if(legalCountry) { + payload['legalCountry'] = legalCountry; + } + + if(legalState) { + payload['legalState'] = legalState; + } + + if(legalCity) { + payload['legalCity'] = legalCity; + } + + if(legalAddress) { + payload['legalAddress'] = legalAddress; + } + + if(legalTaxId) { + payload['legalTaxId'] = legalTaxId; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Project + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + deleteProject: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Keys + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + listKeys: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Key + * + * + * @param {string} projectId + * @param {string} name + * @param {array} scopes + * @throws {Error} + * @return {Promise} + */ + createKey: function(projectId, name, scopes) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(scopes === undefined) { + throw new Error('Missing required parameter: "scopes"'); + } + + let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(scopes) { + payload['scopes'] = scopes; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Key + * + * + * @param {string} projectId + * @param {string} keyId + * @throws {Error} + * @return {Promise} + */ + getKey: function(projectId, keyId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(keyId === undefined) { + throw new Error('Missing required parameter: "keyId"'); + } + + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Key + * + * + * @param {string} projectId + * @param {string} keyId + * @param {string} name + * @param {array} scopes + * @throws {Error} + * @return {Promise} + */ + updateKey: function(projectId, keyId, name, scopes) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(keyId === undefined) { + throw new Error('Missing required parameter: "keyId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(scopes === undefined) { + throw new Error('Missing required parameter: "scopes"'); + } + + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(scopes) { + payload['scopes'] = scopes; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Key + * + * + * @param {string} projectId + * @param {string} keyId + * @throws {Error} + * @return {Promise} + */ + deleteKey: function(projectId, keyId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(keyId === undefined) { + throw new Error('Missing required parameter: "keyId"'); + } + + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Project OAuth + * + * + * @param {string} projectId + * @param {string} provider + * @param {string} appId + * @param {string} secret + * @throws {Error} + * @return {Promise} + */ + updateProjectOAuth: function(projectId, provider, appId = '', secret = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(provider === undefined) { + throw new Error('Missing required parameter: "provider"'); + } + + let path = '/projects/{projectId}/oauth'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(provider) { + payload['provider'] = provider; + } + + if(appId) { + payload['appId'] = appId; + } + + if(secret) { + payload['secret'] = secret; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Platforms + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + listPlatforms: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Platform + * + * + * @param {string} projectId + * @param {string} type + * @param {string} name + * @param {string} key + * @param {string} store + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + createPlatform: function(projectId, type, name, key = '', store = '', url = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(type === undefined) { + throw new Error('Missing required parameter: "type"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(type) { + payload['type'] = type; + } + + if(name) { + payload['name'] = name; + } + + if(key) { + payload['key'] = key; + } + + if(store) { + payload['store'] = store; + } + + if(url) { + payload['url'] = url; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Platform + * + * + * @param {string} projectId + * @param {string} platformId + * @throws {Error} + * @return {Promise} + */ + getPlatform: function(projectId, platformId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(platformId === undefined) { + throw new Error('Missing required parameter: "platformId"'); + } + + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Platform + * + * + * @param {string} projectId + * @param {string} platformId + * @param {string} name + * @param {string} key + * @param {string} store + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + updatePlatform: function(projectId, platformId, name, key = '', store = '', url = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(platformId === undefined) { + throw new Error('Missing required parameter: "platformId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(key) { + payload['key'] = key; + } + + if(store) { + payload['store'] = store; + } + + if(url) { + payload['url'] = url; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Platform + * + * + * @param {string} projectId + * @param {string} platformId + * @throws {Error} + * @return {Promise} + */ + deletePlatform: function(projectId, platformId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(platformId === undefined) { + throw new Error('Missing required parameter: "platformId"'); + } + + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Tasks + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + listTasks: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Task + * + * + * @param {string} projectId + * @param {string} name + * @param {string} status + * @param {string} schedule + * @param {number} security + * @param {string} httpMethod + * @param {string} httpUrl + * @param {array} httpHeaders + * @param {string} httpUser + * @param {string} httpPass + * @throws {Error} + * @return {Promise} + */ + createTask: function(projectId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(status === undefined) { + throw new Error('Missing required parameter: "status"'); + } + + if(schedule === undefined) { + throw new Error('Missing required parameter: "schedule"'); + } + + if(security === undefined) { + throw new Error('Missing required parameter: "security"'); + } + + if(httpMethod === undefined) { + throw new Error('Missing required parameter: "httpMethod"'); + } + + if(httpUrl === undefined) { + throw new Error('Missing required parameter: "httpUrl"'); + } + + let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(status) { + payload['status'] = status; + } + + if(schedule) { + payload['schedule'] = schedule; + } + + if(security) { + payload['security'] = security; + } + + if(httpMethod) { + payload['httpMethod'] = httpMethod; + } + + if(httpUrl) { + payload['httpUrl'] = httpUrl; + } + + if(httpHeaders) { + payload['httpHeaders'] = httpHeaders; + } + + if(httpUser) { + payload['httpUser'] = httpUser; + } + + if(httpPass) { + payload['httpPass'] = httpPass; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Task + * + * + * @param {string} projectId + * @param {string} taskId + * @throws {Error} + * @return {Promise} + */ + getTask: function(projectId, taskId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(taskId === undefined) { + throw new Error('Missing required parameter: "taskId"'); + } + + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Task + * + * + * @param {string} projectId + * @param {string} taskId + * @param {string} name + * @param {string} status + * @param {string} schedule + * @param {number} security + * @param {string} httpMethod + * @param {string} httpUrl + * @param {array} httpHeaders + * @param {string} httpUser + * @param {string} httpPass + * @throws {Error} + * @return {Promise} + */ + updateTask: function(projectId, taskId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(taskId === undefined) { + throw new Error('Missing required parameter: "taskId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(status === undefined) { + throw new Error('Missing required parameter: "status"'); + } + + if(schedule === undefined) { + throw new Error('Missing required parameter: "schedule"'); + } + + if(security === undefined) { + throw new Error('Missing required parameter: "security"'); + } + + if(httpMethod === undefined) { + throw new Error('Missing required parameter: "httpMethod"'); + } + + if(httpUrl === undefined) { + throw new Error('Missing required parameter: "httpUrl"'); + } + + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(status) { + payload['status'] = status; + } + + if(schedule) { + payload['schedule'] = schedule; + } + + if(security) { + payload['security'] = security; + } + + if(httpMethod) { + payload['httpMethod'] = httpMethod; + } + + if(httpUrl) { + payload['httpUrl'] = httpUrl; + } + + if(httpHeaders) { + payload['httpHeaders'] = httpHeaders; + } + + if(httpUser) { + payload['httpUser'] = httpUser; + } + + if(httpPass) { + payload['httpPass'] = httpPass; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Task + * + * + * @param {string} projectId + * @param {string} taskId + * @throws {Error} + * @return {Promise} + */ + deleteTask: function(projectId, taskId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(taskId === undefined) { + throw new Error('Missing required parameter: "taskId"'); + } + + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Project + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + getProjectUsage: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/usage'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Webhooks + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + listWebhooks: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Webhook + * + * + * @param {string} projectId + * @param {string} name + * @param {array} events + * @param {string} url + * @param {number} security + * @param {string} httpUser + * @param {string} httpPass + * @throws {Error} + * @return {Promise} + */ + createWebhook: function(projectId, name, events, url, security, httpUser = '', httpPass = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(events === undefined) { + throw new Error('Missing required parameter: "events"'); + } + + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + if(security === undefined) { + throw new Error('Missing required parameter: "security"'); + } + + let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(events) { + payload['events'] = events; + } + + if(url) { + payload['url'] = url; + } + + if(security) { + payload['security'] = security; + } + + if(httpUser) { + payload['httpUser'] = httpUser; + } + + if(httpPass) { + payload['httpPass'] = httpPass; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Webhook + * + * + * @param {string} projectId + * @param {string} webhookId + * @throws {Error} + * @return {Promise} + */ + getWebhook: function(projectId, webhookId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(webhookId === undefined) { + throw new Error('Missing required parameter: "webhookId"'); + } + + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Webhook + * + * + * @param {string} projectId + * @param {string} webhookId + * @param {string} name + * @param {array} events + * @param {string} url + * @param {number} security + * @param {string} httpUser + * @param {string} httpPass + * @throws {Error} + * @return {Promise} + */ + updateWebhook: function(projectId, webhookId, name, events, url, security, httpUser = '', httpPass = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(webhookId === undefined) { + throw new Error('Missing required parameter: "webhookId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(events === undefined) { + throw new Error('Missing required parameter: "events"'); + } + + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + if(security === undefined) { + throw new Error('Missing required parameter: "security"'); + } + + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(events) { + payload['events'] = events; + } + + if(url) { + payload['url'] = url; + } + + if(security) { + payload['security'] = security; + } + + if(httpUser) { + payload['httpUser'] = httpUser; + } + + if(httpPass) { + payload['httpPass'] = httpPass; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Webhook + * + * + * @param {string} projectId + * @param {string} webhookId + * @throws {Error} + * @return {Promise} + */ + deleteWebhook: function(projectId, webhookId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(webhookId === undefined) { + throw new Error('Missing required parameter: "webhookId"'); + } + + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let storage = { + + /** + * List Files + * + * Get a list of all the user files. You can use the query params to filter + * your results. On admin mode, this endpoint will return a list of all of the + * project files. [Learn more about different API modes](/docs/admin). + * + * @param {string} search + * @param {number} limit + * @param {number} offset + * @param {string} orderType + * @throws {Error} + * @return {Promise} + */ + listFiles: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/storage/files'; + + let payload = {}; + + if(search) { + payload['search'] = search; + } + + if(limit) { + payload['limit'] = limit; + } + + if(offset) { + payload['offset'] = offset; + } + + if(orderType) { + payload['orderType'] = orderType; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create File + * + * Create a new file. The user who creates the file will automatically be + * assigned to read and write access unless he has passed custom values for + * read and write arguments. + * + * @param {File} file + * @param {array} read + * @param {array} write + * @throws {Error} + * @return {Promise} + */ + createFile: function(file, read, write) { + if(file === undefined) { + throw new Error('Missing required parameter: "file"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/storage/files'; + + let payload = {}; + + if(file) { + payload['file'] = file; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + return http + .post(path, { + 'content-type': 'multipart/form-data', + }, payload); + }, + + /** + * Get File + * + * Get file by its unique ID. This endpoint response returns a JSON object + * with the file metadata. + * + * @param {string} fileId + * @throws {Error} + * @return {Promise} + */ + getFile: function(fileId) { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update File + * + * Update file by its unique ID. Only users with write permissions have access + * to update this resource. + * + * @param {string} fileId + * @param {array} read + * @param {array} write + * @throws {Error} + * @return {Promise} + */ + updateFile: function(fileId, read, write) { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete File + * + * Delete a file by its unique ID. Only users with write permissions have + * access to delete this resource. + * + * @param {string} fileId + * @throws {Error} + * @return {Promise} + */ + deleteFile: function(fileId) { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get File for Download + * + * Get file content by its unique ID. The endpoint response return with a + * 'Content-Disposition: attachment' header that tells the browser to start + * downloading the file to user downloads directory. + * + * @param {string} fileId + * @throws {Error} + * @return {Promise} + */ + getFileDownload: function(fileId) { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}/download'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get File Preview + * + * Get a file preview image. Currently, this method supports preview for image + * files (jpg, png, and gif), other supported formats, like pdf, docs, slides, + * and spreadsheets, will return the file icon image. You can also pass query + * string arguments for cutting and resizing your preview image. + * + * @param {string} fileId + * @param {number} width + * @param {number} height + * @param {number} quality + * @param {string} background + * @param {string} output + * @throws {Error} + * @return {Promise} + */ + getFilePreview: function(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + if(quality) { + payload['quality'] = quality; + } + + if(background) { + payload['background'] = background; + } + + if(output) { + payload['output'] = output; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get File for View + * + * Get file content by its unique ID. This endpoint is similar to the download + * method but returns with no 'Content-Disposition: attachment' header. + * + * @param {string} fileId + * @param {string} as + * @throws {Error} + * @return {Promise} + */ + getFileView: function(fileId, as = '') { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}/view'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + if(as) { + payload['as'] = as; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let teams = { + + /** + * List Teams + * + * Get a list of all the current user teams. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project teams. [Learn more about different API modes](/docs/admin). + * + * @param {string} search + * @param {number} limit + * @param {number} offset + * @param {string} orderType + * @throws {Error} + * @return {Promise} + */ + listTeams: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/teams'; + + let payload = {}; + + if(search) { + payload['search'] = search; + } + + if(limit) { + payload['limit'] = limit; + } + + if(offset) { + payload['offset'] = offset; + } + + if(orderType) { + payload['orderType'] = orderType; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Team + * + * Create a new team. The user who creates the team will automatically be + * assigned as the owner of the team. The team owner can invite new members, + * who will be able add new owners and update or delete the team from your + * project. + * + * @param {string} name + * @param {array} roles + * @throws {Error} + * @return {Promise} + */ + createTeam: function(name, roles = ["owner"]) { + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/teams'; + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(roles) { + payload['roles'] = roles; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Team + * + * Get team by its unique ID. All team members have read access for this + * resource. + * + * @param {string} teamId + * @throws {Error} + * @return {Promise} + */ + getTeam: function(teamId) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Team + * + * Update team by its unique ID. Only team owners have write access for this + * resource. + * + * @param {string} teamId + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + updateTeam: function(teamId, name) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Team + * + * Delete team by its unique ID. Only team owners have write access for this + * resource. + * + * @param {string} teamId + * @throws {Error} + * @return {Promise} + */ + deleteTeam: function(teamId) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Team Memberships + * + * Get team members by the team unique ID. All team members have read access + * for this list of resources. + * + * @param {string} teamId + * @throws {Error} + * @return {Promise} + */ + getTeamMemberships: function(teamId) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Team Membership + * + * Use this endpoint to invite a new member to your team. An email with a link + * to join the team will be sent to the new member email address. If member + * doesn't exists in the project it will be automatically created. + * + * Use the 'url' parameter to redirect the user from the invitation email back + * to your app. When the user is redirected, use the [Update Team Membership + * Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join + * the user to the team. + * + * Please note that in order to avoid a [Redirect + * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URL's are the once from domains you have set when + * added your platforms in the console interface. + * + * @param {string} teamId + * @param {string} email + * @param {array} roles + * @param {string} url + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + createTeamMembership: function(teamId, email, roles, url, name = '') { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(roles === undefined) { + throw new Error('Missing required parameter: "roles"'); + } + + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(name) { + payload['name'] = name; + } + + if(roles) { + payload['roles'] = roles; + } + + if(url) { + payload['url'] = url; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Team Membership + * + * This endpoint allows a user to leave a team or for a team owner to delete + * the membership of any other team member. You can also use this endpoint to + * delete a user membership even if he didn't accept it. + * + * @param {string} teamId + * @param {string} inviteId + * @throws {Error} + * @return {Promise} + */ + deleteTeamMembership: function(teamId, inviteId) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + if(inviteId === undefined) { + throw new Error('Missing required parameter: "inviteId"'); + } + + let path = '/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Team Membership Status + * + * Use this endpoint to let user accept an invitation to join a team after he + * is being redirect back to your app from the invitation email. Use the + * success and failure URL's to redirect users back to your application after + * the request completes. + * + * Please note that in order to avoid a [Redirect + * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URL's are the once from domains you have set when + * added your platforms in the console interface. + * + * When not using the success or failure redirect arguments this endpoint will + * result with a 200 status code on success and with 401 status error on + * failure. This behavior was applied to help the web clients deal with + * browsers who don't allow to set 3rd party HTTP cookies needed for saving + * the account session token. + * + * @param {string} teamId + * @param {string} inviteId + * @param {string} userId + * @param {string} secret + * @throws {Error} + * @return {null} + */ + updateTeamMembershipStatus: function(teamId, inviteId, userId, secret) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + if(inviteId === undefined) { + throw new Error('Missing required parameter: "inviteId"'); + } + + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(secret === undefined) { + throw new Error('Missing required parameter: "secret"'); + } + + let path = '/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); + + let payload = {}; + + if(userId) { + payload['userId'] = userId; + } + + if(secret) { + payload['secret'] = secret; + } + + payload['project'] = config.project; + + return iframe('patch', path, payload); + } + }; + + let users = { + + /** + * List Users + * + * Get a list of all the project users. You can use the query params to filter + * your results. + * + * @param {string} search + * @param {number} limit + * @param {number} offset + * @param {string} orderType + * @throws {Error} + * @return {Promise} + */ + listUsers: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/users'; + + let payload = {}; + + if(search) { + payload['search'] = search; + } + + if(limit) { + payload['limit'] = limit; + } + + if(offset) { + payload['offset'] = offset; + } + + if(orderType) { + payload['orderType'] = orderType; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create User + * + * Create a new user. + * + * @param {string} email + * @param {string} password + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + createUser: function(email, password, name = '') { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + let path = '/users'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(password) { + payload['password'] = password; + } + + if(name) { + payload['name'] = name; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get User + * + * Get user by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + getUser: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get User Logs + * + * Get user activity logs list by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + getUserLogs: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}/logs'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get User Preferences + * + * Get user preferences by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + getUserPrefs: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update User Preferences + * + * Update user preferences by its unique ID. You can pass only the specific + * settings you wish to update. + * + * @param {string} userId + * @param {string} prefs + * @throws {Error} + * @return {Promise} + */ + updateUserPrefs: function(userId, prefs) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(prefs === undefined) { + throw new Error('Missing required parameter: "prefs"'); + } + + let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + if(prefs) { + payload['prefs'] = prefs; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get User Sessions + * + * Get user sessions list by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + getUserSessions: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete User Sessions + * + * Delete all user sessions by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + deleteUserSessions: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete User Session + * + * Delete user sessions by its unique ID. + * + * @param {string} userId + * @param {string} sessionId + * @throws {Error} + * @return {Promise} + */ + deleteUserSession: function(userId, sessionId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(sessionId === undefined) { + throw new Error('Missing required parameter: "sessionId"'); + } + + let path = '/users/{userId}/sessions/:session'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + if(sessionId) { + payload['sessionId'] = sessionId; + } + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update User Status + * + * Update user status by its unique ID. + * + * @param {string} userId + * @param {string} status + * @throws {Error} + * @return {Promise} + */ + updateUserStatus: function(userId, status) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(status === undefined) { + throw new Error('Missing required parameter: "status"'); + } + + let path = '/users/{userId}/status'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + if(status) { + payload['status'] = status; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + return { + setEndpoint: setEndpoint, + setProject: setProject, + setKey: setKey, + setLocale: setLocale, + setMode: setMode, + account: account, + avatars: avatars, + database: database, + locale: locale, + projects: projects, + storage: storage, + teams: teams, + users: users + }; + }; + + if(typeof module !== "undefined") { + module.exports = window.Appwrite; + } + +})((typeof window !== "undefined") ? window : {}); \ No newline at end of file diff --git a/app/sdks/javascript/src/sdk.min.js b/app/sdks/javascript/src/sdk.min.js new file mode 100644 index 0000000000..493765dd7c --- /dev/null +++ b/app/sdks/javascript/src/sdk.min.js @@ -0,0 +1,351 @@ +(function(window){'use strict';window.Appwrite=function(){let config={endpoint:'https://appwrite.io/v1',project:'',key:'',locale:'',mode:'',};let setEndpoint=function(endpoint){config.endpoint=endpoint;return this};let setProject=function(value){http.addGlobalHeader('X-Appwrite-Project',value);config.project=value;return this};let setKey=function(value){http.addGlobalHeader('X-Appwrite-Key',value);config.key=value;return this};let setLocale=function(value){http.addGlobalHeader('X-Appwrite-Locale',value);config.locale=value;return this};let setMode=function(value){http.addGlobalHeader('X-Appwrite-Mode',value);config.mode=value;return this};let http=function(document){let globalParams=[],globalHeaders=[];let addParam=function(url,param,value){let a=document.createElement('a'),regex=/(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g;let match,str=[];a.href=url;param=encodeURIComponent(param);while(match=regex.exec(a.search))if(param!==match[1])str.push(match[1]+(match[2]?"="+match[2]:""));str.push(param+(value?"="+encodeURIComponent(value):""));a.search=str.join("&");return a.href};let buildQuery=function(params){let str=[];for(let p in params){if(Array.isArray(params[p])){for(let index=0;index=request.status){let data=request.response;let contentType=this.getResponseHeader('content-type')||'';contentType=contentType.substring(0,contentType.indexOf(';'));switch(contentType){case 'application/json':data=JSON.parse(data);break} +resolve(data)}else{reject(new Error(request.statusText))}};if(progress){request.addEventListener('progress',progress);request.upload.addEventListener('progress',progress,!1)} +request.onerror=function(){reject(new Error("Network Error"))};request.send(params)})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{})},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress)},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress)},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress)},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress)},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let iframe=function(method,url,params){let form=document.createElement('form');form.setAttribute('method',method);form.setAttribute('action',config.endpoint+url);for(let key in params){if(params.hasOwnProperty(key)){let hiddenField=document.createElement("input");hiddenField.setAttribute("type","hidden");hiddenField.setAttribute("name",key);hiddenField.setAttribute("value",params[key]);form.appendChild(hiddenField)}} +document.body.appendChild(form);return form.submit()};let account={getAccount:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload)},createAccount:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} +if(password===undefined){throw new Error('Missing required parameter: "password"')} +let path='/account';let payload={};if(email){payload.email=email} +if(password){payload.password=password} +if(name){payload.name=name} +return http.post(path,{'content-type':'application/json',},payload)},delete:function(){let path='/account';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateEmail:function(email,password){if(email===undefined){throw new Error('Missing required parameter: "email"')} +if(password===undefined){throw new Error('Missing required parameter: "password"')} +let path='/account/email';let payload={};if(email){payload.email=email} +if(password){payload.password=password} +return http.patch(path,{'content-type':'application/json',},payload)},getAccountLogs:function(){let path='/account/logs';let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateAccountName:function(name){if(name===undefined){throw new Error('Missing required parameter: "name"')} +let path='/account/name';let payload={};if(name){payload.name=name} +return http.patch(path,{'content-type':'application/json',},payload)},updateAccountPassword:function(password,oldPassword){if(password===undefined){throw new Error('Missing required parameter: "password"')} +if(oldPassword===undefined){throw new Error('Missing required parameter: "oldPassword"')} +let path='/account/password';let payload={};if(password){payload.password=password} +if(oldPassword){payload['old-password']=oldPassword} +return http.patch(path,{'content-type':'application/json',},payload)},getAccountPrefs:function(){let path='/account/prefs';let payload={};return http.get(path,{'content-type':'application/json',},payload)},updatePrefs:function(prefs){if(prefs===undefined){throw new Error('Missing required parameter: "prefs"')} +let path='/account/prefs';let payload={};if(prefs){payload.prefs=prefs} +return http.patch(path,{'content-type':'application/json',},payload)},createAccountRecovery:function(email,url){if(email===undefined){throw new Error('Missing required parameter: "email"')} +if(url===undefined){throw new Error('Missing required parameter: "url"')} +let path='/account/recovery';let payload={};if(email){payload.email=email} +if(url){payload.url=url} +return http.post(path,{'content-type':'application/json',},payload)},updateAccountRecovery:function(userId,secret,passwordA,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +if(secret===undefined){throw new Error('Missing required parameter: "secret"')} +if(passwordA===undefined){throw new Error('Missing required parameter: "passwordA"')} +if(passwordB===undefined){throw new Error('Missing required parameter: "passwordB"')} +let path='/account/recovery';let payload={};if(userId){payload.userId=userId} +if(secret){payload.secret=secret} +if(passwordA){payload['password-a']=passwordA} +if(passwordB){payload['password-b']=passwordB} +return http.put(path,{'content-type':'application/json',},payload)},getAccountSessions:function(){let path='/account/sessions';let payload={};return http.get(path,{'content-type':'application/json',},payload)},createAccountSession:function(email,password){if(email===undefined){throw new Error('Missing required parameter: "email"')} +if(password===undefined){throw new Error('Missing required parameter: "password"')} +let path='/account/sessions';let payload={};if(email){payload.email=email} +if(password){payload.password=password} +return http.post(path,{'content-type':'application/json',},payload)},deleteAccountSessions:function(){let path='/account/sessions';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},deleteAccountCurrentSession:function(){let path='/account/sessions/current';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createAccountSessionOAuth:function(provider,success,failure){if(provider===undefined){throw new Error('Missing required parameter: "provider"')} +if(success===undefined){throw new Error('Missing required parameter: "success"')} +if(failure===undefined){throw new Error('Missing required parameter: "failure"')} +let path='/account/sessions/oauth/{provider}'.replace(new RegExp('{provider}','g'),provider);let payload={};if(success){payload.success=success} +if(failure){payload.failure=failure} +return http.get(path,{'content-type':'application/json',},payload)},deleteAccountSession:function(id){if(id===undefined){throw new Error('Missing required parameter: "id"')} +let path='/account/sessions/{id}'.replace(new RegExp('{id}','g'),id);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createAccountVerification:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"')} +let path='/account/verification';let payload={};if(url){payload.url=url} +return http.post(path,{'content-type':'application/json',},payload)},updateAccountVerification:function(userId,secret,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +if(secret===undefined){throw new Error('Missing required parameter: "secret"')} +if(passwordB===undefined){throw new Error('Missing required parameter: "passwordB"')} +let path='/account/verification';let payload={};if(userId){payload.userId=userId} +if(secret){payload.secret=secret} +if(passwordB){payload['password-b']=passwordB} +return http.put(path,{'content-type':'application/json',},payload)}};let avatars={getBrowser:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"')} +let path='/avatars/browsers/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload.width=width} +if(height){payload.height=height} +if(quality){payload.quality=quality} +return http.get(path,{'content-type':'application/json',},payload)},getCreditCard:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"')} +let path='/avatars/credit-cards/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload.width=width} +if(height){payload.height=height} +if(quality){payload.quality=quality} +return http.get(path,{'content-type':'application/json',},payload)},getFavicon:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"')} +let path='/avatars/favicon';let payload={};if(url){payload.url=url} +return http.get(path,{'content-type':'application/json',},payload)},getFlag:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"')} +let path='/avatars/flags/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload.width=width} +if(height){payload.height=height} +if(quality){payload.quality=quality} +return http.get(path,{'content-type':'application/json',},payload)},getImage:function(url,width=400,height=400){if(url===undefined){throw new Error('Missing required parameter: "url"')} +let path='/avatars/image';let payload={};if(url){payload.url=url} +if(width){payload.width=width} +if(height){payload.height=height} +return http.get(path,{'content-type':'application/json',},payload)},getQR:function(text,size=400,margin=1,download=0){if(text===undefined){throw new Error('Missing required parameter: "text"')} +let path='/avatars/qr';let payload={};if(text){payload.text=text} +if(size){payload.size=size} +if(margin){payload.margin=margin} +if(download){payload.download=download} +return http.get(path,{'content-type':'application/json',},payload)}};let database={listCollections:function(search='',limit=25,offset=0,orderType='ASC'){let path='/database';let payload={};if(search){payload.search=search} +if(limit){payload.limit=limit} +if(offset){payload.offset=offset} +if(orderType){payload.orderType=orderType} +return http.get(path,{'content-type':'application/json',},payload)},createCollection:function(name,read,write,rules){if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(read===undefined){throw new Error('Missing required parameter: "read"')} +if(write===undefined){throw new Error('Missing required parameter: "write"')} +if(rules===undefined){throw new Error('Missing required parameter: "rules"')} +let path='/database';let payload={};if(name){payload.name=name} +if(read){payload.read=read} +if(write){payload.write=write} +if(rules){payload.rules=rules} +return http.post(path,{'content-type':'application/json',},payload)},getCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateCollection:function(collectionId,name,read,write,rules=[]){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(read===undefined){throw new Error('Missing required parameter: "read"')} +if(write===undefined){throw new Error('Missing required parameter: "write"')} +let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(name){payload.name=name} +if(read){payload.read=read} +if(write){payload.write=write} +if(rules){payload.rules=rules} +return http.put(path,{'content-type':'application/json',},payload)},deleteCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listDocuments:function(collectionId,filters=[],offset=0,limit=50,orderField='$uid',orderType='ASC',orderCast='string',search='',first=0,last=0){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +let path='/database/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(filters){payload.filters=filters} +if(offset){payload.offset=offset} +if(limit){payload.limit=limit} +if(orderField){payload['order-field']=orderField} +if(orderType){payload['order-type']=orderType} +if(orderCast){payload['order-cast']=orderCast} +if(search){payload.search=search} +if(first){payload.first=first} +if(last){payload.last=last} +return http.get(path,{'content-type':'application/json',},payload)},createDocument:function(collectionId,data,read,write,parentDocument='',parentProperty='',parentPropertyType='assign'){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +if(data===undefined){throw new Error('Missing required parameter: "data"')} +if(read===undefined){throw new Error('Missing required parameter: "read"')} +if(write===undefined){throw new Error('Missing required parameter: "write"')} +let path='/database/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(data){payload.data=data} +if(read){payload.read=read} +if(write){payload.write=write} +if(parentDocument){payload.parentDocument=parentDocument} +if(parentProperty){payload.parentProperty=parentProperty} +if(parentPropertyType){payload.parentPropertyType=parentPropertyType} +return http.post(path,{'content-type':'application/json',},payload)},getDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} +let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateDocument:function(collectionId,documentId,data,read,write){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} +if(data===undefined){throw new Error('Missing required parameter: "data"')} +if(read===undefined){throw new Error('Missing required parameter: "read"')} +if(write===undefined){throw new Error('Missing required parameter: "write"')} +let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};if(data){payload.data=data} +if(read){payload.read=read} +if(write){payload.write=write} +return http.patch(path,{'content-type':'application/json',},payload)},deleteDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} +let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let locale={getLocale:function(){let path='/locale';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getContinents:function(){let path='/locale/continents';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountries:function(){let path='/locale/countries';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesEU:function(){let path='/locale/countries/eu';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesPhones:function(){let path='/locale/countries/phones';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCurrencies:function(){let path='/locale/currencies';let payload={};return http.get(path,{'content-type':'application/json',},payload)}};let projects={listProjects:function(){let path='/projects';let payload={};return http.get(path,{'content-type':'application/json',},payload)},createProject:function(name,teamId,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +let path='/projects';let payload={};if(name){payload.name=name} +if(teamId){payload.teamId=teamId} +if(description){payload.description=description} +if(logo){payload.logo=logo} +if(url){payload.url=url} +if(legalName){payload.legalName=legalName} +if(legalCountry){payload.legalCountry=legalCountry} +if(legalState){payload.legalState=legalState} +if(legalCity){payload.legalCity=legalCity} +if(legalAddress){payload.legalAddress=legalAddress} +if(legalTaxId){payload.legalTaxId=legalTaxId} +return http.post(path,{'content-type':'application/json',},payload)},getProject:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateProject:function(projectId,name,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} +if(description){payload.description=description} +if(logo){payload.logo=logo} +if(url){payload.url=url} +if(legalName){payload.legalName=legalName} +if(legalCountry){payload.legalCountry=legalCountry} +if(legalState){payload.legalState=legalState} +if(legalCity){payload.legalCity=legalCity} +if(legalAddress){payload.legalAddress=legalAddress} +if(legalTaxId){payload.legalTaxId=legalTaxId} +return http.patch(path,{'content-type':'application/json',},payload)},deleteProject:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listKeys:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createKey:function(projectId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(scopes===undefined){throw new Error('Missing required parameter: "scopes"')} +let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} +if(scopes){payload.scopes=scopes} +return http.post(path,{'content-type':'application/json',},payload)},getKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} +let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateKey:function(projectId,keyId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(scopes===undefined){throw new Error('Missing required parameter: "scopes"')} +let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};if(name){payload.name=name} +if(scopes){payload.scopes=scopes} +return http.put(path,{'content-type':'application/json',},payload)},deleteKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} +let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateProjectOAuth:function(projectId,provider,appId='',secret=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(provider===undefined){throw new Error('Missing required parameter: "provider"')} +let path='/projects/{projectId}/oauth'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(provider){payload.provider=provider} +if(appId){payload.appId=appId} +if(secret){payload.secret=secret} +return http.patch(path,{'content-type':'application/json',},payload)},listPlatforms:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createPlatform:function(projectId,type,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(type===undefined){throw new Error('Missing required parameter: "type"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(type){payload.type=type} +if(name){payload.name=name} +if(key){payload.key=key} +if(store){payload.store=store} +if(url){payload.url=url} +return http.post(path,{'content-type':'application/json',},payload)},getPlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} +let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updatePlatform:function(projectId,platformId,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};if(name){payload.name=name} +if(key){payload.key=key} +if(store){payload.store=store} +if(url){payload.url=url} +return http.put(path,{'content-type':'application/json',},payload)},deletePlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} +let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listTasks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +let path='/projects/{projectId}/tasks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createTask:function(projectId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(status===undefined){throw new Error('Missing required parameter: "status"')} +if(schedule===undefined){throw new Error('Missing required parameter: "schedule"')} +if(security===undefined){throw new Error('Missing required parameter: "security"')} +if(httpMethod===undefined){throw new Error('Missing required parameter: "httpMethod"')} +if(httpUrl===undefined){throw new Error('Missing required parameter: "httpUrl"')} +let path='/projects/{projectId}/tasks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} +if(status){payload.status=status} +if(schedule){payload.schedule=schedule} +if(security){payload.security=security} +if(httpMethod){payload.httpMethod=httpMethod} +if(httpUrl){payload.httpUrl=httpUrl} +if(httpHeaders){payload.httpHeaders=httpHeaders} +if(httpUser){payload.httpUser=httpUser} +if(httpPass){payload.httpPass=httpPass} +return http.post(path,{'content-type':'application/json',},payload)},getTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} +let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateTask:function(projectId,taskId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(status===undefined){throw new Error('Missing required parameter: "status"')} +if(schedule===undefined){throw new Error('Missing required parameter: "schedule"')} +if(security===undefined){throw new Error('Missing required parameter: "security"')} +if(httpMethod===undefined){throw new Error('Missing required parameter: "httpMethod"')} +if(httpUrl===undefined){throw new Error('Missing required parameter: "httpUrl"')} +let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};if(name){payload.name=name} +if(status){payload.status=status} +if(schedule){payload.schedule=schedule} +if(security){payload.security=security} +if(httpMethod){payload.httpMethod=httpMethod} +if(httpUrl){payload.httpUrl=httpUrl} +if(httpHeaders){payload.httpHeaders=httpHeaders} +if(httpUser){payload.httpUser=httpUser} +if(httpPass){payload.httpPass=httpPass} +return http.put(path,{'content-type':'application/json',},payload)},deleteTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} +let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getProjectUsage:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +let path='/projects/{projectId}/usage'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},listWebhooks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +let path='/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createWebhook:function(projectId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(events===undefined){throw new Error('Missing required parameter: "events"')} +if(url===undefined){throw new Error('Missing required parameter: "url"')} +if(security===undefined){throw new Error('Missing required parameter: "security"')} +let path='/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} +if(events){payload.events=events} +if(url){payload.url=url} +if(security){payload.security=security} +if(httpUser){payload.httpUser=httpUser} +if(httpPass){payload.httpPass=httpPass} +return http.post(path,{'content-type':'application/json',},payload)},getWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} +let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateWebhook:function(projectId,webhookId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +if(events===undefined){throw new Error('Missing required parameter: "events"')} +if(url===undefined){throw new Error('Missing required parameter: "url"')} +if(security===undefined){throw new Error('Missing required parameter: "security"')} +let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};if(name){payload.name=name} +if(events){payload.events=events} +if(url){payload.url=url} +if(security){payload.security=security} +if(httpUser){payload.httpUser=httpUser} +if(httpPass){payload.httpPass=httpPass} +return http.put(path,{'content-type':'application/json',},payload)},deleteWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} +if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} +let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let storage={listFiles:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';let payload={};if(search){payload.search=search} +if(limit){payload.limit=limit} +if(offset){payload.offset=offset} +if(orderType){payload.orderType=orderType} +return http.get(path,{'content-type':'application/json',},payload)},createFile:function(file,read,write){if(file===undefined){throw new Error('Missing required parameter: "file"')} +if(read===undefined){throw new Error('Missing required parameter: "read"')} +if(write===undefined){throw new Error('Missing required parameter: "write"')} +let path='/storage/files';let payload={};if(file){payload.file=file} +if(read){payload.read=read} +if(write){payload.write=write} +return http.post(path,{'content-type':'multipart/form-data',},payload)},getFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateFile:function(fileId,read,write){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +if(read===undefined){throw new Error('Missing required parameter: "read"')} +if(write===undefined){throw new Error('Missing required parameter: "write"')} +let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(read){payload.read=read} +if(write){payload.write=write} +return http.put(path,{'content-type':'application/json',},payload)},deleteFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getFileDownload:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +let path='/storage/files/{fileId}/download'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getFilePreview:function(fileId,width=0,height=0,quality=100,background='',output=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +let path='/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(width){payload.width=width} +if(height){payload.height=height} +if(quality){payload.quality=quality} +if(background){payload.background=background} +if(output){payload.output=output} +return http.get(path,{'content-type':'application/json',},payload)},getFileView:function(fileId,as=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +let path='/storage/files/{fileId}/view'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(as){payload.as=as} +return http.get(path,{'content-type':'application/json',},payload)}};let teams={listTeams:function(search='',limit=25,offset=0,orderType='ASC'){let path='/teams';let payload={};if(search){payload.search=search} +if(limit){payload.limit=limit} +if(offset){payload.offset=offset} +if(orderType){payload.orderType=orderType} +return http.get(path,{'content-type':'application/json',},payload)},createTeam:function(name,roles=["owner"]){if(name===undefined){throw new Error('Missing required parameter: "name"')} +let path='/teams';let payload={};if(name){payload.name=name} +if(roles){payload.roles=roles} +return http.post(path,{'content-type':'application/json',},payload)},getTeam:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateTeam:function(teamId,name){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +if(name===undefined){throw new Error('Missing required parameter: "name"')} +let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};if(name){payload.name=name} +return http.put(path,{'content-type':'application/json',},payload)},deleteTeam:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getTeamMemberships:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +let path='/teams/{teamId}/memberships'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createTeamMembership:function(teamId,email,roles,url,name=''){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +if(email===undefined){throw new Error('Missing required parameter: "email"')} +if(roles===undefined){throw new Error('Missing required parameter: "roles"')} +if(url===undefined){throw new Error('Missing required parameter: "url"')} +let path='/teams/{teamId}/memberships'.replace(new RegExp('{teamId}','g'),teamId);let payload={};if(email){payload.email=email} +if(name){payload.name=name} +if(roles){payload.roles=roles} +if(url){payload.url=url} +return http.post(path,{'content-type':'application/json',},payload)},deleteTeamMembership:function(teamId,inviteId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"')} +let path='/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateTeamMembershipStatus:function(teamId,inviteId,userId,secret){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"')} +if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +if(secret===undefined){throw new Error('Missing required parameter: "secret"')} +let path='/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};if(userId){payload.userId=userId} +if(secret){payload.secret=secret} +payload.project=config.project;return iframe('patch',path,payload)}};let users={listUsers:function(search='',limit=25,offset=0,orderType='ASC'){let path='/users';let payload={};if(search){payload.search=search} +if(limit){payload.limit=limit} +if(offset){payload.offset=offset} +if(orderType){payload.orderType=orderType} +return http.get(path,{'content-type':'application/json',},payload)},createUser:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} +if(password===undefined){throw new Error('Missing required parameter: "password"')} +let path='/users';let payload={};if(email){payload.email=email} +if(password){payload.password=password} +if(name){payload.name=name} +return http.post(path,{'content-type':'application/json',},payload)},getUser:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +let path='/users/{userId}'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getUserLogs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +let path='/users/{userId}/logs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getUserPrefs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateUserPrefs:function(userId,prefs){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +if(prefs===undefined){throw new Error('Missing required parameter: "prefs"')} +let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};if(prefs){payload.prefs=prefs} +return http.patch(path,{'content-type':'application/json',},payload)},getUserSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},deleteUserSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},deleteUserSession:function(userId,sessionId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +if(sessionId===undefined){throw new Error('Missing required parameter: "sessionId"')} +let path='/users/{userId}/sessions/:session'.replace(new RegExp('{userId}','g'),userId);let payload={};if(sessionId){payload.sessionId=sessionId} +return http.delete(path,{'content-type':'application/json',},payload)},updateUserStatus:function(userId,status){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +if(status===undefined){throw new Error('Missing required parameter: "status"')} +let path='/users/{userId}/status'.replace(new RegExp('{userId}','g'),userId);let payload={};if(status){payload.status=status} +return http.patch(path,{'content-type':'application/json',},payload)}};return{setEndpoint:setEndpoint,setProject:setProject,setKey:setKey,setLocale:setLocale,setMode:setMode,account:account,avatars:avatars,database:database,locale:locale,projects:projects,storage:storage,teams:teams,users:users}};if(typeof module!=="undefined"){module.exports=window.Appwrite}})((typeof window!=="undefined")?window:{}) \ No newline at end of file diff --git a/app/sdks/nodejs/LICENSE b/app/sdks/nodejs/LICENSE new file mode 100644 index 0000000000..fc7c051a91 --- /dev/null +++ b/app/sdks/nodejs/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/sdks/nodejs/README.md b/app/sdks/nodejs/README.md new file mode 100644 index 0000000000..eac061f52e --- /dev/null +++ b/app/sdks/nodejs/README.md @@ -0,0 +1,22 @@ +# Appwrite SDK for NodeJS + +![License](https://img.shields.io/github/license/appwrite/sdk-for-node.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) + +Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) + + + +![Appwrite](https://appwrite.io/images/github.png) + +## Installation + +To install via [NPM](https://www.npmjs.com/): + +```bash +npm install node-appwrite --save +``` + +## License + +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account-recovery.md b/app/sdks/nodejs/docs/examples/account/create-account-recovery.md new file mode 100644 index 0000000000..192870a20f --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/create-account-recovery.md @@ -0,0 +1,17 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client +; + +let promise = account.createAccountRecovery('email@example.com', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account-session-o-auth.md b/app/sdks/nodejs/docs/examples/account/create-account-session-o-auth.md new file mode 100644 index 0000000000..7e401a4161 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/create-account-session-o-auth.md @@ -0,0 +1,17 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client +; + +let promise = account.createAccountSessionOAuth('bitbucket', 'https://example.com', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account-session.md b/app/sdks/nodejs/docs/examples/account/create-account-session.md new file mode 100644 index 0000000000..755f4bd3e5 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/create-account-session.md @@ -0,0 +1,17 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client +; + +let promise = account.createAccountSession('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account-verification.md b/app/sdks/nodejs/docs/examples/account/create-account-verification.md new file mode 100644 index 0000000000..3e2082273f --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/create-account-verification.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.createAccountVerification('https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account.md b/app/sdks/nodejs/docs/examples/account/create-account.md new file mode 100644 index 0000000000..ea36651887 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/create-account.md @@ -0,0 +1,17 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client +; + +let promise = account.createAccount('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/delete-account-current-session.md b/app/sdks/nodejs/docs/examples/account/delete-account-current-session.md new file mode 100644 index 0000000000..1d617e20e6 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/delete-account-current-session.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.deleteAccountCurrentSession(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/delete-account-session.md b/app/sdks/nodejs/docs/examples/account/delete-account-session.md new file mode 100644 index 0000000000..23388767ce --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/delete-account-session.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.deleteAccountSession('[ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/delete-account-sessions.md b/app/sdks/nodejs/docs/examples/account/delete-account-sessions.md new file mode 100644 index 0000000000..5571d7af4e --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/delete-account-sessions.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.deleteAccountSessions(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/delete.md b/app/sdks/nodejs/docs/examples/account/delete.md new file mode 100644 index 0000000000..a2294e7a2b --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/delete.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.delete(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/get-account-logs.md b/app/sdks/nodejs/docs/examples/account/get-account-logs.md new file mode 100644 index 0000000000..7c241510dd --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/get-account-logs.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.getAccountLogs(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/get-account-prefs.md b/app/sdks/nodejs/docs/examples/account/get-account-prefs.md new file mode 100644 index 0000000000..f6c6ce0ab7 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/get-account-prefs.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.getAccountPrefs(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/get-account-sessions.md b/app/sdks/nodejs/docs/examples/account/get-account-sessions.md new file mode 100644 index 0000000000..60adb274c7 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/get-account-sessions.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.getAccountSessions(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/get-account.md b/app/sdks/nodejs/docs/examples/account/get-account.md new file mode 100644 index 0000000000..5b27263b55 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/get-account.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.getAccount(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-account-name.md b/app/sdks/nodejs/docs/examples/account/update-account-name.md new file mode 100644 index 0000000000..8c819ac65b --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/update-account-name.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.updateAccountName('[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-account-password.md b/app/sdks/nodejs/docs/examples/account/update-account-password.md new file mode 100644 index 0000000000..d58273c139 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/update-account-password.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.updateAccountPassword('password', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-account-recovery.md b/app/sdks/nodejs/docs/examples/account/update-account-recovery.md new file mode 100644 index 0000000000..a161f077f6 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/update-account-recovery.md @@ -0,0 +1,17 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client +; + +let promise = account.updateAccountRecovery('[USER_ID]', '[SECRET]', 'password', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-account-verification.md b/app/sdks/nodejs/docs/examples/account/update-account-verification.md new file mode 100644 index 0000000000..d935d0d635 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/update-account-verification.md @@ -0,0 +1,17 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client +; + +let promise = account.updateAccountVerification('[USER_ID]', '[SECRET]', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-email.md b/app/sdks/nodejs/docs/examples/account/update-email.md new file mode 100644 index 0000000000..e1937eb31a --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/update-email.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.updateEmail('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-prefs.md b/app/sdks/nodejs/docs/examples/account/update-prefs.md new file mode 100644 index 0000000000..c52e3a560a --- /dev/null +++ b/app/sdks/nodejs/docs/examples/account/update-prefs.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let account = new sdk.Account(client); + +client + .setProject('') +; + +let promise = account.updatePrefs(''); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/avatars/get-browser.md b/app/sdks/nodejs/docs/examples/avatars/get-browser.md new file mode 100644 index 0000000000..ae650dae9b --- /dev/null +++ b/app/sdks/nodejs/docs/examples/avatars/get-browser.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let avatars = new sdk.Avatars(client); + +client + .setProject('') +; + +let promise = avatars.getBrowser('aa'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/avatars/get-credit-card.md b/app/sdks/nodejs/docs/examples/avatars/get-credit-card.md new file mode 100644 index 0000000000..567ff2c81f --- /dev/null +++ b/app/sdks/nodejs/docs/examples/avatars/get-credit-card.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let avatars = new sdk.Avatars(client); + +client + .setProject('') +; + +let promise = avatars.getCreditCard('amex'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/avatars/get-favicon.md b/app/sdks/nodejs/docs/examples/avatars/get-favicon.md new file mode 100644 index 0000000000..10e05eef00 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/avatars/get-favicon.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let avatars = new sdk.Avatars(client); + +client + .setProject('') +; + +let promise = avatars.getFavicon('https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/avatars/get-flag.md b/app/sdks/nodejs/docs/examples/avatars/get-flag.md new file mode 100644 index 0000000000..4793f320af --- /dev/null +++ b/app/sdks/nodejs/docs/examples/avatars/get-flag.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let avatars = new sdk.Avatars(client); + +client + .setProject('') +; + +let promise = avatars.getFlag('af'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/avatars/get-image.md b/app/sdks/nodejs/docs/examples/avatars/get-image.md new file mode 100644 index 0000000000..5329174988 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/avatars/get-image.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let avatars = new sdk.Avatars(client); + +client + .setProject('') +; + +let promise = avatars.getImage('https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/avatars/get-q-r.md b/app/sdks/nodejs/docs/examples/avatars/get-q-r.md new file mode 100644 index 0000000000..adb6ea9ca1 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/avatars/get-q-r.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let avatars = new sdk.Avatars(client); + +client + .setProject('') +; + +let promise = avatars.getQR('[TEXT]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/create-collection.md b/app/sdks/nodejs/docs/examples/database/create-collection.md new file mode 100644 index 0000000000..cdd31c2c40 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/create-collection.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.createCollection('[NAME]', [], [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/create-document.md b/app/sdks/nodejs/docs/examples/database/create-document.md new file mode 100644 index 0000000000..b1d3745d3c --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/create-document.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.createDocument('[COLLECTION_ID]', '{}', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/delete-collection.md b/app/sdks/nodejs/docs/examples/database/delete-collection.md new file mode 100644 index 0000000000..4fe87892ef --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/delete-collection.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.deleteCollection('[COLLECTION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/delete-document.md b/app/sdks/nodejs/docs/examples/database/delete-document.md new file mode 100644 index 0000000000..1dba553a31 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/delete-document.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.deleteDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/get-collection.md b/app/sdks/nodejs/docs/examples/database/get-collection.md new file mode 100644 index 0000000000..a634fcb9e8 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/get-collection.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.getCollection('[COLLECTION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/get-document.md b/app/sdks/nodejs/docs/examples/database/get-document.md new file mode 100644 index 0000000000..034ab82c37 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/get-document.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.getDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/list-collections.md b/app/sdks/nodejs/docs/examples/database/list-collections.md new file mode 100644 index 0000000000..27e960111f --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/list-collections.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.listCollections(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/list-documents.md b/app/sdks/nodejs/docs/examples/database/list-documents.md new file mode 100644 index 0000000000..4dd99052af --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/list-documents.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.listDocuments('[COLLECTION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/update-collection.md b/app/sdks/nodejs/docs/examples/database/update-collection.md new file mode 100644 index 0000000000..37e4ef9fa1 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/update-collection.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.updateCollection('[COLLECTION_ID]', '[NAME]', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/database/update-document.md b/app/sdks/nodejs/docs/examples/database/update-document.md new file mode 100644 index 0000000000..1be1d9672a --- /dev/null +++ b/app/sdks/nodejs/docs/examples/database/update-document.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let database = new sdk.Database(client); + +client + .setProject('') +; + +let promise = database.updateDocument('[COLLECTION_ID]', '[DOCUMENT_ID]', '{}', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/locale/get-continents.md b/app/sdks/nodejs/docs/examples/locale/get-continents.md new file mode 100644 index 0000000000..84ea74f1b5 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/locale/get-continents.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let locale = new sdk.Locale(client); + +client + .setProject('') +; + +let promise = locale.getContinents(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/locale/get-countries-e-u.md b/app/sdks/nodejs/docs/examples/locale/get-countries-e-u.md new file mode 100644 index 0000000000..a022ddee34 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/locale/get-countries-e-u.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let locale = new sdk.Locale(client); + +client + .setProject('') +; + +let promise = locale.getCountriesEU(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/locale/get-countries-phones.md b/app/sdks/nodejs/docs/examples/locale/get-countries-phones.md new file mode 100644 index 0000000000..b7d870f7df --- /dev/null +++ b/app/sdks/nodejs/docs/examples/locale/get-countries-phones.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let locale = new sdk.Locale(client); + +client + .setProject('') +; + +let promise = locale.getCountriesPhones(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/locale/get-countries.md b/app/sdks/nodejs/docs/examples/locale/get-countries.md new file mode 100644 index 0000000000..610d679dfb --- /dev/null +++ b/app/sdks/nodejs/docs/examples/locale/get-countries.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let locale = new sdk.Locale(client); + +client + .setProject('') +; + +let promise = locale.getCountries(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/locale/get-currencies.md b/app/sdks/nodejs/docs/examples/locale/get-currencies.md new file mode 100644 index 0000000000..0bfb6b1951 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/locale/get-currencies.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let locale = new sdk.Locale(client); + +client + .setProject('') +; + +let promise = locale.getCurrencies(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/locale/get-locale.md b/app/sdks/nodejs/docs/examples/locale/get-locale.md new file mode 100644 index 0000000000..f07554e149 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/locale/get-locale.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let locale = new sdk.Locale(client); + +client + .setProject('') +; + +let promise = locale.getLocale(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-key.md b/app/sdks/nodejs/docs/examples/projects/create-key.md new file mode 100644 index 0000000000..2328b381a4 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/create-key.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.createKey('[PROJECT_ID]', '[NAME]', []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-platform.md b/app/sdks/nodejs/docs/examples/projects/create-platform.md new file mode 100644 index 0000000000..7ca5744429 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/create-platform.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.createPlatform('[PROJECT_ID]', 'web', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-project.md b/app/sdks/nodejs/docs/examples/projects/create-project.md new file mode 100644 index 0000000000..787cba3cdb --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/create-project.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.createProject('[NAME]', '[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-task.md b/app/sdks/nodejs/docs/examples/projects/create-task.md new file mode 100644 index 0000000000..6aeab88830 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/create-task.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-webhook.md b/app/sdks/nodejs/docs/examples/projects/create-webhook.md new file mode 100644 index 0000000000..3998c671e2 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/create-webhook.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-key.md b/app/sdks/nodejs/docs/examples/projects/delete-key.md new file mode 100644 index 0000000000..7aaa57ea15 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/delete-key.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.deleteKey('[PROJECT_ID]', '[KEY_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-platform.md b/app/sdks/nodejs/docs/examples/projects/delete-platform.md new file mode 100644 index 0000000000..96a539a160 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/delete-platform.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.deletePlatform('[PROJECT_ID]', '[PLATFORM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-project.md b/app/sdks/nodejs/docs/examples/projects/delete-project.md new file mode 100644 index 0000000000..755733f80b --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/delete-project.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.deleteProject('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-task.md b/app/sdks/nodejs/docs/examples/projects/delete-task.md new file mode 100644 index 0000000000..944f31cc1c --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/delete-task.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.deleteTask('[PROJECT_ID]', '[TASK_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-webhook.md b/app/sdks/nodejs/docs/examples/projects/delete-webhook.md new file mode 100644 index 0000000000..faa5b59b6a --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/delete-webhook.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.deleteWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-key.md b/app/sdks/nodejs/docs/examples/projects/get-key.md new file mode 100644 index 0000000000..fa0c34f520 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/get-key.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.getKey('[PROJECT_ID]', '[KEY_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-platform.md b/app/sdks/nodejs/docs/examples/projects/get-platform.md new file mode 100644 index 0000000000..a54b7e6788 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/get-platform.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.getPlatform('[PROJECT_ID]', '[PLATFORM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-project-usage.md b/app/sdks/nodejs/docs/examples/projects/get-project-usage.md new file mode 100644 index 0000000000..b97c7b6366 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/get-project-usage.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.getProjectUsage('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-project.md b/app/sdks/nodejs/docs/examples/projects/get-project.md new file mode 100644 index 0000000000..d548b12ffd --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/get-project.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.getProject('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-task.md b/app/sdks/nodejs/docs/examples/projects/get-task.md new file mode 100644 index 0000000000..f6b6c6b558 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/get-task.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.getTask('[PROJECT_ID]', '[TASK_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-webhook.md b/app/sdks/nodejs/docs/examples/projects/get-webhook.md new file mode 100644 index 0000000000..dbfa0f508f --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/get-webhook.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.getWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-keys.md b/app/sdks/nodejs/docs/examples/projects/list-keys.md new file mode 100644 index 0000000000..c66aee9905 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/list-keys.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.listKeys('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-platforms.md b/app/sdks/nodejs/docs/examples/projects/list-platforms.md new file mode 100644 index 0000000000..f92efcd1ce --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/list-platforms.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.listPlatforms('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-projects.md b/app/sdks/nodejs/docs/examples/projects/list-projects.md new file mode 100644 index 0000000000..a8f40d3bd7 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/list-projects.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.listProjects(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-tasks.md b/app/sdks/nodejs/docs/examples/projects/list-tasks.md new file mode 100644 index 0000000000..fe8176abe9 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/list-tasks.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.listTasks('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-webhooks.md b/app/sdks/nodejs/docs/examples/projects/list-webhooks.md new file mode 100644 index 0000000000..b878f71618 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/list-webhooks.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.listWebhooks('[PROJECT_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-key.md b/app/sdks/nodejs/docs/examples/projects/update-key.md new file mode 100644 index 0000000000..72f13ea361 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/update-key.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.updateKey('[PROJECT_ID]', '[KEY_ID]', '[NAME]', []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-platform.md b/app/sdks/nodejs/docs/examples/projects/update-platform.md new file mode 100644 index 0000000000..44fad61cfb --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/update-platform.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.updatePlatform('[PROJECT_ID]', '[PLATFORM_ID]', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-project-o-auth.md b/app/sdks/nodejs/docs/examples/projects/update-project-o-auth.md new file mode 100644 index 0000000000..29a3c6359f --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/update-project-o-auth.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.updateProjectOAuth('[PROJECT_ID]', 'bitbucket'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-project.md b/app/sdks/nodejs/docs/examples/projects/update-project.md new file mode 100644 index 0000000000..ced5f47fb3 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/update-project.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.updateProject('[PROJECT_ID]', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-task.md b/app/sdks/nodejs/docs/examples/projects/update-task.md new file mode 100644 index 0000000000..eaa54d89a5 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/update-task.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-webhook.md b/app/sdks/nodejs/docs/examples/projects/update-webhook.md new file mode 100644 index 0000000000..26f47557be --- /dev/null +++ b/app/sdks/nodejs/docs/examples/projects/update-webhook.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let projects = new sdk.Projects(client); + +client + .setProject('') +; + +let promise = projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/create-file.md b/app/sdks/nodejs/docs/examples/storage/create-file.md new file mode 100644 index 0000000000..d8d108017d --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/create-file.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') +; + +let promise = storage.createFile(document.getElementById('uploader').files[0], [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/delete-file.md b/app/sdks/nodejs/docs/examples/storage/delete-file.md new file mode 100644 index 0000000000..fae85d0b1d --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/delete-file.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') +; + +let promise = storage.deleteFile('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-download.md b/app/sdks/nodejs/docs/examples/storage/get-file-download.md new file mode 100644 index 0000000000..10ca0322a3 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/get-file-download.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') +; + +let promise = storage.getFileDownload('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-preview.md b/app/sdks/nodejs/docs/examples/storage/get-file-preview.md new file mode 100644 index 0000000000..f8a4b1ea02 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/get-file-preview.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') +; + +let promise = storage.getFilePreview('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-view.md b/app/sdks/nodejs/docs/examples/storage/get-file-view.md new file mode 100644 index 0000000000..34260abe30 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/get-file-view.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') +; + +let promise = storage.getFileView('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/get-file.md b/app/sdks/nodejs/docs/examples/storage/get-file.md new file mode 100644 index 0000000000..16e109f2ef --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/get-file.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') +; + +let promise = storage.getFile('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/list-files.md b/app/sdks/nodejs/docs/examples/storage/list-files.md new file mode 100644 index 0000000000..61fcc799b0 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/list-files.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') +; + +let promise = storage.listFiles(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/update-file.md b/app/sdks/nodejs/docs/examples/storage/update-file.md new file mode 100644 index 0000000000..fbe5d588fb --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/update-file.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') +; + +let promise = storage.updateFile('[FILE_ID]', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/create-team-membership.md b/app/sdks/nodejs/docs/examples/teams/create-team-membership.md new file mode 100644 index 0000000000..4106ac2a11 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/create-team-membership.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') +; + +let promise = teams.createTeamMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/create-team.md b/app/sdks/nodejs/docs/examples/teams/create-team.md new file mode 100644 index 0000000000..c0bf9b7d59 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/create-team.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') +; + +let promise = teams.createTeam('[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md b/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md new file mode 100644 index 0000000000..859a9ca8a9 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') +; + +let promise = teams.deleteTeamMembership('[TEAM_ID]', '[INVITE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/delete-team.md b/app/sdks/nodejs/docs/examples/teams/delete-team.md new file mode 100644 index 0000000000..7c87cc9260 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/delete-team.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') +; + +let promise = teams.deleteTeam('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md b/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md new file mode 100644 index 0000000000..4dd49446fa --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') +; + +let promise = teams.getTeamMemberships('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/get-team.md b/app/sdks/nodejs/docs/examples/teams/get-team.md new file mode 100644 index 0000000000..0e65a57e7e --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/get-team.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') +; + +let promise = teams.getTeam('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/list-teams.md b/app/sdks/nodejs/docs/examples/teams/list-teams.md new file mode 100644 index 0000000000..d8d3ca7010 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/list-teams.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') +; + +let promise = teams.listTeams(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/update-team-membership-status.md b/app/sdks/nodejs/docs/examples/teams/update-team-membership-status.md new file mode 100644 index 0000000000..daeaf47fa0 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/update-team-membership-status.md @@ -0,0 +1,17 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client +; + +let promise = teams.updateTeamMembershipStatus('[TEAM_ID]', '[INVITE_ID]', '[USER_ID]', '[SECRET]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/update-team.md b/app/sdks/nodejs/docs/examples/teams/update-team.md new file mode 100644 index 0000000000..d527ca95ab --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/update-team.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') +; + +let promise = teams.updateTeam('[TEAM_ID]', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/create-user.md b/app/sdks/nodejs/docs/examples/users/create-user.md new file mode 100644 index 0000000000..a5c637c383 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/create-user.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.createUser('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/delete-user-session.md b/app/sdks/nodejs/docs/examples/users/delete-user-session.md new file mode 100644 index 0000000000..a3cbeb522c --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/delete-user-session.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.deleteUserSession('[USER_ID]', '[SESSION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md b/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md new file mode 100644 index 0000000000..0b972bd21c --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.deleteUserSessions('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/get-user-logs.md b/app/sdks/nodejs/docs/examples/users/get-user-logs.md new file mode 100644 index 0000000000..1ff249ea31 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/get-user-logs.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.getUserLogs('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/get-user-prefs.md b/app/sdks/nodejs/docs/examples/users/get-user-prefs.md new file mode 100644 index 0000000000..33e26ebda8 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/get-user-prefs.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.getUserPrefs('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/get-user-sessions.md b/app/sdks/nodejs/docs/examples/users/get-user-sessions.md new file mode 100644 index 0000000000..09e7e4bbdb --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/get-user-sessions.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.getUserSessions('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/get-user.md b/app/sdks/nodejs/docs/examples/users/get-user.md new file mode 100644 index 0000000000..1a9b1b5463 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/get-user.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.getUser('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/list-users.md b/app/sdks/nodejs/docs/examples/users/list-users.md new file mode 100644 index 0000000000..0e609113a8 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/list-users.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.listUsers(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/update-user-prefs.md b/app/sdks/nodejs/docs/examples/users/update-user-prefs.md new file mode 100644 index 0000000000..58009109f8 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/update-user-prefs.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.updateUserPrefs('[USER_ID]', ''); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/update-user-status.md b/app/sdks/nodejs/docs/examples/users/update-user-status.md new file mode 100644 index 0000000000..99227df81b --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/update-user-status.md @@ -0,0 +1,18 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') +; + +let promise = users.updateUserStatus('[USER_ID]', '1'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/index.js b/app/sdks/nodejs/index.js new file mode 100644 index 0000000000..89e82ef555 --- /dev/null +++ b/app/sdks/nodejs/index.js @@ -0,0 +1,21 @@ +const Client = require('./lib/client.js'); +const Account = require('./lib/services/account.js'); +const Avatars = require('./lib/services/avatars.js'); +const Database = require('./lib/services/database.js'); +const Locale = require('./lib/services/locale.js'); +const Projects = require('./lib/services/projects.js'); +const Storage = require('./lib/services/storage.js'); +const Teams = require('./lib/services/teams.js'); +const Users = require('./lib/services/users.js'); + +module.exports = { + Client, + Account, + Avatars, + Database, + Locale, + Projects, + Storage, + Teams, + Users, +}; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/client.js b/app/sdks/nodejs/lib/client.js new file mode 100644 index 0000000000..253bf95f02 --- /dev/null +++ b/app/sdks/nodejs/lib/client.js @@ -0,0 +1,122 @@ +const URL = require('url').URL; +const request = require('request-promise-native'); + +class Client { + + constructor() { + this.endpoint = 'https://appwrite.io/v1'; + this.headers = { + 'content-type': '', + 'x-sdk-version': 'appwrite:nodejs:1.0.31', + }; + this.selfSigned = false; + } + + /** + * Set Project + * + * Your Appwrite project ID + * + * @param string value + * + * @return self + */ + setProject(value) { + this.addHeader('X-Appwrite-Project', value); + + return this; + } + + /** + * Set Key + * + * Your Appwrite project secret key + * + * @param string value + * + * @return self + */ + setKey(value) { + this.addHeader('X-Appwrite-Key', value); + + return this; + } + + /** + * Set Locale + * + * @param string value + * + * @return self + */ + setLocale(value) { + this.addHeader('X-Appwrite-Locale', value); + + return this; + } + + /** + * Set Mode + * + * @param string value + * + * @return self + */ + setMode(value) { + this.addHeader('X-Appwrite-Mode', value); + + return this; + } + + /*** + * @param bool status + * @return this + */ + setSelfSigned(status = true) { + this.selfSigned = status; + + return this; + } + + /*** + * @param endpoint + * @return this + */ + setEndpoint(endpoint) + { + this.endpoint = endpoint; + + return this; + } + + /** + * @param key string + * @param value string + */ + addHeader(key, value) { + this.headers[key.toLowerCase()] = value.toLowerCase(); + + return this; + } + + call(method, path = '', headers = {}, params = {}) { + if(this.selfSigned) { // Allow self signed requests + process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; + } + + headers = Object.assign(this.headers, headers); + + let options = { + method: method.toUpperCase(), + uri: this.endpoint + path, + qs: (method.toUpperCase() === 'GET') ? params : {}, + headers: headers, + body: (method.toUpperCase() === 'GET') ? '' : params, + json: (headers['content-type'].toLowerCase().startsWith('application/json')), + }; + + return request(options); + } +} + +module.exports = Client; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/service.js b/app/sdks/nodejs/lib/service.js new file mode 100644 index 0000000000..e799c064be --- /dev/null +++ b/app/sdks/nodejs/lib/service.js @@ -0,0 +1,10 @@ +class Service { + /** + * @param client + */ + constructor(client) { + this.client = client; + } +} + +module.exports = Service; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/account.js b/app/sdks/nodejs/lib/services/account.js new file mode 100644 index 0000000000..8ad6a312ea --- /dev/null +++ b/app/sdks/nodejs/lib/services/account.js @@ -0,0 +1,475 @@ +const Service = require('../service.js'); + +class Account extends Service { + + /** + * Get Account + * + * Get currently logged in user data as JSON object. + * + * @throws Exception + * @return {} + */ + async getAccount() { + let path = '/account'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Account + * + * Use this endpoint to allow a new user to register an account in your + * project. Use the success and failure URLs to redirect users back to your + * application after signup completes. + * + * If registration completes successfully user will be sent with a + * confirmation email in order to confirm he is the owner of the account email + * address. Use the confirmation parameter to redirect the user from the + * confirmation email back to your app. When the user is redirected, use the + * /auth/confirm endpoint to complete the account confirmation. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * When accessing this route using Javascript from the browser, success and + * failure parameter URLs are required. Appwrite server will respond with a + * 301 redirect status code and will set the user session cookie. This + * behavior is enforced because modern browsers are limiting 3rd party cookies + * in XHR of fetch requests to protect user privacy. + * + * @param string email + * @param string password + * @param string name + * @throws Exception + * @return {} + */ + async createAccount(email, password, name = '') { + let path = '/account'; + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'email': email, + 'password': password, + 'name': name + }); + } + + /** + * Delete Account + * + * Delete a currently logged in user account. Behind the scene, the user + * record is not deleted but permanently blocked from any access. This is done + * to avoid deleted accounts being overtaken by new users with the same email + * address. Any user-related resources like documents or storage files should + * be deleted separately. + * + * @throws Exception + * @return {} + */ + async delete() { + let path = '/account'; + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Account Email + * + * Update currently logged in user account email address. After changing user + * address, user confirmation status is being reset and a new confirmation + * mail is sent. For security measures, user password is required to complete + * this request. + * + * @param string email + * @param string password + * @throws Exception + * @return {} + */ + async updateEmail(email, password) { + let path = '/account/email'; + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'email': email, + 'password': password + }); + } + + /** + * Get Account Logs + * + * Get currently logged in user list of latest security activity logs. Each + * log returns user IP address, location and date and time of log. + * + * @throws Exception + * @return {} + */ + async getAccountLogs() { + let path = '/account/logs'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Account Name + * + * Update currently logged in user account name. + * + * @param string name + * @throws Exception + * @return {} + */ + async updateAccountName(name) { + let path = '/account/name'; + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'name': name + }); + } + + /** + * Update Account Password + * + * Update currently logged in user password. For validation, user is required + * to pass the password twice. + * + * @param string password + * @param string oldPassword + * @throws Exception + * @return {} + */ + async updateAccountPassword(password, oldPassword) { + let path = '/account/password'; + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'password': password, + 'old-password': oldPassword + }); + } + + /** + * Get Account Preferences + * + * Get currently logged in user preferences key-value object. + * + * @throws Exception + * @return {} + */ + async getAccountPrefs() { + let path = '/account/prefs'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Account Preferences + * + * Update currently logged in user account preferences. You can pass only the + * specific settings you wish to update. + * + * @param string prefs + * @throws Exception + * @return {} + */ + async updatePrefs(prefs) { + let path = '/account/prefs'; + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'prefs': prefs + }); + } + + /** + * Password Recovery + * + * Sends the user an email with a temporary secret token for password reset. + * When the user clicks the confirmation link he is redirected back to your + * app password reset redirect URL with a secret token and email address + * values attached to the URL query string. Use the query string params to + * submit a request to the /auth/password/reset endpoint to complete the + * process. + * + * @param string email + * @param string url + * @throws Exception + * @return {} + */ + async createAccountRecovery(email, url) { + let path = '/account/recovery'; + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'email': email, + 'url': url + }); + } + + /** + * Password Reset + * + * Use this endpoint to complete the user account password reset. Both the + * **userId** and **token** arguments will be passed as query parameters to + * the redirect URL you have provided when sending your request to the + * /auth/recovery endpoint. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * @param string userId + * @param string secret + * @param string passwordA + * @param string passwordB + * @throws Exception + * @return {} + */ + async updateAccountRecovery(userId, secret, passwordA, passwordB) { + let path = '/account/recovery'; + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'userId': userId, + 'secret': secret, + 'password-a': passwordA, + 'password-b': passwordB + }); + } + + /** + * Get Account Sessions + * + * Get currently logged in user list of active sessions across different + * devices. + * + * @throws Exception + * @return {} + */ + async getAccountSessions() { + let path = '/account/sessions'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Account Session + * + * Allow the user to login into his account by providing a valid email and + * password combination. Use the success and failure arguments to provide a + * redirect URL's back to your app when login is completed. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * When accessing this route using Javascript from the browser, success and + * failure parameter URLs are required. Appwrite server will respond with a + * 301 redirect status code and will set the user session cookie. This + * behavior is enforced because modern browsers are limiting 3rd party cookies + * in XHR of fetch requests to protect user privacy. + * + * @param string email + * @param string password + * @throws Exception + * @return {} + */ + async createAccountSession(email, password) { + let path = '/account/sessions'; + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'email': email, + 'password': password + }); + } + + /** + * Delete All Account Sessions + * + * Delete all sessions from the user account and remove any sessions cookies + * from the end client. + * + * @throws Exception + * @return {} + */ + async deleteAccountSessions() { + let path = '/account/sessions'; + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Delete Current Account Session + * + * Use this endpoint to log out the currently logged in user from his account. + * When successful this endpoint will delete the user session and remove the + * session secret cookie from the user client. + * + * @throws Exception + * @return {} + */ + async deleteAccountCurrentSession() { + let path = '/account/sessions/current'; + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Account Session with OAuth + * + * Allow the user to login to his account using the OAuth provider of his + * choice. Each OAuth provider should be enabled from the Appwrite console + * first. Use the success and failure arguments to provide a redirect URL's + * back to your app when login is completed. + * + * @param string provider + * @param string success + * @param string failure + * @throws Exception + * @return {} + */ + async createAccountSessionOAuth(provider, success, failure) { + let path = '/account/sessions/oauth/{provider}'.replace(new RegExp('{provider}', 'g'), provider); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'success': success, + 'failure': failure + }); + } + + /** + * Delete Account Session + * + * Use this endpoint to log out the currently logged in user from all his + * account sessions across all his different devices. When using the option id + * argument, only the session unique ID provider will be deleted. + * + * @param string id + * @throws Exception + * @return {} + */ + async deleteAccountSession(id) { + let path = '/account/sessions/{id}'.replace(new RegExp('{id}', 'g'), id); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Verification + * + * Use this endpoint to send a verification message to your user email address + * to confirm they are the valid owners of that address. Both the **userId** + * and **token** arguments will be passed as query parameters to the URL you + * have provider to be attached to the verification email. The provided URL + * should redirect the user back for your app and allow you to complete the + * verification process by verifying both the **userId** and **token** + * parameters. Learn more about how to [complete the verification + * process](/docs/account#updateAccountVerification). + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * @param string url + * @throws Exception + * @return {} + */ + async createAccountVerification(url) { + let path = '/account/verification'; + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'url': url + }); + } + + /** + * Updated Verification + * + * Use this endpoint to complete the user email verification process. Use both + * the **userId** and **token** parameters that were attached to your app URL + * to verify the user email ownership. If confirmed this route will return a + * 200 status code. + * + * @param string userId + * @param string secret + * @param string passwordB + * @throws Exception + * @return {} + */ + async updateAccountVerification(userId, secret, passwordB) { + let path = '/account/verification'; + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'userId': userId, + 'secret': secret, + 'password-b': passwordB + }); + } +} + +module.exports = Account; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/avatars.js b/app/sdks/nodejs/lib/services/avatars.js new file mode 100644 index 0000000000..c34bdde966 --- /dev/null +++ b/app/sdks/nodejs/lib/services/avatars.js @@ -0,0 +1,164 @@ +const Service = require('../service.js'); + +class Avatars extends Service { + + /** + * Get Browser Icon + * + * You can use this endpoint to show different browser icons to your users. + * The code argument receives the browser code as it appears in your user + * /account/sessions endpoint. Use width, height and quality arguments to + * change the output settings. + * + * @param string code + * @param number width + * @param number height + * @param number quality + * @throws Exception + * @return {} + */ + async getBrowser(code, width = 100, height = 100, quality = 100) { + let path = '/avatars/browsers/{code}'.replace(new RegExp('{code}', 'g'), code); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'width': width, + 'height': height, + 'quality': quality + }); + } + + /** + * Get Credit Card Icon + * + * Need to display your users with your billing method or their payment + * methods? The credit card endpoint will return you the icon of the credit + * card provider you need. Use width, height and quality arguments to change + * the output settings. + * + * @param string code + * @param number width + * @param number height + * @param number quality + * @throws Exception + * @return {} + */ + async getCreditCard(code, width = 100, height = 100, quality = 100) { + let path = '/avatars/credit-cards/{code}'.replace(new RegExp('{code}', 'g'), code); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'width': width, + 'height': height, + 'quality': quality + }); + } + + /** + * Get Favicon + * + * Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote + * website URL. + * + * @param string url + * @throws Exception + * @return {} + */ + async getFavicon(url) { + let path = '/avatars/favicon'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'url': url + }); + } + + /** + * Get Country Flag + * + * You can use this endpoint to show different country flags icons to your + * users. The code argument receives the 2 letter country code. Use width, + * height and quality arguments to change the output settings. + * + * @param string code + * @param number width + * @param number height + * @param number quality + * @throws Exception + * @return {} + */ + async getFlag(code, width = 100, height = 100, quality = 100) { + let path = '/avatars/flags/{code}'.replace(new RegExp('{code}', 'g'), code); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'width': width, + 'height': height, + 'quality': quality + }); + } + + /** + * Get Image from URL + * + * Use this endpoint to fetch a remote image URL and crop it to any image size + * you want. This endpoint is very useful if you need to crop and display + * remote images in your app or in case you want to make sure a 3rd party + * image is properly served using a TLS protocol. + * + * @param string url + * @param number width + * @param number height + * @throws Exception + * @return {} + */ + async getImage(url, width = 400, height = 400) { + let path = '/avatars/image'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'url': url, + 'width': width, + 'height': height + }); + } + + /** + * Get QR Code + * + * Converts a given plain text to a QR code image. You can use the query + * parameters to change the size and style of the resulting image. + * + * @param string text + * @param number size + * @param number margin + * @param number download + * @throws Exception + * @return {} + */ + async getQR(text, size = 400, margin = 1, download = 0) { + let path = '/avatars/qr'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'text': text, + 'size': size, + 'margin': margin, + 'download': download + }); + } +} + +module.exports = Avatars; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/database.js b/app/sdks/nodejs/lib/services/database.js new file mode 100644 index 0000000000..4287484038 --- /dev/null +++ b/app/sdks/nodejs/lib/services/database.js @@ -0,0 +1,266 @@ +const Service = require('../service.js'); + +class Database extends Service { + + /** + * List Collections + * + * Get a list of all the user collections. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project collections. [Learn more about different API + * modes](/docs/admin). + * + * @param string search + * @param number limit + * @param number offset + * @param string orderType + * @throws Exception + * @return {} + */ + async listCollections(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/database'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'search': search, + 'limit': limit, + 'offset': offset, + 'orderType': orderType + }); + } + + /** + * Create Collection + * + * Create a new Collection. + * + * @param string name + * @param array read + * @param array write + * @param array rules + * @throws Exception + * @return {} + */ + async createCollection(name, read, write, rules) { + let path = '/database'; + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'read': read, + 'write': write, + 'rules': rules + }); + } + + /** + * Get Collection + * + * Get collection by its unique ID. This endpoint response returns a JSON + * object with the collection metadata. + * + * @param string collectionId + * @throws Exception + * @return {} + */ + async getCollection(collectionId) { + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Collection + * + * Update collection by its unique ID. + * + * @param string collectionId + * @param string name + * @param array read + * @param array write + * @param array rules + * @throws Exception + * @return {} + */ + async updateCollection(collectionId, name, read, write, rules = []) { + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'read': read, + 'write': write, + 'rules': rules + }); + } + + /** + * Delete Collection + * + * Delete a collection by its unique ID. Only users with write permissions + * have access to delete this resource. + * + * @param string collectionId + * @throws Exception + * @return {} + */ + async deleteCollection(collectionId) { + let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List Documents + * + * Get a list of all the user documents. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project documents. [Learn more about different API + * modes](/docs/admin). + * + * @param string collectionId + * @param array filters + * @param number offset + * @param number limit + * @param string orderField + * @param string orderType + * @param string orderCast + * @param string search + * @param number first + * @param number last + * @throws Exception + * @return {} + */ + async listDocuments(collectionId, filters = [], offset = 0, limit = 50, orderField = '$uid', orderType = 'ASC', orderCast = 'string', search = '', first = 0, last = 0) { + let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'filters': filters, + 'offset': offset, + 'limit': limit, + 'order-field': orderField, + 'order-type': orderType, + 'order-cast': orderCast, + 'search': search, + 'first': first, + 'last': last + }); + } + + /** + * Create Document + * + * Create a new Document. + * + * @param string collectionId + * @param string data + * @param array read + * @param array write + * @param string parentDocument + * @param string parentProperty + * @param string parentPropertyType + * @throws Exception + * @return {} + */ + async createDocument(collectionId, data, read, write, parentDocument = '', parentProperty = '', parentPropertyType = 'assign') { + let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'data': data, + 'read': read, + 'write': write, + 'parentDocument': parentDocument, + 'parentProperty': parentProperty, + 'parentPropertyType': parentPropertyType + }); + } + + /** + * Get Document + * + * Get document by its unique ID. This endpoint response returns a JSON object + * with the document data. + * + * @param string collectionId + * @param string documentId + * @throws Exception + * @return {} + */ + async getDocument(collectionId, documentId) { + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Document + * + * @param string collectionId + * @param string documentId + * @param string data + * @param array read + * @param array write + * @throws Exception + * @return {} + */ + async updateDocument(collectionId, documentId, data, read, write) { + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'data': data, + 'read': read, + 'write': write + }); + } + + /** + * Delete Document + * + * Delete document by its unique ID. This endpoint deletes only the parent + * documents, his attributes and relations to other documents. Child documents + * **will not** be deleted. + * + * @param string collectionId + * @param string documentId + * @throws Exception + * @return {} + */ + async deleteDocument(collectionId, documentId) { + let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } +} + +module.exports = Database; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/locale.js b/app/sdks/nodejs/lib/services/locale.js new file mode 100644 index 0000000000..2b5f3f2b2f --- /dev/null +++ b/app/sdks/nodejs/lib/services/locale.js @@ -0,0 +1,125 @@ +const Service = require('../service.js'); + +class Locale extends Service { + + /** + * Get User Locale + * + * Get the current user location based on IP. Returns an object with user + * country code, country name, continent name, continent code, ip address and + * suggested currency. You can use the locale header to get the data in a + * supported language. + * + * ([IP Geolocation by DB-IP](https://db-ip.com)) + * + * @throws Exception + * @return {} + */ + async getLocale() { + let path = '/locale'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List Countries + * + * List of all continents. You can use the locale header to get the data in a + * supported language. + * + * @throws Exception + * @return {} + */ + async getContinents() { + let path = '/locale/continents'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List Countries + * + * List of all countries. You can use the locale header to get the data in a + * supported language. + * + * @throws Exception + * @return {} + */ + async getCountries() { + let path = '/locale/countries'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List EU Countries + * + * List of all countries that are currently members of the EU. You can use the + * locale header to get the data in a supported language. + * + * @throws Exception + * @return {} + */ + async getCountriesEU() { + let path = '/locale/countries/eu'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List Countries Phone Codes + * + * List of all countries phone codes. You can use the locale header to get the + * data in a supported language. + * + * @throws Exception + * @return {} + */ + async getCountriesPhones() { + let path = '/locale/countries/phones'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List Currencies + * + * List of all currencies, including currency symol, name, plural, and decimal + * digits for all major and minor currencies. You can use the locale header to + * get the data in a supported language. + * + * @throws Exception + * @return {} + */ + async getCurrencies() { + let path = '/locale/currencies'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } +} + +module.exports = Locale; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/projects.js b/app/sdks/nodejs/lib/services/projects.js new file mode 100644 index 0000000000..58a03980a2 --- /dev/null +++ b/app/sdks/nodejs/lib/services/projects.js @@ -0,0 +1,609 @@ +const Service = require('../service.js'); + +class Projects extends Service { + + /** + * List Projects + * + * @throws Exception + * @return {} + */ + async listProjects() { + let path = '/projects'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Project + * + * @param string name + * @param string teamId + * @param string description + * @param string logo + * @param string url + * @param string legalName + * @param string legalCountry + * @param string legalState + * @param string legalCity + * @param string legalAddress + * @param string legalTaxId + * @throws Exception + * @return {} + */ + async createProject(name, teamId, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { + let path = '/projects'; + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'teamId': teamId, + 'description': description, + 'logo': logo, + 'url': url, + 'legalName': legalName, + 'legalCountry': legalCountry, + 'legalState': legalState, + 'legalCity': legalCity, + 'legalAddress': legalAddress, + 'legalTaxId': legalTaxId + }); + } + + /** + * Get Project + * + * @param string projectId + * @throws Exception + * @return {} + */ + async getProject(projectId) { + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Project + * + * @param string projectId + * @param string name + * @param string description + * @param string logo + * @param string url + * @param string legalName + * @param string legalCountry + * @param string legalState + * @param string legalCity + * @param string legalAddress + * @param string legalTaxId + * @throws Exception + * @return {} + */ + async updateProject(projectId, name, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'description': description, + 'logo': logo, + 'url': url, + 'legalName': legalName, + 'legalCountry': legalCountry, + 'legalState': legalState, + 'legalCity': legalCity, + 'legalAddress': legalAddress, + 'legalTaxId': legalTaxId + }); + } + + /** + * Delete Project + * + * @param string projectId + * @throws Exception + * @return {} + */ + async deleteProject(projectId) { + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List Keys + * + * @param string projectId + * @throws Exception + * @return {} + */ + async listKeys(projectId) { + let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Key + * + * @param string projectId + * @param string name + * @param array scopes + * @throws Exception + * @return {} + */ + async createKey(projectId, name, scopes) { + let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'scopes': scopes + }); + } + + /** + * Get Key + * + * @param string projectId + * @param string keyId + * @throws Exception + * @return {} + */ + async getKey(projectId, keyId) { + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Key + * + * @param string projectId + * @param string keyId + * @param string name + * @param array scopes + * @throws Exception + * @return {} + */ + async updateKey(projectId, keyId, name, scopes) { + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'scopes': scopes + }); + } + + /** + * Delete Key + * + * @param string projectId + * @param string keyId + * @throws Exception + * @return {} + */ + async deleteKey(projectId, keyId) { + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Project OAuth + * + * @param string projectId + * @param string provider + * @param string appId + * @param string secret + * @throws Exception + * @return {} + */ + async updateProjectOAuth(projectId, provider, appId = '', secret = '') { + let path = '/projects/{projectId}/oauth'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'provider': provider, + 'appId': appId, + 'secret': secret + }); + } + + /** + * List Platforms + * + * @param string projectId + * @throws Exception + * @return {} + */ + async listPlatforms(projectId) { + let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Platform + * + * @param string projectId + * @param string type + * @param string name + * @param string key + * @param string store + * @param string url + * @throws Exception + * @return {} + */ + async createPlatform(projectId, type, name, key = '', store = '', url = '') { + let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'type': type, + 'name': name, + 'key': key, + 'store': store, + 'url': url + }); + } + + /** + * Get Platform + * + * @param string projectId + * @param string platformId + * @throws Exception + * @return {} + */ + async getPlatform(projectId, platformId) { + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Platform + * + * @param string projectId + * @param string platformId + * @param string name + * @param string key + * @param string store + * @param string url + * @throws Exception + * @return {} + */ + async updatePlatform(projectId, platformId, name, key = '', store = '', url = '') { + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'key': key, + 'store': store, + 'url': url + }); + } + + /** + * Delete Platform + * + * @param string projectId + * @param string platformId + * @throws Exception + * @return {} + */ + async deletePlatform(projectId, platformId) { + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List Tasks + * + * @param string projectId + * @throws Exception + * @return {} + */ + async listTasks(projectId) { + let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Task + * + * @param string projectId + * @param string name + * @param string status + * @param string schedule + * @param number security + * @param string httpMethod + * @param string httpUrl + * @param array httpHeaders + * @param string httpUser + * @param string httpPass + * @throws Exception + * @return {} + */ + async createTask(projectId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { + let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'status': status, + 'schedule': schedule, + 'security': security, + 'httpMethod': httpMethod, + 'httpUrl': httpUrl, + 'httpHeaders': httpHeaders, + 'httpUser': httpUser, + 'httpPass': httpPass + }); + } + + /** + * Get Task + * + * @param string projectId + * @param string taskId + * @throws Exception + * @return {} + */ + async getTask(projectId, taskId) { + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Task + * + * @param string projectId + * @param string taskId + * @param string name + * @param string status + * @param string schedule + * @param number security + * @param string httpMethod + * @param string httpUrl + * @param array httpHeaders + * @param string httpUser + * @param string httpPass + * @throws Exception + * @return {} + */ + async updateTask(projectId, taskId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'status': status, + 'schedule': schedule, + 'security': security, + 'httpMethod': httpMethod, + 'httpUrl': httpUrl, + 'httpHeaders': httpHeaders, + 'httpUser': httpUser, + 'httpPass': httpPass + }); + } + + /** + * Delete Task + * + * @param string projectId + * @param string taskId + * @throws Exception + * @return {} + */ + async deleteTask(projectId, taskId) { + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Get Project + * + * @param string projectId + * @throws Exception + * @return {} + */ + async getProjectUsage(projectId) { + let path = '/projects/{projectId}/usage'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * List Webhooks + * + * @param string projectId + * @throws Exception + * @return {} + */ + async listWebhooks(projectId) { + let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Webhook + * + * @param string projectId + * @param string name + * @param array events + * @param string url + * @param number security + * @param string httpUser + * @param string httpPass + * @throws Exception + * @return {} + */ + async createWebhook(projectId, name, events, url, security, httpUser = '', httpPass = '') { + let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'events': events, + 'url': url, + 'security': security, + 'httpUser': httpUser, + 'httpPass': httpPass + }); + } + + /** + * Get Webhook + * + * @param string projectId + * @param string webhookId + * @throws Exception + * @return {} + */ + async getWebhook(projectId, webhookId) { + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Webhook + * + * @param string projectId + * @param string webhookId + * @param string name + * @param array events + * @param string url + * @param number security + * @param string httpUser + * @param string httpPass + * @throws Exception + * @return {} + */ + async updateWebhook(projectId, webhookId, name, events, url, security, httpUser = '', httpPass = '') { + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'events': events, + 'url': url, + 'security': security, + 'httpUser': httpUser, + 'httpPass': httpPass + }); + } + + /** + * Delete Webhook + * + * @param string projectId + * @param string webhookId + * @throws Exception + * @return {} + */ + async deleteWebhook(projectId, webhookId) { + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } +} + +module.exports = Projects; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/storage.js b/app/sdks/nodejs/lib/services/storage.js new file mode 100644 index 0000000000..7237ccfc6f --- /dev/null +++ b/app/sdks/nodejs/lib/services/storage.js @@ -0,0 +1,199 @@ +const Service = require('../service.js'); + +class Storage extends Service { + + /** + * List Files + * + * Get a list of all the user files. You can use the query params to filter + * your results. On admin mode, this endpoint will return a list of all of the + * project files. [Learn more about different API modes](/docs/admin). + * + * @param string search + * @param number limit + * @param number offset + * @param string orderType + * @throws Exception + * @return {} + */ + async listFiles(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/storage/files'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'search': search, + 'limit': limit, + 'offset': offset, + 'orderType': orderType + }); + } + + /** + * Create File + * + * Create a new file. The user who creates the file will automatically be + * assigned to read and write access unless he has passed custom values for + * read and write arguments. + * + * @param File file + * @param array read + * @param array write + * @throws Exception + * @return {} + */ + async createFile(file, read, write) { + let path = '/storage/files'; + + return await this.client.call('post', path, { + 'content-type': 'multipart/form-data', + }, + { + 'file': file, + 'read': read, + 'write': write + }); + } + + /** + * Get File + * + * Get file by its unique ID. This endpoint response returns a JSON object + * with the file metadata. + * + * @param string fileId + * @throws Exception + * @return {} + */ + async getFile(fileId) { + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update File + * + * Update file by its unique ID. Only users with write permissions have access + * to update this resource. + * + * @param string fileId + * @param array read + * @param array write + * @throws Exception + * @return {} + */ + async updateFile(fileId, read, write) { + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'read': read, + 'write': write + }); + } + + /** + * Delete File + * + * Delete a file by its unique ID. Only users with write permissions have + * access to delete this resource. + * + * @param string fileId + * @throws Exception + * @return {} + */ + async deleteFile(fileId) { + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Get File for Download + * + * Get file content by its unique ID. The endpoint response return with a + * 'Content-Disposition: attachment' header that tells the browser to start + * downloading the file to user downloads directory. + * + * @param string fileId + * @throws Exception + * @return {} + */ + async getFileDownload(fileId) { + let path = '/storage/files/{fileId}/download'.replace(new RegExp('{fileId}', 'g'), fileId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Get File Preview + * + * Get a file preview image. Currently, this method supports preview for image + * files (jpg, png, and gif), other supported formats, like pdf, docs, slides, + * and spreadsheets, will return the file icon image. You can also pass query + * string arguments for cutting and resizing your preview image. + * + * @param string fileId + * @param number width + * @param number height + * @param number quality + * @param string background + * @param string output + * @throws Exception + * @return {} + */ + async getFilePreview(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { + let path = '/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}', 'g'), fileId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'width': width, + 'height': height, + 'quality': quality, + 'background': background, + 'output': output + }); + } + + /** + * Get File for View + * + * Get file content by its unique ID. This endpoint is similar to the download + * method but returns with no 'Content-Disposition: attachment' header. + * + * @param string fileId + * @param string as + * @throws Exception + * @return {} + */ + async getFileView(fileId, as = '') { + let path = '/storage/files/{fileId}/view'.replace(new RegExp('{fileId}', 'g'), fileId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'as': as + }); + } +} + +module.exports = Storage; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/teams.js b/app/sdks/nodejs/lib/services/teams.js new file mode 100644 index 0000000000..324837977f --- /dev/null +++ b/app/sdks/nodejs/lib/services/teams.js @@ -0,0 +1,240 @@ +const Service = require('../service.js'); + +class Teams extends Service { + + /** + * List Teams + * + * Get a list of all the current user teams. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project teams. [Learn more about different API modes](/docs/admin). + * + * @param string search + * @param number limit + * @param number offset + * @param string orderType + * @throws Exception + * @return {} + */ + async listTeams(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/teams'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'search': search, + 'limit': limit, + 'offset': offset, + 'orderType': orderType + }); + } + + /** + * Create Team + * + * Create a new team. The user who creates the team will automatically be + * assigned as the owner of the team. The team owner can invite new members, + * who will be able add new owners and update or delete the team from your + * project. + * + * @param string name + * @param array roles + * @throws Exception + * @return {} + */ + async createTeam(name, roles = ["owner"]) { + let path = '/teams'; + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'name': name, + 'roles': roles + }); + } + + /** + * Get Team + * + * Get team by its unique ID. All team members have read access for this + * resource. + * + * @param string teamId + * @throws Exception + * @return {} + */ + async getTeam(teamId) { + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Team + * + * Update team by its unique ID. Only team owners have write access for this + * resource. + * + * @param string teamId + * @param string name + * @throws Exception + * @return {} + */ + async updateTeam(teamId, name) { + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + return await this.client.call('put', path, { + 'content-type': 'application/json', + }, + { + 'name': name + }); + } + + /** + * Delete Team + * + * Delete team by its unique ID. Only team owners have write access for this + * resource. + * + * @param string teamId + * @throws Exception + * @return {} + */ + async deleteTeam(teamId) { + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Get Team Memberships + * + * Get team members by the team unique ID. All team members have read access + * for this list of resources. + * + * @param string teamId + * @throws Exception + * @return {} + */ + async getTeamMemberships(teamId) { + let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Create Team Membership + * + * Use this endpoint to invite a new member to your team. An email with a link + * to join the team will be sent to the new member email address. If member + * doesn't exists in the project it will be automatically created. + * + * Use the 'url' parameter to redirect the user from the invitation email back + * to your app. When the user is redirected, use the [Update Team Membership + * Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join + * the user to the team. + * + * Please note that in order to avoid a [Redirect + * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URL's are the once from domains you have set when + * added your platforms in the console interface. + * + * @param string teamId + * @param string email + * @param array roles + * @param string url + * @param string name + * @throws Exception + * @return {} + */ + async createTeamMembership(teamId, email, roles, url, name = '') { + let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'email': email, + 'name': name, + 'roles': roles, + 'url': url + }); + } + + /** + * Delete Team Membership + * + * This endpoint allows a user to leave a team or for a team owner to delete + * the membership of any other team member. You can also use this endpoint to + * delete a user membership even if he didn't accept it. + * + * @param string teamId + * @param string inviteId + * @throws Exception + * @return {} + */ + async deleteTeamMembership(teamId, inviteId) { + let path = '/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update Team Membership Status + * + * Use this endpoint to let user accept an invitation to join a team after he + * is being redirect back to your app from the invitation email. Use the + * success and failure URL's to redirect users back to your application after + * the request completes. + * + * Please note that in order to avoid a [Redirect + * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URL's are the once from domains you have set when + * added your platforms in the console interface. + * + * When not using the success or failure redirect arguments this endpoint will + * result with a 200 status code on success and with 401 status error on + * failure. This behavior was applied to help the web clients deal with + * browsers who don't allow to set 3rd party HTTP cookies needed for saving + * the account session token. + * + * @param string teamId + * @param string inviteId + * @param string userId + * @param string secret + * @throws Exception + * @return {} + */ + async updateTeamMembershipStatus(teamId, inviteId, userId, secret) { + let path = '/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'userId': userId, + 'secret': secret + }); + } +} + +module.exports = Teams; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/users.js b/app/sdks/nodejs/lib/services/users.js new file mode 100644 index 0000000000..5fe21c7350 --- /dev/null +++ b/app/sdks/nodejs/lib/services/users.js @@ -0,0 +1,216 @@ +const Service = require('../service.js'); + +class Users extends Service { + + /** + * List Users + * + * Get a list of all the project users. You can use the query params to filter + * your results. + * + * @param string search + * @param number limit + * @param number offset + * @param string orderType + * @throws Exception + * @return {} + */ + async listUsers(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/users'; + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + 'search': search, + 'limit': limit, + 'offset': offset, + 'orderType': orderType + }); + } + + /** + * Create User + * + * Create a new user. + * + * @param string email + * @param string password + * @param string name + * @throws Exception + * @return {} + */ + async createUser(email, password, name = '') { + let path = '/users'; + + return await this.client.call('post', path, { + 'content-type': 'application/json', + }, + { + 'email': email, + 'password': password, + 'name': name + }); + } + + /** + * Get User + * + * Get user by its unique ID. + * + * @param string userId + * @throws Exception + * @return {} + */ + async getUser(userId) { + let path = '/users/{userId}'.replace(new RegExp('{userId}', 'g'), userId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Get User Logs + * + * Get user activity logs list by its unique ID. + * + * @param string userId + * @throws Exception + * @return {} + */ + async getUserLogs(userId) { + let path = '/users/{userId}/logs'.replace(new RegExp('{userId}', 'g'), userId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Get User Preferences + * + * Get user preferences by its unique ID. + * + * @param string userId + * @throws Exception + * @return {} + */ + async getUserPrefs(userId) { + let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Update User Preferences + * + * Update user preferences by its unique ID. You can pass only the specific + * settings you wish to update. + * + * @param string userId + * @param string prefs + * @throws Exception + * @return {} + */ + async updateUserPrefs(userId, prefs) { + let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'prefs': prefs + }); + } + + /** + * Get User Sessions + * + * Get user sessions list by its unique ID. + * + * @param string userId + * @throws Exception + * @return {} + */ + async getUserSessions(userId) { + let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); + + return await this.client.call('get', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Delete User Sessions + * + * Delete all user sessions by its unique ID. + * + * @param string userId + * @throws Exception + * @return {} + */ + async deleteUserSessions(userId) { + let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + }); + } + + /** + * Delete User Session + * + * Delete user sessions by its unique ID. + * + * @param string userId + * @param string sessionId + * @throws Exception + * @return {} + */ + async deleteUserSession(userId, sessionId) { + let path = '/users/{userId}/sessions/:session'.replace(new RegExp('{userId}', 'g'), userId); + + return await this.client.call('delete', path, { + 'content-type': 'application/json', + }, + { + 'sessionId': sessionId + }); + } + + /** + * Update User Status + * + * Update user status by its unique ID. + * + * @param string userId + * @param string status + * @throws Exception + * @return {} + */ + async updateUserStatus(userId, status) { + let path = '/users/{userId}/status'.replace(new RegExp('{userId}', 'g'), userId); + + return await this.client.call('patch', path, { + 'content-type': 'application/json', + }, + { + 'status': status + }); + } +} + +module.exports = Users; \ No newline at end of file diff --git a/app/sdks/nodejs/package.json b/app/sdks/nodejs/package.json new file mode 100644 index 0000000000..b10f63562a --- /dev/null +++ b/app/sdks/nodejs/package.json @@ -0,0 +1,17 @@ +{ + "name": "node-appwrite", + "homepage": "https://appwrite.io/support", + "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)", + "version": "1.0.31", + "license": "BSD-3-Clause", + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/appwrite/sdk-for-node" + }, + "devDependencies": {}, + "dependencies": { + "request": "^2.88.0", + "request-promise-native": "^1.0.7" + } +} \ No newline at end of file diff --git a/app/sdks/php/README.md b/app/sdks/php/README.md index 8244a4d953..03ce462fe9 100644 --- a/app/sdks/php/README.md +++ b/app/sdks/php/README.md @@ -3,8 +3,6 @@ ![License](https://img.shields.io/github/license/appwrite/sdk-for-php.svg?v=1) ![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) -**This SDK is compatible with Appwrite server version 0.4.0. For older versions, please check previous releases.** - Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) diff --git a/app/sdks/php/docs/account.md b/app/sdks/php/docs/account.md index 7d4455ffef..a9dc7f39a7 100644 --- a/app/sdks/php/docs/account.md +++ b/app/sdks/php/docs/account.md @@ -8,6 +8,28 @@ GET https://appwrite.io/v1/account ** Get currently logged in user data as JSON object. ** +## Create Account + +```http request +POST https://appwrite.io/v1/account +``` + +** Use this endpoint to allow a new user to register an account in your project. Use the success and failure URLs to redirect users back to your application after signup completes. + +If registration completes successfully user will be sent with a confirmation email in order to confirm he is the owner of the account email address. Use the confirmation parameter to redirect the user from the confirmation email back to your app. When the user is redirected, use the /auth/confirm endpoint to complete the account confirmation. + +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. + +When accessing this route using Javascript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. ** + +### Parameters + +| Field Name | Type | Description | Default | +| --- | --- | --- | --- | +| email | string | Account email | | +| password | string | User password | | +| name | string | User name | | + ## Delete Account ```http request @@ -28,8 +50,16 @@ PATCH https://appwrite.io/v1/account/email | Field Name | Type | Description | Default | | --- | --- | --- | --- | -| email | string | Email Address | | -| password | string | User Password | | +| email | string | Email address | | +| password | string | User password | | + +## Get Account Logs + +```http request +GET https://appwrite.io/v1/account/logs +``` + +** Get currently logged in user list of latest security activity logs. Each log returns user IP address, location and date and time of log. ** ## Update Account Name @@ -68,7 +98,7 @@ GET https://appwrite.io/v1/account/prefs ** Get currently logged in user preferences key-value object. ** -## Update Account Prefs +## Update Account Preferences ```http request PATCH https://appwrite.io/v1/account/prefs @@ -80,17 +110,43 @@ PATCH https://appwrite.io/v1/account/prefs | Field Name | Type | Description | Default | | --- | --- | --- | --- | -| prefs | string | Prefs key-value JSON object string. | | +| prefs | string | Prefs key-value JSON object. | | -## Get Account Security Log +## Password Recovery ```http request -GET https://appwrite.io/v1/account/security +POST https://appwrite.io/v1/account/recovery ``` -** Get currently logged in user list of latest security activity logs. Each log returns user IP address, location and date and time of log. ** +** Sends the user an email with a temporary secret token for password reset. When the user clicks the confirmation link he is redirected back to your app password reset redirect URL with a secret token and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process. ** -## Get Account Active Sessions +### Parameters + +| Field Name | Type | Description | Default | +| --- | --- | --- | --- | +| email | string | User account email address. | | +| url | string | URL to redirect the user back to your app from the recovery email. | | + +## Password Reset + +```http request +PUT https://appwrite.io/v1/account/recovery +``` + +** Use this endpoint to complete the user account password reset. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. + +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. ** + +### Parameters + +| Field Name | Type | Description | Default | +| --- | --- | --- | --- | +| userId | string | User account UID address. | | +| secret | string | Valid reset token. | | +| password-a | string | New password. | | +| password-b | string | New password again. | | + +## Get Account Sessions ```http request GET https://appwrite.io/v1/account/sessions @@ -98,3 +154,100 @@ GET https://appwrite.io/v1/account/sessions ** Get currently logged in user list of active sessions across different devices. ** +## Create Account Session + +```http request +POST https://appwrite.io/v1/account/sessions +``` + +** Allow the user to login into his account by providing a valid email and password combination. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. + +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. + +When accessing this route using Javascript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. ** + +### Parameters + +| Field Name | Type | Description | Default | +| --- | --- | --- | --- | +| email | string | User account email address | | +| password | string | User account password | | + +## Delete All Account Sessions + +```http request +DELETE https://appwrite.io/v1/account/sessions +``` + +** Delete all sessions from the user account and remove any sessions cookies from the end client. ** + +## Delete Current Account Session + +```http request +DELETE https://appwrite.io/v1/account/sessions/current +``` + +** Use this endpoint to log out the currently logged in user from his account. When successful this endpoint will delete the user session and remove the session secret cookie from the user client. ** + +## Create Account Session with OAuth + +```http request +GET https://appwrite.io/v1/account/sessions/oauth/{provider} +``` + +** Allow the user to login to his account using the OAuth provider of his choice. Each OAuth provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. ** + +### Parameters + +| Field Name | Type | Description | Default | +| --- | --- | --- | --- | +| provider | string | **Required** OAuth Provider. Currently, supported providers are: bitbucket, facebook, github, gitlab, google, microsoft, linkedin, slack, dropbox, salesforce, amazon, vk, discord, twitch, spotify, yahoo, yandex, twitter, paypal, bitly, mock | | +| success | string | **Required** URL to redirect back to your app after a successful login attempt. | | +| failure | string | **Required** URL to redirect back to your app after a failed login attempt. | | + +## Delete Account Session + +```http request +DELETE https://appwrite.io/v1/account/sessions/{id} +``` + +** Use this endpoint to log out the currently logged in user from all his account sessions across all his different devices. When using the option id argument, only the session unique ID provider will be deleted. ** + +### Parameters + +| Field Name | Type | Description | Default | +| --- | --- | --- | --- | +| id | string | **Required** Session unique ID. | | + +## Create Verification + +```http request +POST https://appwrite.io/v1/account/verification +``` + +** Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **token** arguments will be passed as query parameters to the URL you have provider to be attached to the verification email. The provided URL should redirect the user back for your app and allow you to complete the verification process by verifying both the **userId** and **token** parameters. Learn more about how to [complete the verification process](/docs/account#updateAccountVerification). + +Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. ** + +### Parameters + +| Field Name | Type | Description | Default | +| --- | --- | --- | --- | +| url | string | URL to redirect the user back to your app from the verification email. | | + +## Updated Verification + +```http request +PUT https://appwrite.io/v1/account/verification +``` + +** Use this endpoint to complete the user email verification process. Use both the **userId** and **token** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code. ** + +### Parameters + +| Field Name | Type | Description | Default | +| --- | --- | --- | --- | +| userId | string | User account UID address. | | +| secret | string | Valid reset token. | | +| password-b | string | New password again. | | + diff --git a/app/sdks/php/docs/examples/account/create-account-recovery.md b/app/sdks/php/docs/examples/account/create-account-recovery.md new file mode 100644 index 0000000000..0ba77c1e1f --- /dev/null +++ b/app/sdks/php/docs/examples/account/create-account-recovery.md @@ -0,0 +1,13 @@ +createAccountRecovery('email@example.com', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/create-account-session-o-auth.md b/app/sdks/php/docs/examples/account/create-account-session-o-auth.md new file mode 100644 index 0000000000..7e0e4decaf --- /dev/null +++ b/app/sdks/php/docs/examples/account/create-account-session-o-auth.md @@ -0,0 +1,13 @@ +createAccountSessionOAuth('bitbucket', 'https://example.com', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/create-account-session.md b/app/sdks/php/docs/examples/account/create-account-session.md new file mode 100644 index 0000000000..daa9aefab6 --- /dev/null +++ b/app/sdks/php/docs/examples/account/create-account-session.md @@ -0,0 +1,13 @@ +createAccountSession('email@example.com', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/create-account-verification.md b/app/sdks/php/docs/examples/account/create-account-verification.md new file mode 100644 index 0000000000..a7cbb8da35 --- /dev/null +++ b/app/sdks/php/docs/examples/account/create-account-verification.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->createAccountVerification('https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/create-account.md b/app/sdks/php/docs/examples/account/create-account.md new file mode 100644 index 0000000000..d6425fc205 --- /dev/null +++ b/app/sdks/php/docs/examples/account/create-account.md @@ -0,0 +1,13 @@ +createAccount('email@example.com', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/delete-account-current-session.md b/app/sdks/php/docs/examples/account/delete-account-current-session.md new file mode 100644 index 0000000000..85f7d27622 --- /dev/null +++ b/app/sdks/php/docs/examples/account/delete-account-current-session.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->deleteAccountCurrentSession(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/delete-account-session.md b/app/sdks/php/docs/examples/account/delete-account-session.md new file mode 100644 index 0000000000..b7581763c9 --- /dev/null +++ b/app/sdks/php/docs/examples/account/delete-account-session.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->deleteAccountSession('[ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/delete-account-sessions.md b/app/sdks/php/docs/examples/account/delete-account-sessions.md new file mode 100644 index 0000000000..45799e649c --- /dev/null +++ b/app/sdks/php/docs/examples/account/delete-account-sessions.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->deleteAccountSessions(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/delete.md b/app/sdks/php/docs/examples/account/delete.md index 4aeb1f0096..2e3b5553a5 100644 --- a/app/sdks/php/docs/examples/account/delete.md +++ b/app/sdks/php/docs/examples/account/delete.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $account = new Account($client); diff --git a/app/sdks/php/docs/examples/account/get-account-logs.md b/app/sdks/php/docs/examples/account/get-account-logs.md new file mode 100644 index 0000000000..48809b17cb --- /dev/null +++ b/app/sdks/php/docs/examples/account/get-account-logs.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->getAccountLogs(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-account-prefs.md b/app/sdks/php/docs/examples/account/get-account-prefs.md new file mode 100644 index 0000000000..f480df1927 --- /dev/null +++ b/app/sdks/php/docs/examples/account/get-account-prefs.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->getAccountPrefs(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-account-sessions.md b/app/sdks/php/docs/examples/account/get-account-sessions.md new file mode 100644 index 0000000000..60b8cdc97c --- /dev/null +++ b/app/sdks/php/docs/examples/account/get-account-sessions.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->getAccountSessions(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-account.md b/app/sdks/php/docs/examples/account/get-account.md new file mode 100644 index 0000000000..14226f7014 --- /dev/null +++ b/app/sdks/php/docs/examples/account/get-account.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->getAccount(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-account-name.md b/app/sdks/php/docs/examples/account/update-account-name.md new file mode 100644 index 0000000000..a8701822ce --- /dev/null +++ b/app/sdks/php/docs/examples/account/update-account-name.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->updateAccountName('[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-account-password.md b/app/sdks/php/docs/examples/account/update-account-password.md new file mode 100644 index 0000000000..5a6135fea2 --- /dev/null +++ b/app/sdks/php/docs/examples/account/update-account-password.md @@ -0,0 +1,14 @@ +setProject('') +; + +$account = new Account($client); + +$result = $account->updateAccountPassword('password', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-account-recovery.md b/app/sdks/php/docs/examples/account/update-account-recovery.md new file mode 100644 index 0000000000..dcd8dda921 --- /dev/null +++ b/app/sdks/php/docs/examples/account/update-account-recovery.md @@ -0,0 +1,13 @@ +updateAccountRecovery('[USER_ID]', '[SECRET]', 'password', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-account-verification.md b/app/sdks/php/docs/examples/account/update-account-verification.md new file mode 100644 index 0000000000..1a2a788984 --- /dev/null +++ b/app/sdks/php/docs/examples/account/update-account-verification.md @@ -0,0 +1,13 @@ +updateAccountVerification('[USER_ID]', '[SECRET]', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-email.md b/app/sdks/php/docs/examples/account/update-email.md index 66cb6dff4a..3e2ed0f62b 100644 --- a/app/sdks/php/docs/examples/account/update-email.md +++ b/app/sdks/php/docs/examples/account/update-email.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $account = new Account($client); diff --git a/app/sdks/php/docs/examples/account/update-prefs.md b/app/sdks/php/docs/examples/account/update-prefs.md index df73bac861..66f70fa643 100644 --- a/app/sdks/php/docs/examples/account/update-prefs.md +++ b/app/sdks/php/docs/examples/account/update-prefs.md @@ -7,9 +7,8 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $account = new Account($client); -$result = $account->updatePrefs('{}'); \ No newline at end of file +$result = $account->updatePrefs(''); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/avatars/get-browser.md b/app/sdks/php/docs/examples/avatars/get-browser.md index c9a6a6b6c0..464ca10e9d 100644 --- a/app/sdks/php/docs/examples/avatars/get-browser.md +++ b/app/sdks/php/docs/examples/avatars/get-browser.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-credit-card.md b/app/sdks/php/docs/examples/avatars/get-credit-card.md index 206b0cc8c8..88fa1299b9 100644 --- a/app/sdks/php/docs/examples/avatars/get-credit-card.md +++ b/app/sdks/php/docs/examples/avatars/get-credit-card.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-favicon.md b/app/sdks/php/docs/examples/avatars/get-favicon.md index 01f28add89..982408e5e2 100644 --- a/app/sdks/php/docs/examples/avatars/get-favicon.md +++ b/app/sdks/php/docs/examples/avatars/get-favicon.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-flag.md b/app/sdks/php/docs/examples/avatars/get-flag.md index 26740446cd..9a254b5907 100644 --- a/app/sdks/php/docs/examples/avatars/get-flag.md +++ b/app/sdks/php/docs/examples/avatars/get-flag.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-image.md b/app/sdks/php/docs/examples/avatars/get-image.md index bbbe68d2d0..a3810f2dde 100644 --- a/app/sdks/php/docs/examples/avatars/get-image.md +++ b/app/sdks/php/docs/examples/avatars/get-image.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-q-r.md b/app/sdks/php/docs/examples/avatars/get-q-r.md index e10ec33d59..ebb4a9dc15 100644 --- a/app/sdks/php/docs/examples/avatars/get-q-r.md +++ b/app/sdks/php/docs/examples/avatars/get-q-r.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/database/create-collection.md b/app/sdks/php/docs/examples/database/create-collection.md index 183d906905..8be0238d10 100644 --- a/app/sdks/php/docs/examples/database/create-collection.md +++ b/app/sdks/php/docs/examples/database/create-collection.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/create-document.md b/app/sdks/php/docs/examples/database/create-document.md index 84c4d7fd06..aff513cf42 100644 --- a/app/sdks/php/docs/examples/database/create-document.md +++ b/app/sdks/php/docs/examples/database/create-document.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/delete-collection.md b/app/sdks/php/docs/examples/database/delete-collection.md index 2319d52c57..35594a5d95 100644 --- a/app/sdks/php/docs/examples/database/delete-collection.md +++ b/app/sdks/php/docs/examples/database/delete-collection.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/delete-document.md b/app/sdks/php/docs/examples/database/delete-document.md index b364e0bcd5..4193c27d3f 100644 --- a/app/sdks/php/docs/examples/database/delete-document.md +++ b/app/sdks/php/docs/examples/database/delete-document.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/get-collection.md b/app/sdks/php/docs/examples/database/get-collection.md index 9daa61ddfc..3e967c5829 100644 --- a/app/sdks/php/docs/examples/database/get-collection.md +++ b/app/sdks/php/docs/examples/database/get-collection.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/get-document.md b/app/sdks/php/docs/examples/database/get-document.md index da72bd8f1b..9644378337 100644 --- a/app/sdks/php/docs/examples/database/get-document.md +++ b/app/sdks/php/docs/examples/database/get-document.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/list-collections.md b/app/sdks/php/docs/examples/database/list-collections.md index c46daa2cda..b522cfc989 100644 --- a/app/sdks/php/docs/examples/database/list-collections.md +++ b/app/sdks/php/docs/examples/database/list-collections.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/list-documents.md b/app/sdks/php/docs/examples/database/list-documents.md index 973f9c477e..21ea55d9da 100644 --- a/app/sdks/php/docs/examples/database/list-documents.md +++ b/app/sdks/php/docs/examples/database/list-documents.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/update-collection.md b/app/sdks/php/docs/examples/database/update-collection.md index 2576449e5c..f6ea3a8593 100644 --- a/app/sdks/php/docs/examples/database/update-collection.md +++ b/app/sdks/php/docs/examples/database/update-collection.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/update-document.md b/app/sdks/php/docs/examples/database/update-document.md index 2051d09772..eff2b554e6 100644 --- a/app/sdks/php/docs/examples/database/update-document.md +++ b/app/sdks/php/docs/examples/database/update-document.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/locale/get-continents.md b/app/sdks/php/docs/examples/locale/get-continents.md index 22b1528c0a..96c8b219cd 100644 --- a/app/sdks/php/docs/examples/locale/get-continents.md +++ b/app/sdks/php/docs/examples/locale/get-continents.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-countries-e-u.md b/app/sdks/php/docs/examples/locale/get-countries-e-u.md index 9f0f1973cc..7c3fd4d285 100644 --- a/app/sdks/php/docs/examples/locale/get-countries-e-u.md +++ b/app/sdks/php/docs/examples/locale/get-countries-e-u.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-countries-phones.md b/app/sdks/php/docs/examples/locale/get-countries-phones.md index 2478c7c730..73726aab03 100644 --- a/app/sdks/php/docs/examples/locale/get-countries-phones.md +++ b/app/sdks/php/docs/examples/locale/get-countries-phones.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-countries.md b/app/sdks/php/docs/examples/locale/get-countries.md index 111dc52777..0433724631 100644 --- a/app/sdks/php/docs/examples/locale/get-countries.md +++ b/app/sdks/php/docs/examples/locale/get-countries.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-currencies.md b/app/sdks/php/docs/examples/locale/get-currencies.md index e01d5fd623..f8f3c77d3a 100644 --- a/app/sdks/php/docs/examples/locale/get-currencies.md +++ b/app/sdks/php/docs/examples/locale/get-currencies.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-locale.md b/app/sdks/php/docs/examples/locale/get-locale.md index ac56f068de..edec17a38f 100644 --- a/app/sdks/php/docs/examples/locale/get-locale.md +++ b/app/sdks/php/docs/examples/locale/get-locale.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/projects/create-key.md b/app/sdks/php/docs/examples/projects/create-key.md index b732c540ab..5eb7f27687 100644 --- a/app/sdks/php/docs/examples/projects/create-key.md +++ b/app/sdks/php/docs/examples/projects/create-key.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/create-platform.md b/app/sdks/php/docs/examples/projects/create-platform.md index 4f5f6a3355..cde5eddad8 100644 --- a/app/sdks/php/docs/examples/projects/create-platform.md +++ b/app/sdks/php/docs/examples/projects/create-platform.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/create-project.md b/app/sdks/php/docs/examples/projects/create-project.md index c7a36650af..edb6bb6ab0 100644 --- a/app/sdks/php/docs/examples/projects/create-project.md +++ b/app/sdks/php/docs/examples/projects/create-project.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/create-task.md b/app/sdks/php/docs/examples/projects/create-task.md index fab9e27653..aaa12d98cc 100644 --- a/app/sdks/php/docs/examples/projects/create-task.md +++ b/app/sdks/php/docs/examples/projects/create-task.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/create-webhook.md b/app/sdks/php/docs/examples/projects/create-webhook.md index 6eacda1fc0..5721c423a2 100644 --- a/app/sdks/php/docs/examples/projects/create-webhook.md +++ b/app/sdks/php/docs/examples/projects/create-webhook.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/delete-key.md b/app/sdks/php/docs/examples/projects/delete-key.md index 4af28f9929..da74fa05c8 100644 --- a/app/sdks/php/docs/examples/projects/delete-key.md +++ b/app/sdks/php/docs/examples/projects/delete-key.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/delete-platform.md b/app/sdks/php/docs/examples/projects/delete-platform.md index cab8785a49..c21a7bb93c 100644 --- a/app/sdks/php/docs/examples/projects/delete-platform.md +++ b/app/sdks/php/docs/examples/projects/delete-platform.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/delete-project.md b/app/sdks/php/docs/examples/projects/delete-project.md index d02ceb6e2b..10158026d8 100644 --- a/app/sdks/php/docs/examples/projects/delete-project.md +++ b/app/sdks/php/docs/examples/projects/delete-project.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/delete-task.md b/app/sdks/php/docs/examples/projects/delete-task.md index 0e8632cf3f..1e62f3401a 100644 --- a/app/sdks/php/docs/examples/projects/delete-task.md +++ b/app/sdks/php/docs/examples/projects/delete-task.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/delete-webhook.md b/app/sdks/php/docs/examples/projects/delete-webhook.md index fff5956e0c..7ec160d048 100644 --- a/app/sdks/php/docs/examples/projects/delete-webhook.md +++ b/app/sdks/php/docs/examples/projects/delete-webhook.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/get-key.md b/app/sdks/php/docs/examples/projects/get-key.md index 4863bc23d4..d5b5ed742f 100644 --- a/app/sdks/php/docs/examples/projects/get-key.md +++ b/app/sdks/php/docs/examples/projects/get-key.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/get-platform.md b/app/sdks/php/docs/examples/projects/get-platform.md index 94f23656f5..13777df0f4 100644 --- a/app/sdks/php/docs/examples/projects/get-platform.md +++ b/app/sdks/php/docs/examples/projects/get-platform.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/get-project-usage.md b/app/sdks/php/docs/examples/projects/get-project-usage.md index 495ba2fe9f..f4ebfa5d2e 100644 --- a/app/sdks/php/docs/examples/projects/get-project-usage.md +++ b/app/sdks/php/docs/examples/projects/get-project-usage.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/get-project.md b/app/sdks/php/docs/examples/projects/get-project.md index b64f8a0e26..f3bbd65043 100644 --- a/app/sdks/php/docs/examples/projects/get-project.md +++ b/app/sdks/php/docs/examples/projects/get-project.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/get-task.md b/app/sdks/php/docs/examples/projects/get-task.md index 598bba69e5..3ca455c2bc 100644 --- a/app/sdks/php/docs/examples/projects/get-task.md +++ b/app/sdks/php/docs/examples/projects/get-task.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/get-webhook.md b/app/sdks/php/docs/examples/projects/get-webhook.md index c765dfb108..bfde5a94e3 100644 --- a/app/sdks/php/docs/examples/projects/get-webhook.md +++ b/app/sdks/php/docs/examples/projects/get-webhook.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/list-keys.md b/app/sdks/php/docs/examples/projects/list-keys.md index 69db3fda45..ec00ca41ad 100644 --- a/app/sdks/php/docs/examples/projects/list-keys.md +++ b/app/sdks/php/docs/examples/projects/list-keys.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/list-platforms.md b/app/sdks/php/docs/examples/projects/list-platforms.md index ae0155379e..c9272711e7 100644 --- a/app/sdks/php/docs/examples/projects/list-platforms.md +++ b/app/sdks/php/docs/examples/projects/list-platforms.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/list-projects.md b/app/sdks/php/docs/examples/projects/list-projects.md index 5e39729bc2..53b7047e57 100644 --- a/app/sdks/php/docs/examples/projects/list-projects.md +++ b/app/sdks/php/docs/examples/projects/list-projects.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/list-tasks.md b/app/sdks/php/docs/examples/projects/list-tasks.md index 7f0bc62a5b..175b580420 100644 --- a/app/sdks/php/docs/examples/projects/list-tasks.md +++ b/app/sdks/php/docs/examples/projects/list-tasks.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/list-webhooks.md b/app/sdks/php/docs/examples/projects/list-webhooks.md index 121698a240..299b9e3ecc 100644 --- a/app/sdks/php/docs/examples/projects/list-webhooks.md +++ b/app/sdks/php/docs/examples/projects/list-webhooks.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/update-key.md b/app/sdks/php/docs/examples/projects/update-key.md index 09aa0d2517..960761c01c 100644 --- a/app/sdks/php/docs/examples/projects/update-key.md +++ b/app/sdks/php/docs/examples/projects/update-key.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/update-platform.md b/app/sdks/php/docs/examples/projects/update-platform.md index e7c35dd232..0537dec85a 100644 --- a/app/sdks/php/docs/examples/projects/update-platform.md +++ b/app/sdks/php/docs/examples/projects/update-platform.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/update-project-o-auth.md b/app/sdks/php/docs/examples/projects/update-project-o-auth.md index cd0ef51f3a..283ecbddff 100644 --- a/app/sdks/php/docs/examples/projects/update-project-o-auth.md +++ b/app/sdks/php/docs/examples/projects/update-project-o-auth.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/update-project.md b/app/sdks/php/docs/examples/projects/update-project.md index 0d7997c16d..f878bc9119 100644 --- a/app/sdks/php/docs/examples/projects/update-project.md +++ b/app/sdks/php/docs/examples/projects/update-project.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/update-task.md b/app/sdks/php/docs/examples/projects/update-task.md index 59308c5d6d..95f64e6188 100644 --- a/app/sdks/php/docs/examples/projects/update-task.md +++ b/app/sdks/php/docs/examples/projects/update-task.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/projects/update-webhook.md b/app/sdks/php/docs/examples/projects/update-webhook.md index a7e42dcce2..d550c0c178 100644 --- a/app/sdks/php/docs/examples/projects/update-webhook.md +++ b/app/sdks/php/docs/examples/projects/update-webhook.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $projects = new Projects($client); diff --git a/app/sdks/php/docs/examples/storage/create-file.md b/app/sdks/php/docs/examples/storage/create-file.md index 225b9e2bec..1e8df67482 100644 --- a/app/sdks/php/docs/examples/storage/create-file.md +++ b/app/sdks/php/docs/examples/storage/create-file.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/delete-file.md b/app/sdks/php/docs/examples/storage/delete-file.md index 74448e5a7c..21755b6cfb 100644 --- a/app/sdks/php/docs/examples/storage/delete-file.md +++ b/app/sdks/php/docs/examples/storage/delete-file.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/get-file-download.md b/app/sdks/php/docs/examples/storage/get-file-download.md index 3a6db00081..545cf88bbf 100644 --- a/app/sdks/php/docs/examples/storage/get-file-download.md +++ b/app/sdks/php/docs/examples/storage/get-file-download.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/get-file-preview.md b/app/sdks/php/docs/examples/storage/get-file-preview.md index 8b02bdd2a9..6cfc61ffb0 100644 --- a/app/sdks/php/docs/examples/storage/get-file-preview.md +++ b/app/sdks/php/docs/examples/storage/get-file-preview.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/get-file-view.md b/app/sdks/php/docs/examples/storage/get-file-view.md index 59cc25bc74..438e18479c 100644 --- a/app/sdks/php/docs/examples/storage/get-file-view.md +++ b/app/sdks/php/docs/examples/storage/get-file-view.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/get-file.md b/app/sdks/php/docs/examples/storage/get-file.md index 63fa59b40a..ae442c8924 100644 --- a/app/sdks/php/docs/examples/storage/get-file.md +++ b/app/sdks/php/docs/examples/storage/get-file.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/list-files.md b/app/sdks/php/docs/examples/storage/list-files.md index 434e1fe70d..3384a3f6fd 100644 --- a/app/sdks/php/docs/examples/storage/list-files.md +++ b/app/sdks/php/docs/examples/storage/list-files.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/update-file.md b/app/sdks/php/docs/examples/storage/update-file.md index 637870a7a6..0a9a17f9eb 100644 --- a/app/sdks/php/docs/examples/storage/update-file.md +++ b/app/sdks/php/docs/examples/storage/update-file.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/teams/create-team-membership.md b/app/sdks/php/docs/examples/teams/create-team-membership.md index 12a47b6f15..f43d527a8c 100644 --- a/app/sdks/php/docs/examples/teams/create-team-membership.md +++ b/app/sdks/php/docs/examples/teams/create-team-membership.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/create-team.md b/app/sdks/php/docs/examples/teams/create-team.md index 11928b37cc..7f51f15152 100644 --- a/app/sdks/php/docs/examples/teams/create-team.md +++ b/app/sdks/php/docs/examples/teams/create-team.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/delete-team-membership.md b/app/sdks/php/docs/examples/teams/delete-team-membership.md index d53e1ed7ce..80e324d83b 100644 --- a/app/sdks/php/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/php/docs/examples/teams/delete-team-membership.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/delete-team.md b/app/sdks/php/docs/examples/teams/delete-team.md index 7fb04015be..4647a11e75 100644 --- a/app/sdks/php/docs/examples/teams/delete-team.md +++ b/app/sdks/php/docs/examples/teams/delete-team.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/get-team-memberships.md b/app/sdks/php/docs/examples/teams/get-team-memberships.md new file mode 100644 index 0000000000..10c19ab59c --- /dev/null +++ b/app/sdks/php/docs/examples/teams/get-team-memberships.md @@ -0,0 +1,14 @@ +setProject('') +; + +$teams = new Teams($client); + +$result = $teams->getTeamMemberships('[TEAM_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/get-team.md b/app/sdks/php/docs/examples/teams/get-team.md index e58a9d0dc2..e9307dc934 100644 --- a/app/sdks/php/docs/examples/teams/get-team.md +++ b/app/sdks/php/docs/examples/teams/get-team.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/list-teams.md b/app/sdks/php/docs/examples/teams/list-teams.md index 9b753c6d16..2b8d208c7e 100644 --- a/app/sdks/php/docs/examples/teams/list-teams.md +++ b/app/sdks/php/docs/examples/teams/list-teams.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/update-team-membership-status.md b/app/sdks/php/docs/examples/teams/update-team-membership-status.md index 19f14550e4..cd387f598e 100644 --- a/app/sdks/php/docs/examples/teams/update-team-membership-status.md +++ b/app/sdks/php/docs/examples/teams/update-team-membership-status.md @@ -6,8 +6,6 @@ use Appwrite\Services\Teams; $client = new Client(); $client - ->setProject('') - ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/update-team.md b/app/sdks/php/docs/examples/teams/update-team.md index a76fce3a83..1047fd8ce3 100644 --- a/app/sdks/php/docs/examples/teams/update-team.md +++ b/app/sdks/php/docs/examples/teams/update-team.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/users/create-user.md b/app/sdks/php/docs/examples/users/create-user.md index b25a479c89..e0db30a5f2 100644 --- a/app/sdks/php/docs/examples/users/create-user.md +++ b/app/sdks/php/docs/examples/users/create-user.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/delete-user-session.md b/app/sdks/php/docs/examples/users/delete-user-session.md index 28ad6dd165..40db227ec1 100644 --- a/app/sdks/php/docs/examples/users/delete-user-session.md +++ b/app/sdks/php/docs/examples/users/delete-user-session.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/delete-user-sessions.md b/app/sdks/php/docs/examples/users/delete-user-sessions.md index a83c648f69..346eff92b0 100644 --- a/app/sdks/php/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/php/docs/examples/users/delete-user-sessions.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/get-user-logs.md b/app/sdks/php/docs/examples/users/get-user-logs.md index bb9a70e975..926d83ac78 100644 --- a/app/sdks/php/docs/examples/users/get-user-logs.md +++ b/app/sdks/php/docs/examples/users/get-user-logs.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/get-user-prefs.md b/app/sdks/php/docs/examples/users/get-user-prefs.md index 949d206065..68b6c7c894 100644 --- a/app/sdks/php/docs/examples/users/get-user-prefs.md +++ b/app/sdks/php/docs/examples/users/get-user-prefs.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/get-user-sessions.md b/app/sdks/php/docs/examples/users/get-user-sessions.md index 9f29697960..2b7eb49666 100644 --- a/app/sdks/php/docs/examples/users/get-user-sessions.md +++ b/app/sdks/php/docs/examples/users/get-user-sessions.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/get-user.md b/app/sdks/php/docs/examples/users/get-user.md index bc776d4313..abf6c1f32c 100644 --- a/app/sdks/php/docs/examples/users/get-user.md +++ b/app/sdks/php/docs/examples/users/get-user.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/list-users.md b/app/sdks/php/docs/examples/users/list-users.md index d3824540fc..c5f8d92b35 100644 --- a/app/sdks/php/docs/examples/users/list-users.md +++ b/app/sdks/php/docs/examples/users/list-users.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/update-user-prefs.md b/app/sdks/php/docs/examples/users/update-user-prefs.md index 073df70bd3..a42aedb9fa 100644 --- a/app/sdks/php/docs/examples/users/update-user-prefs.md +++ b/app/sdks/php/docs/examples/users/update-user-prefs.md @@ -7,9 +7,8 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); -$result = $users->updateUserPrefs('[USER_ID]', '{}'); \ No newline at end of file +$result = $users->updateUserPrefs('[USER_ID]', ''); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/update-user-status.md b/app/sdks/php/docs/examples/users/update-user-status.md index 918d827962..7cc61dd05b 100644 --- a/app/sdks/php/docs/examples/users/update-user-status.md +++ b/app/sdks/php/docs/examples/users/update-user-status.md @@ -7,7 +7,6 @@ $client = new Client(); $client ->setProject('') - ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/locale.md b/app/sdks/php/docs/locale.md index 81190fa96c..604d4f37fb 100644 --- a/app/sdks/php/docs/locale.md +++ b/app/sdks/php/docs/locale.md @@ -6,7 +6,9 @@ GET https://appwrite.io/v1/locale ``` -** Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language. ** +** Get the current user location based on IP. Returns an object with user country code, country name, continent name, continent code, ip address and suggested currency. You can use the locale header to get the data in a supported language. + +([IP Geolocation by DB-IP](https://db-ip.com)) ** ## List Countries @@ -30,7 +32,7 @@ GET https://appwrite.io/v1/locale/countries GET https://appwrite.io/v1/locale/countries/eu ``` -** List of all countries that are currently members of the EU. You can use the locale header to get the data in a supported language. UK brexit date is currently set to 2019-10-31 and will be updated if and when needed. ** +** List of all countries that are currently members of the EU. You can use the locale header to get the data in a supported language. ** ## List Countries Phone Codes diff --git a/app/sdks/php/docs/storage.md b/app/sdks/php/docs/storage.md index f7eca89305..cb13a9968b 100644 --- a/app/sdks/php/docs/storage.md +++ b/app/sdks/php/docs/storage.md @@ -29,7 +29,7 @@ POST https://appwrite.io/v1/storage/files | Field Name | Type | Description | Default | | --- | --- | --- | --- | -| files | file | Binary Files. | | +| file | file | Binary Files. | | | read | array | 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. | | | write | array | 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. | | @@ -97,7 +97,7 @@ GET https://appwrite.io/v1/storage/files/{fileId}/download GET https://appwrite.io/v1/storage/files/{fileId}/preview ``` -** Get file preview image. Currently, this method supports preview for image files (jpg, png, and gif), other supported formats, like pdf, docs, slides, and spreadsheets will return file icon image. You can also pass query string arguments for cutting and resizing your preview image. ** +** Get a file preview image. Currently, this method supports preview for image files (jpg, png, and gif), other supported formats, like pdf, docs, slides, and spreadsheets, will return the file icon image. You can also pass query string arguments for cutting and resizing your preview image. ** ### Parameters diff --git a/app/sdks/php/docs/teams.md b/app/sdks/php/docs/teams.md index 109c1e7280..dfd4ae91d4 100644 --- a/app/sdks/php/docs/teams.md +++ b/app/sdks/php/docs/teams.md @@ -75,10 +75,10 @@ DELETE https://appwrite.io/v1/teams/{teamId} | --- | --- | --- | --- | | teamId | string | **Required** Team unique ID. | | -## Get Team Members +## Get Team Memberships ```http request -GET https://appwrite.io/v1/teams/{teamId}/members +GET https://appwrite.io/v1/teams/{teamId}/memberships ``` ** Get team members by the team unique ID. All team members have read access for this list of resources. ** @@ -97,9 +97,9 @@ POST https://appwrite.io/v1/teams/{teamId}/memberships ** Use this endpoint to invite a new member to your team. An email with a link to join the team will be sent to the new member email address. If member doesn't exists in the project it will be automatically created. -Use the redirect parameter to redirect the user from the invitation email back to your app. When the user is redirected, use the /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the user to the team. +Use the 'url' parameter to redirect the user from the invitation email back to your app. When the user is redirected, use the [Update Team Membership Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join the user to the team. -Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. ** +Please note that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. ** ### Parameters @@ -109,7 +109,7 @@ Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWA | email | string | New team member email address. | | | name | string | New team member name. | | | roles | array | Invite roles array. Learn more about [roles and permissions](/docs/permissions). | | -| redirect | string | Reset page to redirect user back to your app from the invitation email. | | +| url | string | URL to redirect the user back to your app from the invitation email. | | ## Delete Team Membership @@ -117,7 +117,7 @@ Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWA DELETE https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId} ``` -** This endpoint allows a user to leave a team or for a team owner to delete the membership of any other team member. ** +** This endpoint allows a user to leave a team or for a team owner to delete the membership of any other team member. You can also use this endpoint to delete a user membership even if he didn't accept it. ** ### Parameters @@ -126,22 +126,6 @@ DELETE https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId} | teamId | string | **Required** Team unique ID. | | | inviteId | string | **Required** Invite unique ID | | -## Create Team Membership (Resend) - -```http request -POST https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId}/resend -``` - -** Use this endpoint to resend your invitation email for a user to join a team. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| teamId | string | **Required** Team unique ID. | | -| inviteId | string | **Required** Invite unique ID. | | -| redirect | string | Reset page to redirect user back to your app from the invitation email. | | - ## Update Team Membership Status ```http request @@ -150,7 +134,7 @@ PATCH https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId}/status ** Use this endpoint to let user accept an invitation to join a team after he is being redirect back to your app from the invitation email. Use the success and failure URL's to redirect users back to your application after the request completes. -Please notice that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. +Please note that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. When not using the success or failure redirect arguments this endpoint will result with a 200 status code on success and with 401 status error on failure. This behavior was applied to help the web clients deal with browsers who don't allow to set 3rd party HTTP cookies needed for saving the account session token. ** @@ -162,6 +146,4 @@ When not using the success or failure redirect arguments this endpoint will resu | inviteId | string | **Required** Invite unique ID | | | userId | string | User unique ID | | | secret | string | Secret Key | | -| success | string | Redirect when registration succeed | | -| failure | string | Redirect when registration failed | | diff --git a/app/sdks/php/docs/users.md b/app/sdks/php/docs/users.md index fedcd71d54..c1056933d3 100644 --- a/app/sdks/php/docs/users.md +++ b/app/sdks/php/docs/users.md @@ -61,7 +61,7 @@ GET https://appwrite.io/v1/users/{userId}/logs | --- | --- | --- | --- | | userId | string | **Required** User unique ID. | | -## Get User Prefs +## Get User Preferences ```http request GET https://appwrite.io/v1/users/{userId}/prefs @@ -75,7 +75,7 @@ GET https://appwrite.io/v1/users/{userId}/prefs | --- | --- | --- | --- | | userId | string | **Required** User unique ID. | | -## Update User Prefs +## Update User Preferences ```http request PATCH https://appwrite.io/v1/users/{userId}/prefs @@ -88,7 +88,7 @@ PATCH https://appwrite.io/v1/users/{userId}/prefs | Field Name | Type | Description | Default | | --- | --- | --- | --- | | userId | string | **Required** User unique ID. | | -| prefs | string | Prefs key-value JSON object string. | | +| prefs | string | Prefs key-value JSON object. | | ## Get User Sessions diff --git a/app/sdks/php/src/Appwrite/Client.php b/app/sdks/php/src/Appwrite/Client.php index 360a6d614f..5db33c303f 100644 --- a/app/sdks/php/src/Appwrite/Client.php +++ b/app/sdks/php/src/Appwrite/Client.php @@ -185,6 +185,7 @@ class Client curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_USERAGENT, php_uname('s') . '-' . php_uname('r') . ':php-' . phpversion()); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$responseHeaders) { $len = strlen($header); $header = explode(':', strtolower($header), 2); diff --git a/app/sdks/php/src/Appwrite/Services/Account.php b/app/sdks/php/src/Appwrite/Services/Account.php index d56ea4c941..871ff73c0c 100644 --- a/app/sdks/php/src/Appwrite/Services/Account.php +++ b/app/sdks/php/src/Appwrite/Services/Account.php @@ -16,7 +16,7 @@ class Account extends Service * @throws Exception * @return array */ - public function get():array + public function getAccount():array { $path = str_replace([], [], '/account'); $params = []; @@ -27,6 +27,50 @@ class Account extends Service ], $params); } + /** + * Create Account + * + * Use this endpoint to allow a new user to register an account in your + * project. Use the success and failure URLs to redirect users back to your + * application after signup completes. + * + * If registration completes successfully user will be sent with a + * confirmation email in order to confirm he is the owner of the account email + * address. Use the confirmation parameter to redirect the user from the + * confirmation email back to your app. When the user is redirected, use the + * /auth/confirm endpoint to complete the account confirmation. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * When accessing this route using Javascript from the browser, success and + * failure parameter URLs are required. Appwrite server will respond with a + * 301 redirect status code and will set the user session cookie. This + * behavior is enforced because modern browsers are limiting 3rd party cookies + * in XHR of fetch requests to protect user privacy. + * + * @param string $email + * @param string $password + * @param string $name + * @throws Exception + * @return array + */ + public function createAccount(string $email, string $password, string $name = ''):array + { + $path = str_replace([], [], '/account'); + $params = []; + + $params['email'] = $email; + $params['password'] = $password; + $params['name'] = $name; + + return $this->client->call(Client::METHOD_POST, $path, [ + 'content-type' => 'application/json', + ], $params); + } + /** * Delete Account * @@ -76,6 +120,26 @@ class Account extends Service ], $params); } + /** + * Get Account Logs + * + * Get currently logged in user list of latest security activity logs. Each + * log returns user IP address, location and date and time of log. + * + * @throws Exception + * @return array + */ + public function getAccountLogs():array + { + $path = str_replace([], [], '/account/logs'); + $params = []; + + + return $this->client->call(Client::METHOD_GET, $path, [ + 'content-type' => 'application/json', + ], $params); + } + /** * Update Account Name * @@ -85,7 +149,7 @@ class Account extends Service * @throws Exception * @return array */ - public function updateName(string $name):array + public function updateAccountName(string $name):array { $path = str_replace([], [], '/account/name'); $params = []; @@ -108,7 +172,7 @@ class Account extends Service * @throws Exception * @return array */ - public function updatePassword(string $password, string $oldPassword):array + public function updateAccountPassword(string $password, string $oldPassword):array { $path = str_replace([], [], '/account/password'); $params = []; @@ -129,7 +193,7 @@ class Account extends Service * @throws Exception * @return array */ - public function getPrefs():array + public function getAccountPrefs():array { $path = str_replace([], [], '/account/prefs'); $params = []; @@ -141,7 +205,7 @@ class Account extends Service } /** - * Update Account Prefs + * Update Account Preferences * * Update currently logged in user account preferences. You can pass only the * specific settings you wish to update. @@ -163,27 +227,70 @@ class Account extends Service } /** - * Get Account Security Log + * Password Recovery * - * Get currently logged in user list of latest security activity logs. Each - * log returns user IP address, location and date and time of log. + * Sends the user an email with a temporary secret token for password reset. + * When the user clicks the confirmation link he is redirected back to your + * app password reset redirect URL with a secret token and email address + * values attached to the URL query string. Use the query string params to + * submit a request to the /auth/password/reset endpoint to complete the + * process. * + * @param string $email + * @param string $url * @throws Exception * @return array */ - public function getSecurity():array + public function createAccountRecovery(string $email, string $url):array { - $path = str_replace([], [], '/account/security'); + $path = str_replace([], [], '/account/recovery'); $params = []; + $params['email'] = $email; + $params['url'] = $url; - return $this->client->call(Client::METHOD_GET, $path, [ + return $this->client->call(Client::METHOD_POST, $path, [ 'content-type' => 'application/json', ], $params); } /** - * Get Account Active Sessions + * Password Reset + * + * Use this endpoint to complete the user account password reset. Both the + * **userId** and **token** arguments will be passed as query parameters to + * the redirect URL you have provided when sending your request to the + * /auth/recovery endpoint. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * @param string $userId + * @param string $secret + * @param string $passwordA + * @param string $passwordB + * @throws Exception + * @return array + */ + public function updateAccountRecovery(string $userId, string $secret, string $passwordA, string $passwordB):array + { + $path = str_replace([], [], '/account/recovery'); + $params = []; + + $params['userId'] = $userId; + $params['secret'] = $secret; + $params['password-a'] = $passwordA; + $params['password-b'] = $passwordB; + + return $this->client->call(Client::METHOD_PUT, $path, [ + 'content-type' => 'application/json', + ], $params); + } + + /** + * Get Account Sessions * * Get currently logged in user list of active sessions across different * devices. @@ -191,7 +298,7 @@ class Account extends Service * @throws Exception * @return array */ - public function getSessions():array + public function getAccountSessions():array { $path = str_replace([], [], '/account/sessions'); $params = []; @@ -202,4 +309,191 @@ class Account extends Service ], $params); } + /** + * Create Account Session + * + * Allow the user to login into his account by providing a valid email and + * password combination. Use the success and failure arguments to provide a + * redirect URL's back to your app when login is completed. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * When accessing this route using Javascript from the browser, success and + * failure parameter URLs are required. Appwrite server will respond with a + * 301 redirect status code and will set the user session cookie. This + * behavior is enforced because modern browsers are limiting 3rd party cookies + * in XHR of fetch requests to protect user privacy. + * + * @param string $email + * @param string $password + * @throws Exception + * @return array + */ + public function createAccountSession(string $email, string $password):array + { + $path = str_replace([], [], '/account/sessions'); + $params = []; + + $params['email'] = $email; + $params['password'] = $password; + + return $this->client->call(Client::METHOD_POST, $path, [ + 'content-type' => 'application/json', + ], $params); + } + + /** + * Delete All Account Sessions + * + * Delete all sessions from the user account and remove any sessions cookies + * from the end client. + * + * @throws Exception + * @return array + */ + public function deleteAccountSessions():array + { + $path = str_replace([], [], '/account/sessions'); + $params = []; + + + return $this->client->call(Client::METHOD_DELETE, $path, [ + 'content-type' => 'application/json', + ], $params); + } + + /** + * Delete Current Account Session + * + * Use this endpoint to log out the currently logged in user from his account. + * When successful this endpoint will delete the user session and remove the + * session secret cookie from the user client. + * + * @throws Exception + * @return array + */ + public function deleteAccountCurrentSession():array + { + $path = str_replace([], [], '/account/sessions/current'); + $params = []; + + + return $this->client->call(Client::METHOD_DELETE, $path, [ + 'content-type' => 'application/json', + ], $params); + } + + /** + * Create Account Session with OAuth + * + * Allow the user to login to his account using the OAuth provider of his + * choice. Each OAuth provider should be enabled from the Appwrite console + * first. Use the success and failure arguments to provide a redirect URL's + * back to your app when login is completed. + * + * @param string $provider + * @param string $success + * @param string $failure + * @throws Exception + * @return array + */ + public function createAccountSessionOAuth(string $provider, string $success, string $failure):array + { + $path = str_replace(['{provider}'], [$provider], '/account/sessions/oauth/{provider}'); + $params = []; + + $params['success'] = $success; + $params['failure'] = $failure; + + return $this->client->call(Client::METHOD_GET, $path, [ + 'content-type' => 'application/json', + ], $params); + } + + /** + * Delete Account Session + * + * Use this endpoint to log out the currently logged in user from all his + * account sessions across all his different devices. When using the option id + * argument, only the session unique ID provider will be deleted. + * + * @param string $id + * @throws Exception + * @return array + */ + public function deleteAccountSession(string $id):array + { + $path = str_replace(['{id}'], [$id], '/account/sessions/{id}'); + $params = []; + + + return $this->client->call(Client::METHOD_DELETE, $path, [ + 'content-type' => 'application/json', + ], $params); + } + + /** + * Create Verification + * + * Use this endpoint to send a verification message to your user email address + * to confirm they are the valid owners of that address. Both the **userId** + * and **token** arguments will be passed as query parameters to the URL you + * have provider to be attached to the verification email. The provided URL + * should redirect the user back for your app and allow you to complete the + * verification process by verifying both the **userId** and **token** + * parameters. Learn more about how to [complete the verification + * process](/docs/account#updateAccountVerification). + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * @param string $url + * @throws Exception + * @return array + */ + public function createAccountVerification(string $url):array + { + $path = str_replace([], [], '/account/verification'); + $params = []; + + $params['url'] = $url; + + return $this->client->call(Client::METHOD_POST, $path, [ + 'content-type' => 'application/json', + ], $params); + } + + /** + * Updated Verification + * + * Use this endpoint to complete the user email verification process. Use both + * the **userId** and **token** parameters that were attached to your app URL + * to verify the user email ownership. If confirmed this route will return a + * 200 status code. + * + * @param string $userId + * @param string $secret + * @param string $passwordB + * @throws Exception + * @return array + */ + public function updateAccountVerification(string $userId, string $secret, string $passwordB):array + { + $path = str_replace([], [], '/account/verification'); + $params = []; + + $params['userId'] = $userId; + $params['secret'] = $secret; + $params['password-b'] = $passwordB; + + return $this->client->call(Client::METHOD_PUT, $path, [ + 'content-type' => 'application/json', + ], $params); + } + } \ No newline at end of file diff --git a/app/sdks/php/src/Appwrite/Services/Locale.php b/app/sdks/php/src/Appwrite/Services/Locale.php index fafeabc7fd..5304f91924 100644 --- a/app/sdks/php/src/Appwrite/Services/Locale.php +++ b/app/sdks/php/src/Appwrite/Services/Locale.php @@ -15,6 +15,8 @@ class Locale extends Service * country code, country name, continent name, continent code, ip address and * suggested currency. You can use the locale header to get the data in a * supported language. + * + * ([IP Geolocation by DB-IP](https://db-ip.com)) * * @throws Exception * @return array @@ -74,8 +76,7 @@ class Locale extends Service * List EU Countries * * List of all countries that are currently members of the EU. You can use the - * locale header to get the data in a supported language. UK brexit date is - * currently set to 2019-10-31 and will be updated if and when needed. + * locale header to get the data in a supported language. * * @throws Exception * @return array diff --git a/app/sdks/php/src/Appwrite/Services/Storage.php b/app/sdks/php/src/Appwrite/Services/Storage.php index 37b0117d60..09b74fbf8f 100644 --- a/app/sdks/php/src/Appwrite/Services/Storage.php +++ b/app/sdks/php/src/Appwrite/Services/Storage.php @@ -44,18 +44,18 @@ class Storage extends Service * assigned to read and write access unless he has passed custom values for * read and write arguments. * - * @param \CurlFile $files + * @param \CurlFile $file * @param array $read * @param array $write * @throws Exception * @return array */ - public function createFile(\CurlFile $files, array $read, array $write):array + public function createFile(\CurlFile $file, array $read, array $write):array { $path = str_replace([], [], '/storage/files'); $params = []; - $params['files'] = $files; + $params['file'] = $file; $params['read'] = $read; $params['write'] = $write; @@ -156,9 +156,9 @@ class Storage extends Service /** * Get File Preview * - * Get file preview image. Currently, this method supports preview for image + * Get a file preview image. Currently, this method supports preview for image * files (jpg, png, and gif), other supported formats, like pdf, docs, slides, - * and spreadsheets will return file icon image. You can also pass query + * and spreadsheets, will return the file icon image. You can also pass query * string arguments for cutting and resizing your preview image. * * @param string $fileId diff --git a/app/sdks/php/src/Appwrite/Services/Teams.php b/app/sdks/php/src/Appwrite/Services/Teams.php index 4109aef893..fffee9877b 100644 --- a/app/sdks/php/src/Appwrite/Services/Teams.php +++ b/app/sdks/php/src/Appwrite/Services/Teams.php @@ -129,7 +129,7 @@ class Teams extends Service } /** - * Get Team Members + * Get Team Memberships * * Get team members by the team unique ID. All team members have read access * for this list of resources. @@ -138,9 +138,9 @@ class Teams extends Service * @throws Exception * @return array */ - public function getTeamMembers(string $teamId):array + public function getTeamMemberships(string $teamId):array { - $path = str_replace(['{teamId}'], [$teamId], '/teams/{teamId}/members'); + $path = str_replace(['{teamId}'], [$teamId], '/teams/{teamId}/memberships'); $params = []; @@ -156,12 +156,12 @@ class Teams extends Service * to join the team will be sent to the new member email address. If member * doesn't exists in the project it will be automatically created. * - * Use the redirect parameter to redirect the user from the invitation email - * back to your app. When the user is redirected, use the - * /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the - * user to the team. + * Use the 'url' parameter to redirect the user from the invitation email back + * to your app. When the user is redirected, use the [Update Team Membership + * Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join + * the user to the team. * - * Please notice that in order to avoid a [Redirect + * Please note that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. @@ -169,12 +169,12 @@ class Teams extends Service * @param string $teamId * @param string $email * @param array $roles - * @param string $redirect + * @param string $url * @param string $name * @throws Exception * @return array */ - public function createTeamMembership(string $teamId, string $email, array $roles, string $redirect, string $name = ''):array + public function createTeamMembership(string $teamId, string $email, array $roles, string $url, string $name = ''):array { $path = str_replace(['{teamId}'], [$teamId], '/teams/{teamId}/memberships'); $params = []; @@ -182,7 +182,7 @@ class Teams extends Service $params['email'] = $email; $params['name'] = $name; $params['roles'] = $roles; - $params['redirect'] = $redirect; + $params['url'] = $url; return $this->client->call(Client::METHOD_POST, $path, [ 'content-type' => 'application/json', @@ -193,7 +193,8 @@ class Teams extends Service * Delete Team Membership * * This endpoint allows a user to leave a team or for a team owner to delete - * the membership of any other team member. + * the membership of any other team member. You can also use this endpoint to + * delete a user membership even if he didn't accept it. * * @param string $teamId * @param string $inviteId @@ -211,30 +212,6 @@ class Teams extends Service ], $params); } - /** - * Create Team Membership (Resend) - * - * Use this endpoint to resend your invitation email for a user to join a - * team. - * - * @param string $teamId - * @param string $inviteId - * @param string $redirect - * @throws Exception - * @return array - */ - public function createTeamMembershipResend(string $teamId, string $inviteId, string $redirect):array - { - $path = str_replace(['{teamId}', '{inviteId}'], [$teamId, $inviteId], '/teams/{teamId}/memberships/{inviteId}/resend'); - $params = []; - - $params['redirect'] = $redirect; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - /** * Update Team Membership Status * @@ -243,7 +220,7 @@ class Teams extends Service * success and failure URL's to redirect users back to your application after * the request completes. * - * Please notice that in order to avoid a [Redirect + * Please note that in order to avoid a [Redirect * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) * the only valid redirect URL's are the once from domains you have set when * added your platforms in the console interface. @@ -258,20 +235,16 @@ class Teams extends Service * @param string $inviteId * @param string $userId * @param string $secret - * @param string $success - * @param string $failure * @throws Exception * @return array */ - public function updateTeamMembershipStatus(string $teamId, string $inviteId, string $userId, string $secret, string $success = '', string $failure = ''):array + public function updateTeamMembershipStatus(string $teamId, string $inviteId, string $userId, string $secret):array { $path = str_replace(['{teamId}', '{inviteId}'], [$teamId, $inviteId], '/teams/{teamId}/memberships/{inviteId}/status'); $params = []; $params['userId'] = $userId; $params['secret'] = $secret; - $params['success'] = $success; - $params['failure'] = $failure; return $this->client->call(Client::METHOD_PATCH, $path, [ 'content-type' => 'application/json', diff --git a/app/sdks/php/src/Appwrite/Services/Users.php b/app/sdks/php/src/Appwrite/Services/Users.php index aca2a1edb1..3d59006f57 100644 --- a/app/sdks/php/src/Appwrite/Services/Users.php +++ b/app/sdks/php/src/Appwrite/Services/Users.php @@ -102,7 +102,7 @@ class Users extends Service } /** - * Get User Prefs + * Get User Preferences * * Get user preferences by its unique ID. * @@ -122,7 +122,7 @@ class Users extends Service } /** - * Update User Prefs + * Update User Preferences * * Update user preferences by its unique ID. You can pass only the specific * settings you wish to update. diff --git a/app/sdks/python/README.md b/app/sdks/python/README.md index 0d388a4486..e5a3c8a652 100644 --- a/app/sdks/python/README.md +++ b/app/sdks/python/README.md @@ -3,7 +3,7 @@ ![License](https://img.shields.io/github/license/appwrite/sdk-for-python.svg?v=1) ![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) -**WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).** +**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.** Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) diff --git a/app/sdks/python/appwrite/client.py b/app/sdks/python/appwrite/client.py index 7fbadfaff4..92d8651a55 100644 --- a/app/sdks/python/appwrite/client.py +++ b/app/sdks/python/appwrite/client.py @@ -1,6 +1,4 @@ import requests - - class Client: def __init__(self): self._self_signed = False @@ -73,5 +71,11 @@ class Client: ) response.raise_for_status() - - return response.json() + + content_type = response.headers['Content-Type'] + + if content_type.startswith('application/json'): + return response.json() + + return response._content + diff --git a/app/sdks/python/appwrite/services/account.py b/app/sdks/python/appwrite/services/account.py index 4b38e4a824..ab045782da 100644 --- a/app/sdks/python/appwrite/services/account.py +++ b/app/sdks/python/appwrite/services/account.py @@ -6,7 +6,7 @@ class Account(Service): def __init__(self, client): super(Account, self).__init__(client) - def get(self): + def get_account(self): """Get Account""" params = {} @@ -16,6 +16,19 @@ class Account(Service): 'content-type': 'application/json', }, params) + def create_account(self, email, password, name=''): + """Create Account""" + + params = {} + path = '/account' + params['email'] = email + params['password'] = password + params['name'] = name + + return self.client.call('post', path, { + 'content-type': 'application/json', + }, params) + def delete(self): """Delete Account""" @@ -38,7 +51,17 @@ class Account(Service): 'content-type': 'application/json', }, params) - def update_name(self, name): + def get_account_logs(self): + """Get Account Logs""" + + params = {} + path = '/account/logs' + + return self.client.call('get', path, { + 'content-type': 'application/json', + }, params) + + def update_account_name(self, name): """Update Account Name""" params = {} @@ -49,7 +72,7 @@ class Account(Service): 'content-type': 'application/json', }, params) - def update_password(self, password, old_password): + def update_account_password(self, password, old_password): """Update Account Password""" params = {} @@ -61,7 +84,7 @@ class Account(Service): 'content-type': 'application/json', }, params) - def get_prefs(self): + def get_account_prefs(self): """Get Account Preferences""" params = {} @@ -72,7 +95,7 @@ class Account(Service): }, params) def update_prefs(self, prefs): - """Update Account Prefs""" + """Update Account Preferences""" params = {} path = '/account/prefs' @@ -82,18 +105,34 @@ class Account(Service): 'content-type': 'application/json', }, params) - def get_security(self): - """Get Account Security Log""" + def create_account_recovery(self, email, url): + """Password Recovery""" params = {} - path = '/account/security' + path = '/account/recovery' + params['email'] = email + params['url'] = url - return self.client.call('get', path, { + return self.client.call('post', path, { 'content-type': 'application/json', }, params) - def get_sessions(self): - """Get Account Active Sessions""" + def update_account_recovery(self, user_id, secret, password_a, password_b): + """Password Reset""" + + params = {} + path = '/account/recovery' + params['userId'] = user_id + params['secret'] = secret + params['password-a'] = password_a + params['password-b'] = password_b + + return self.client.call('put', path, { + 'content-type': 'application/json', + }, params) + + def get_account_sessions(self): + """Get Account Sessions""" params = {} path = '/account/sessions' @@ -101,3 +140,83 @@ class Account(Service): return self.client.call('get', path, { 'content-type': 'application/json', }, params) + + def create_account_session(self, email, password): + """Create Account Session""" + + params = {} + path = '/account/sessions' + params['email'] = email + params['password'] = password + + return self.client.call('post', path, { + 'content-type': 'application/json', + }, params) + + def delete_account_sessions(self): + """Delete All Account Sessions""" + + params = {} + path = '/account/sessions' + + return self.client.call('delete', path, { + 'content-type': 'application/json', + }, params) + + def delete_account_current_session(self): + """Delete Current Account Session""" + + params = {} + path = '/account/sessions/current' + + return self.client.call('delete', path, { + 'content-type': 'application/json', + }, params) + + def create_account_session_o_auth(self, provider, success, failure): + """Create Account Session with OAuth""" + + params = {} + path = '/account/sessions/oauth/{provider}' + path = path.replace('{provider}', provider) + params['success'] = success + params['failure'] = failure + + return self.client.call('get', path, { + 'content-type': 'application/json', + }, params) + + def delete_account_session(self, id): + """Delete Account Session""" + + params = {} + path = '/account/sessions/{id}' + path = path.replace('{id}', id) + + return self.client.call('delete', path, { + 'content-type': 'application/json', + }, params) + + def create_account_verification(self, url): + """Create Verification""" + + params = {} + path = '/account/verification' + params['url'] = url + + return self.client.call('post', path, { + 'content-type': 'application/json', + }, params) + + def update_account_verification(self, user_id, secret, password_b): + """Updated Verification""" + + params = {} + path = '/account/verification' + params['userId'] = user_id + params['secret'] = secret + params['password-b'] = password_b + + return self.client.call('put', path, { + 'content-type': 'application/json', + }, params) diff --git a/app/sdks/python/appwrite/services/storage.py b/app/sdks/python/appwrite/services/storage.py index 7b8fa23581..7e2a986f6e 100644 --- a/app/sdks/python/appwrite/services/storage.py +++ b/app/sdks/python/appwrite/services/storage.py @@ -20,12 +20,12 @@ class Storage(Service): 'content-type': 'application/json', }, params) - def create_file(self, files, read, write): + def create_file(self, file, read, write): """Create File""" params = {} path = '/storage/files' - params['files'] = files + params['file'] = file params['read'] = read params['write'] = write diff --git a/app/sdks/python/appwrite/services/teams.py b/app/sdks/python/appwrite/services/teams.py index c69424d8ba..7112e45a87 100644 --- a/app/sdks/python/appwrite/services/teams.py +++ b/app/sdks/python/appwrite/services/teams.py @@ -66,18 +66,18 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def get_team_members(self, team_id): - """Get Team Members""" + def get_team_memberships(self, team_id): + """Get Team Memberships""" params = {} - path = '/teams/{teamId}/members' + path = '/teams/{teamId}/memberships' path = path.replace('{teamId}', team_id) return self.client.call('get', path, { 'content-type': 'application/json', }, params) - def create_team_membership(self, team_id, email, roles, redirect, name=''): + def create_team_membership(self, team_id, email, roles, url, name=''): """Create Team Membership""" params = {} @@ -86,7 +86,7 @@ class Teams(Service): params['email'] = email params['name'] = name params['roles'] = roles - params['redirect'] = redirect + params['url'] = url return self.client.call('post', path, { 'content-type': 'application/json', @@ -104,20 +104,7 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def create_team_membership_resend(self, team_id, invite_id, redirect): - """Create Team Membership (Resend)""" - - params = {} - path = '/teams/{teamId}/memberships/{inviteId}/resend' - path = path.replace('{teamId}', team_id) - path = path.replace('{inviteId}', invite_id) - params['redirect'] = redirect - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def update_team_membership_status(self, team_id, invite_id, user_id, secret, success='', failure=''): + def update_team_membership_status(self, team_id, invite_id, user_id, secret): """Update Team Membership Status""" params = {} @@ -126,8 +113,6 @@ class Teams(Service): path = path.replace('{inviteId}', invite_id) params['userId'] = user_id params['secret'] = secret - params['success'] = success - params['failure'] = failure return self.client.call('patch', path, { 'content-type': 'application/json', diff --git a/app/sdks/python/appwrite/services/users.py b/app/sdks/python/appwrite/services/users.py index e97a961901..1fbe5c7518 100644 --- a/app/sdks/python/appwrite/services/users.py +++ b/app/sdks/python/appwrite/services/users.py @@ -56,7 +56,7 @@ class Users(Service): }, params) def get_user_prefs(self, user_id): - """Get User Prefs""" + """Get User Preferences""" params = {} path = '/users/{userId}/prefs' @@ -67,7 +67,7 @@ class Users(Service): }, params) def update_user_prefs(self, user_id, prefs): - """Update User Prefs""" + """Update User Preferences""" params = {} path = '/users/{userId}/prefs' diff --git a/app/sdks/ruby/README.md b/app/sdks/ruby/README.md index af0c396288..dcf68a0384 100644 --- a/app/sdks/ruby/README.md +++ b/app/sdks/ruby/README.md @@ -3,7 +3,7 @@ ![License](https://img.shields.io/github/license/appwrite/sdk-for-ruby.svg?v=1) ![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) -**WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).** +**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.** Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) diff --git a/app/sdks/ruby/lib/appwrite.rb b/app/sdks/ruby/lib/appwrite.rb index 7f12c9aedf..c93a767938 100644 --- a/app/sdks/ruby/lib/appwrite.rb +++ b/app/sdks/ruby/lib/appwrite.rb @@ -4,7 +4,6 @@ require 'json' require_relative 'appwrite/client' require_relative 'appwrite/service' require_relative 'appwrite/services/account' -require_relative 'appwrite/services/auth' require_relative 'appwrite/services/avatars' require_relative 'appwrite/services/database' require_relative 'appwrite/services/locale' diff --git a/app/sdks/ruby/lib/appwrite/client.rb b/app/sdks/ruby/lib/appwrite/client.rb index 43dd47a235..86bef71f02 100644 --- a/app/sdks/ruby/lib/appwrite/client.rb +++ b/app/sdks/ruby/lib/appwrite/client.rb @@ -62,7 +62,17 @@ module Appwrite end def call(method, path = '', headers = {}, params = {}) - uri = URI.parse(@endpoint + path + ((method == METHOD_GET) ? '?' + encode(params) : '')) + uri = URI.parse(@endpoint + path + ((method == METHOD_GET && params.length) ? '?' + encode(params) : '')) + return fetch(method, uri, headers, params) + end + + protected + + private + + def fetch(method, uri, headers, params, limit = 5) + raise ArgumentError, 'Too Many HTTP Redirects' if limit == 0 + http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = (uri.scheme == 'https') payload = '' @@ -83,14 +93,18 @@ module Appwrite rescue => error raise 'Request Failed: ' + error.message end + + # Handle Redirects + if (response.class == Net::HTTPRedirection || response.class == Net::HTTPMovedPermanently) + location = response['location'] + uri = URI.parse(uri.scheme + "://" + uri.host + "" + location) + + return fetch(method, uri, headers, {}, limit - 1) + end return JSON.parse(response.body); end - protected - - private - def encode(value, key = nil) case value when Hash then value.map { |k,v| encode(v, append_key(key,k)) }.join('&') diff --git a/app/sdks/ruby/lib/appwrite/services/account.rb b/app/sdks/ruby/lib/appwrite/services/account.rb index 8f2a8b3e2a..51c4a614f4 100644 --- a/app/sdks/ruby/lib/appwrite/services/account.rb +++ b/app/sdks/ruby/lib/appwrite/services/account.rb @@ -1,7 +1,7 @@ module Appwrite class Account < Service - def get() + def get_account() path = '/account' params = { @@ -12,6 +12,20 @@ module Appwrite }, params); end + def create_account(email:, password:, name: '') + path = '/account' + + params = { + 'email': email, + 'password': password, + 'name': name + } + + return @client.call('post', path, { + 'content-type' => 'application/json', + }, params); + end + def delete() path = '/account' @@ -36,7 +50,18 @@ module Appwrite }, params); end - def update_name(name:) + def get_account_logs() + path = '/account/logs' + + params = { + } + + return @client.call('get', path, { + 'content-type' => 'application/json', + }, params); + end + + def update_account_name(name:) path = '/account/name' params = { @@ -48,7 +73,7 @@ module Appwrite }, params); end - def update_password(password:, old_password:) + def update_account_password(password:, old_password:) path = '/account/password' params = { @@ -61,7 +86,7 @@ module Appwrite }, params); end - def get_prefs() + def get_account_prefs() path = '/account/prefs' params = { @@ -84,18 +109,35 @@ module Appwrite }, params); end - def get_security() - path = '/account/security' + def create_account_recovery(email:, url:) + path = '/account/recovery' params = { + 'email': email, + 'url': url } - return @client.call('get', path, { + return @client.call('post', path, { 'content-type' => 'application/json', }, params); end - def get_sessions() + def update_account_recovery(user_id:, secret:, password_a:, password_b:) + path = '/account/recovery' + + params = { + 'userId': user_id, + 'secret': secret, + 'password-a': password_a, + 'password-b': password_b + } + + return @client.call('put', path, { + 'content-type' => 'application/json', + }, params); + end + + def get_account_sessions() path = '/account/sessions' params = { @@ -106,6 +148,93 @@ module Appwrite }, params); end + def create_account_session(email:, password:) + path = '/account/sessions' + + params = { + 'email': email, + 'password': password + } + + return @client.call('post', path, { + 'content-type' => 'application/json', + }, params); + end + + def delete_account_sessions() + path = '/account/sessions' + + params = { + } + + return @client.call('delete', path, { + 'content-type' => 'application/json', + }, params); + end + + def delete_account_current_session() + path = '/account/sessions/current' + + params = { + } + + return @client.call('delete', path, { + 'content-type' => 'application/json', + }, params); + end + + def create_account_session_o_auth(provider:, success:, failure:) + path = '/account/sessions/oauth/{provider}' + .gsub('{provider}', provider) + + params = { + 'success': success, + 'failure': failure + } + + return @client.call('get', path, { + 'content-type' => 'application/json', + }, params); + end + + def delete_account_session(id:) + path = '/account/sessions/{id}' + .gsub('{id}', id) + + params = { + } + + return @client.call('delete', path, { + 'content-type' => 'application/json', + }, params); + end + + def create_account_verification(url:) + path = '/account/verification' + + params = { + 'url': url + } + + return @client.call('post', path, { + 'content-type' => 'application/json', + }, params); + end + + def update_account_verification(user_id:, secret:, password_b:) + path = '/account/verification' + + params = { + 'userId': user_id, + 'secret': secret, + 'password-b': password_b + } + + return @client.call('put', path, { + 'content-type' => 'application/json', + }, params); + end + protected diff --git a/app/sdks/ruby/lib/appwrite/services/storage.rb b/app/sdks/ruby/lib/appwrite/services/storage.rb index 6e854b1f6d..2fe1a5762f 100644 --- a/app/sdks/ruby/lib/appwrite/services/storage.rb +++ b/app/sdks/ruby/lib/appwrite/services/storage.rb @@ -16,11 +16,11 @@ module Appwrite }, params); end - def create_file(files:, read:, write:) + def create_file(file:, read:, write:) path = '/storage/files' params = { - 'files': files, + 'file': file, 'read': read, 'write': write } diff --git a/app/sdks/ruby/lib/appwrite/services/teams.rb b/app/sdks/ruby/lib/appwrite/services/teams.rb index 109786e542..143c2a650c 100644 --- a/app/sdks/ruby/lib/appwrite/services/teams.rb +++ b/app/sdks/ruby/lib/appwrite/services/teams.rb @@ -66,8 +66,8 @@ module Appwrite }, params); end - def get_team_members(team_id:) - path = '/teams/{teamId}/members' + def get_team_memberships(team_id:) + path = '/teams/{teamId}/memberships' .gsub('{team_id}', team_id) params = { @@ -78,7 +78,7 @@ module Appwrite }, params); end - def create_team_membership(team_id:, email:, roles:, redirect:, name: '') + def create_team_membership(team_id:, email:, roles:, url:, name: '') path = '/teams/{teamId}/memberships' .gsub('{team_id}', team_id) @@ -86,7 +86,7 @@ module Appwrite 'email': email, 'name': name, 'roles': roles, - 'redirect': redirect + 'url': url } return @client.call('post', path, { @@ -107,30 +107,14 @@ module Appwrite }, params); end - def create_team_membership_resend(team_id:, invite_id:, redirect:) - path = '/teams/{teamId}/memberships/{inviteId}/resend' - .gsub('{team_id}', team_id) - .gsub('{invite_id}', invite_id) - - params = { - 'redirect': redirect - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_team_membership_status(team_id:, invite_id:, user_id:, secret:, success: '', failure: '') + def update_team_membership_status(team_id:, invite_id:, user_id:, secret:) path = '/teams/{teamId}/memberships/{inviteId}/status' .gsub('{team_id}', team_id) .gsub('{invite_id}', invite_id) params = { 'userId': user_id, - 'secret': secret, - 'success': success, - 'failure': failure + 'secret': secret } return @client.call('patch', path, { diff --git a/app/tasks/sdks.php b/app/tasks/sdks.php index ef830044fd..0df9b7b762 100644 --- a/app/tasks/sdks.php +++ b/app/tasks/sdks.php @@ -37,155 +37,27 @@ $cli return $result; } - $clients = [ - 'php' => [ - 'version' => '1.0.16', - 'result' => __DIR__.'/../sdks/php/', - 'gitURL' => 'https://github.com/appwrite/sdk-for-php.git', - 'gitRepo' => 'git@github.com:appwrite/sdk-for-php.git', - 'gitRepoName' => 'sdk-for-php', - 'gitUserName' => 'appwrite', - 'warning' => $warning, - 'readme' => false, - 'platform' => 'server', - ], - 'js' => [ - 'version' => '1.0.28', - 'result' => __DIR__.'/../sdks/js/', - 'gitURL' => 'https://github.com/appwrite/sdk-for-js.git', - 'gitRepo' => 'git@github.com:appwrite/sdk-for-js.git', - 'gitRepoName' => 'sdk-for-js', - 'gitUserName' => 'appwrite', - 'warning' => $warning, - 'readme' => realpath(__DIR__ . '/../../docs/sdks/js.md'), - 'platform' => 'client', - ], - 'node' => [ - 'version' => '1.0.31', - 'result' => __DIR__.'/../sdks/node/', - 'gitURL' => 'https://github.com/appwrite/sdk-for-node.git', - 'gitRepo' => 'git@github.com:appwrite/sdk-for-node.git', - 'gitRepoName' => 'sdk-for-node', - 'gitUserName' => 'appwrite', - 'warning' => $warning, - 'readme' => false, - 'platform' => 'server', - ], - 'python' => [ - 'version' => '0.0.3', - 'result' => __DIR__.'/../sdks/python/', - 'gitURL' => 'https://github.com/appwrite/sdk-for-python.git', - 'gitRepo' => 'git@github.com:appwrite/sdk-for-python.git', - 'gitRepoName' => 'sdk-for-python', - 'gitUserName' => 'appwrite', - 'warning' => '**WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).**', - 'readme' => false, - 'platform' => 'server', - ], - 'ruby' => [ - 'version' => '1.0.8', - 'result' => __DIR__.'/../sdks/ruby/', - 'gitURL' => 'https://github.com/appwrite/sdk-for-ruby.git', - 'gitRepo' => 'git@github.com:appwrite/sdk-for-ruby.git', - 'gitRepoName' => 'sdk-for-ruby', - 'gitUserName' => 'appwrite', - 'warning' => '**WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).**', - 'readme' => false, - 'platform' => 'server', - ], - 'dart' => [ - 'version' => '0.0.6', - 'result' => __DIR__.'/../sdks/dart/', - 'gitURL' => 'https://github.com/appwrite/sdk-for-dart', - 'gitRepo' => 'git@github.com:appwrite/sdk-for-dart.git', - 'gitRepoName' => 'sdk-for-dart', - 'gitUserName' => 'appwrite', - 'warning' => '**WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).**', - 'readme' => false, - 'platform' => 'client', - ], - 'go' => [ - 'version' => '0.0.5', - 'result' => __DIR__.'/../sdks/go/', - 'gitURL' => 'https://github.com/appwrite/sdk-for-go', - 'gitRepo' => 'git@github.com:appwrite/sdk-for-go.git', - 'gitRepoName' => 'sdk-for-go', - 'gitUserName' => 'appwrite', - 'warning' => '**WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).**', - 'readme' => false, - 'platform' => 'server', - ], - ]; + $platforms = include __DIR__ . '/../config/platforms.php'; + $message = Console::confirm('Please enter your commit message:'); - - foreach ($clients as $name => $client) { + foreach($platforms as $platform) { + foreach($platform['languages'] as $language) { + if(!$language['enabled']) { + Console::warning($language['name'].' for '.$platform['name'] . ' is disabled'); + continue; + } - Console::info('Fetching API Spec for '.$name.' ('.$client['platform'].')'); - - $spec = getSSLPage('https://localhost/v1/open-api-2.json?extensions=1&platform='.$client['platform']); - $spec = getSSLPage('https://appwrite.io/v1/open-api-2.json?extensions=1&platform='.$client['platform']); - - $license = 'BSD-3-Clause'; + Console::info('Fetching API Spec for '.$language['name'].' for '.$platform['name']); - switch ($name) { - case 'php': - $language = new PHP(); - $language - ->setComposerVendor('appwrite') - ->setComposerPackage('appwrite') - ; - break; - case 'js': - $language = new JS(); - $language - ->setNPMPackage('appwrite') - ->setBowerPackage('appwrite') - ; - break; - case 'node': - $language = new Node(); - $language - ->setNPMPackage('node-appwrite') - ->setBowerPackage('appwrite') - ; - break; - case 'python': - $language = new Python(); - $language - ->setPipPackage('appwrite') - ; - $license = 'BSD License'; // license edited due to classifiers in pypi - break; - case 'ruby': - $language = new Ruby(); - $language - ->setGemPackage('appwrite') - ; - break; - case 'dart': - $language = new Dart(); - $language - ->setPackageName('appwrite') - ; - break; - break; - case 'go': - $language = new Go(); - break; - default: - throw new Exception('Language not supported'); - break; - } + $spec = getSSLPage('http://localhost/v1/open-api-2.json?extensions=1'); - $target = __DIR__.'/../sdks/git/'.$name; - - Console::success("Generating {$name} SDK"); - - $sdk = new SDK($language, new Swagger2($spec)); - - $sdk - ->setLicense($license) - ->setLicenseContent('Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. + $result = realpath(__DIR__.'/..').'/sdks/'.$language['key']; + $target = realpath(__DIR__.'/..').'/sdks/git/'.$language['key']; + $readme = realpath(__DIR__ . '/../../docs/sdks/'.$language['key'].'.md'); + $readme = ($readme) ? file_get_contents($readme) : ''; + $warning = ($language['beta']) ? '**This SDK is compatible with Appwrite server version ' . $version . '. For older versions, please check previous releases.**' : ''; + $license = 'BSD-3-Clause'; + $licenseContent = 'Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -196,7 +68,112 @@ Redistribution and use in source and binary forms, with or without modification, 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.') +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.'; + + switch ($language['key']) { + case 'php': + $config = new PHP(); + $config + ->setComposerVendor('appwrite') + ->setComposerPackage('appwrite') + ; + break; + case 'javascript': + $config = new JS(); + $config + ->setNPMPackage('appwrite') + ->setBowerPackage('appwrite') + ; + break; + case 'nodejs': + $config = new Node(); + $config + ->setNPMPackage('node-appwrite') + ->setBowerPackage('appwrite') + ; + break; + case 'python': + $config = new Python(); + $config + ->setPipPackage('appwrite') + ; + $license = 'BSD License'; // license edited due to classifiers in pypi + break; + case 'ruby': + $config = new Ruby(); + $config + ->setGemPackage('appwrite') + ; + break; + case 'dart': + $config = new Dart(); + $config + ->setPackageName('appwrite') + ; + break; + case 'go': + $config = new Go(); + break; + default: + throw new Exception('Language "'.$language['key'].'" not supported'); + break; + } + + Console::info("Generating {$language['name']} SDK..."); + + $sdk = new SDK($config, new Swagger2($spec)); + + $sdk + ->setLicense($license) + ->setLicenseContent($licenseContent) + ->setVersion($language['version']) + ->setGitURL($language['url']) + ->setGitRepo($language['gitUrl']) + ->setGitRepoName($language['gitRepoName']) + ->setGitUserName($language['gitUserName']) + ->setLogo('https://appwrite.io/images/github.png') + ->setURL('https://appwrite.io') + ->setShareText('Appwrite is a backend as a service for building web or mobile apps') + ->setShareURL('http://appwrite.io') + ->setShareTags('JS,javascript,reactjs,angular,ios,android,serverless') + ->setShareVia('appwrite_io') + ->setWarning($warning) + ->setReadme($readme) + ; + + try { + $sdk->generate($result); + } catch (Exception $exception) { + Console::error($exception->getMessage()); + } catch (Throwable $exception) { + Console::error($exception->getMessage()); + } + + var_dump('rm -rf '.$target.' && \ + mkdir -p '.$target.' && \ + cd '.$target.' && \ + git init && \ + git remote add origin '.$language['gitUrl'].' && \ + git fetch && \ + git pull '.$language['gitUrl'].' && \ + rm -rf '.$target.'/* && \ + cp -r '.$result.' '.$target.' && \ + git add . && \ + git commit -m "'.$message.'" && \ + git push -u origin master'); + + Console::success("Pushed {$language['name']} SDK to {$language['url']}"); + } + } + exit(); + + foreach ($clients as $name => $client) { + + + + $sdk + ->setLicense($license) + ->setLicenseContent($licenseContent) ->setVersion($client['version']) ->setGitRepo($client['gitRepo']) ->setGitURL($client['gitURL']) @@ -219,6 +196,19 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND Console::error($exception->getMessage()); } + var_dump('rm -rf '.$target.' && \ + mkdir -p '.$target.' && \ + cd '.$target.' && \ + git init && \ + git remote add origin '.$client['gitRepo'].' && \ + git fetch && \ + git pull '.$client['gitRepo'].' && \ + rm -rf '.$target.'/* && \ + cp -r '.$client['result'].' '.$target.' && \ + git add . && \ + git commit -m "Initial commit" && \ + git push -u origin master'); + exec('rm -rf '.$target.' && \ mkdir -p '.$target.' && \ cd '.$target.' && \ diff --git a/docs/references/account/create-recovery.md b/docs/references/account/create-recovery.md index e15db5ac6b..45ff5f83f2 100644 --- a/docs/references/account/create-recovery.md +++ b/docs/references/account/create-recovery.md @@ -1 +1 @@ -Sends the user an email with a temporary secret token for password reset. When the user clicks the confirmation link he is redirected back to your app password reset redirect URL with a secret token and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process. \ No newline at end of file +Sends the user an email with a temporary secret key for password reset. When the user clicks the confirmation link he is redirected back to your app password reset URL with the secret key and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process. \ No newline at end of file diff --git a/docs/references/account/create-verification.md b/docs/references/account/create-verification.md index 1710e34068..a9aa04e104 100644 --- a/docs/references/account/create-verification.md +++ b/docs/references/account/create-verification.md @@ -1,3 +1,3 @@ -Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **token** arguments will be passed as query parameters to the URL you have provider to be attached to the verification email. The provided URL should redirect the user back for your app and allow you to complete the verification process by verifying both the **userId** and **token** parameters. Learn more about how to [complete the verification process](/docs/account#updateAccountVerification). +Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provider to be attached to the verification email. The provided URL should redirect the user back for your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](/docs/account#updateAccountVerification). Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/account/update-recovery.md b/docs/references/account/update-recovery.md index 1936120e82..4a58ef92f8 100644 --- a/docs/references/account/update-recovery.md +++ b/docs/references/account/update-recovery.md @@ -1,3 +1,3 @@ -Use this endpoint to complete the user account password reset. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. +Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. \ No newline at end of file diff --git a/docs/references/account/update-verification.md b/docs/references/account/update-verification.md index 4b11befa13..d089cc51b1 100644 --- a/docs/references/account/update-verification.md +++ b/docs/references/account/update-verification.md @@ -1 +1 @@ -Use this endpoint to complete the user email verification process. Use both the **userId** and **token** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code. \ No newline at end of file +Use this endpoint to complete the user email verification process. Use both the **userId** and **secret** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code. \ No newline at end of file diff --git a/docs/references/teams/update-team-membership-status.md b/docs/references/teams/update-team-membership-status.md index 199c243a08..fa75a56628 100644 --- a/docs/references/teams/update-team-membership-status.md +++ b/docs/references/teams/update-team-membership-status.md @@ -2,4 +2,4 @@ Use this endpoint to let user accept an invitation to join a team after he is be Please note that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. -When not using the success or failure redirect arguments this endpoint will result with a 200 status code on success and with 401 status error on failure. This behavior was applied to help the web clients deal with browsers who don't allow to set 3rd party HTTP cookies needed for saving the account session token. \ No newline at end of file +When not using the success or failure redirect arguments this endpoint will result with a 200 status code on success and with 401 status error on failure. This behavior was applied to help the web clients deal with browsers who don't allow to set 3rd party HTTP cookies needed for saving the account session key. \ No newline at end of file From d52bd92d75b1ab641a2907512b4f418e75edb63d Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 00:43:35 +0200 Subject: [PATCH 099/237] Test bigger tablet mode --- public/dist/styles/default-ltr.css | 2 +- public/dist/styles/default-rtl.css | 2 +- public/styles/default.less | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/public/dist/styles/default-ltr.css b/public/dist/styles/default-ltr.css index f16d97ca1b..d29e42c9e8 100644 --- a/public/dist/styles/default-ltr.css +++ b/public/dist/styles/default-ltr.css @@ -1 +1 @@ -.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-end-negative{margin-right:-30px!important}.margin-start-negative{margin-left:-30px!important}.margin-end-negative-small{margin-right:-15px!important}.margin-start-negative-small{margin-left:-15px!important}.margin-end-negative-tiny{margin-right:-5px!important}.margin-start-negative-tiny{margin-left:-5px!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1000px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxNwAA8TcAAABWAADxOAAA8TgAAABXAADxcQAA8XEAAABYAADxegAA8XoAAABZAADxkwAA8ZMAAABaAADxnAAA8ZwAAABbAADxoAAA8aAAAABcAADxrQAA8a0AAABdAADxwAAA8cAAAABeAADxzQAA8c0AAABfAADx3AAA8dwAAABgAADx5QAA8eUAAABhAADx/gAA8f4AAABiAADyMQAA8jEAAABjAADyOgAA8joAAABkAADylgAA8pYAAABlAADyxgAA8sYAAABmAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMl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MgAwACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAAR1c2VyBmZvbGRlcgRsaXN0BWxvZ2luA2NvZwd0d2l0dGVyC2FydGljbGUtYWx0BmNhbmNlbARob21lCGRvd24tZGlyCGZhY2Vib29rCGFzdGVyaXNrBnVwbG9hZAlzdG9wd2F0Y2gGZXhwb3J0BWhlYXJ0BHBsdXMGdXAtZGlyBG1lbnUJbGVmdC1vcGVuCnJpZ2h0LW9wZW4FaW5ib3gGd3JlbmNoB2NvbW1lbnQNc3RhY2tvdmVyZmxvdwhxdWVzdGlvbgpvay1jaXJjbGVkB3dhcm5pbmcEbWFpbARsaW5rB2tleS1pbnYFdHJhc2gIZG93bmxvYWQHZ2xhc3NlcwZxcmNvZGUHc2h1ZmZsZQNleWUEbG9jawZzZWFyY2gEYmVsbAV1c2Vycwhsb2NhdGlvbglicmllZmNhc2UJaW5zdGFncmFtBWNsb2NrBXBob25lCGNhbGVuZGFyBXByaW50BGVkaXQEYm9sZAZpdGFsaWMGcm9ja2V0CHdoYXRzYXBwBWRvdC0zDGluZm8tY2lyY2xlZAh2aWRlb2NhbQtxdW90ZS1yaWdodAdwaWN0dXJlB3BhbGV0dGUEbGFtcAlib29rLW9wZW4Cb2sIY2hhdC1hbHQHYXJjaGl2ZQRwbGF5BXBhdXNlCWRvd24tb3Blbgd1cC1vcGVuBW1pbnVzCGV4Y2hhbmdlB25ldHdvcmsHZGlzY29yZAhsaW5rLWV4dA5naXRodWItY2lyY2xlZAZmaWx0ZXIEZG9jcwtsaXN0LWJ1bGxldA1saXN0LW51bWJlcmVkCXVuZGVybGluZQRzb3J0CGxpbmtlZGluBXNtaWxlCGtleWJvYXJkBGNvZGUGc2hpZWxkEmFuZ2xlLWNpcmNsZWQtbGVmdBNhbmdsZS1jaXJjbGVkLXJpZ2h0CWJpdGJ1Y2tldAd3aW5kb3dzCndoZWVsY2hhaXIEYmFuawZnb29nbGUPYnVpbGRpbmctZmlsbGVkCGRhdGFiYXNlCGxpZmVidW95BmhlYWRlcgpiaW5vY3VsYXJzCmNoYXJ0LWFyZWEJcGludGVyZXN0Bm1lZGl1bQZnaXRsYWIIdGVsZWdyYW0AAAABAAH//wAPAAAAAAAAAAAAAAAAAAAAAAAYABgAGAAYA4H/OgOB/zqwACwgsABVWEVZICBLuAAOUUuwBlNaWLA0G7AoWWBmIIpVWLACJWG5CAAIAGNjI2IbISGwAFmwAEMjRLIAAQBDYEItsAEssCBgZi2wAiwgZCCwwFCwBCZasigBCkNFY0VSW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCxAQpDRWNFYWSwKFBYIbEBCkNFY0UgsDBQWCGwMFkbILDAUFggZiCKimEgsApQWGAbILAgUFghsApgGyCwNlBYIbA2YBtgWVlZG7ABK1lZI7AAUFhlWVktsAMsIEUgsAQlYWQgsAVDUFiwBSNCsAYjQhshIVmwAWAtsAQsIyEjISBksQViQiCwBiNCsQEKQ0VjsQEKQ7ABYEVjsAMqISCwBkMgiiCKsAErsTAFJbAEJlFYYFAbYVJZWCNZISCwQFNYsAErGyGwQFkjsABQWGVZLbAFLLAHQyuyAAIAQ2BCLbAGLLAHI0IjILAAI0JhsAJiZrABY7ABYLAFKi2wBywgIEUgsAtDY7gEAGIgsABQWLBAYFlmsAFjYESwAWAtsAgssgcLAENFQiohsgABAENgQi2wCSywAEMjRLIAAQBDYEItsAosICBFILABKyOwAEOwBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsAssICBFILABKyOwAEOwBCVgIEWKI2EgZLAkUFiwABuwQFkjsABQWGVZsAMlI2FERLABYC2wDCwgsAAjQrILCgNFWCEbIyFZKiEtsA0ssQICRbBkYUQtsA4ssAFgICCwDENKsABQWCCwDCNCWbANQ0qwAFJYILANI0JZLbAPLCCwEGJmsAFjILgEAGOKI2GwDkNgIIpgILAOI0IjLbAQLEtUWLEEZERZJLANZSN4LbARLEtRWEtTWLEEZERZGyFZJLATZSN4LbASLLEAD0NVWLEPD0OwAWFCsA8rWbAAQ7ACJUKxDAIlQrENAiVCsAEWIyCwAyVQWLEBAENgsAQlQoqKIIojYbAOKiEjsAFhIIojYbAOKiEbsQEAQ2CwAiVCsAIlYbAOKiFZsAxDR7ANQ0dgsAJiILAAUFiwQGBZZrABYyCwC0NjuAQAYiCwAFBYsEBgWWawAWNgsQAAEyNEsAFDsAA+sgEBAUNgQi2wEywAsQACRVRYsA8jQiBFsAsjQrAKI7ABYEIgYLABYbUQEAEADgBCQopgsRIGK7ByKxsiWS2wFCyxABMrLbAVLLEBEystsBYssQITKy2wFyyxAxMrLbAYLLEEEystsBkssQUTKy2wGiyxBhMrLbAbLLEHEystsBwssQgTKy2wHSyxCRMrLbAeLACwDSuxAAJFVFiwDyNCIEWwCyNCsAojsAFgQiBgsAFhtRAQAQAOAEJCimCxEgYrsHIrGyJZLbAfLLEAHistsCAssQEeKy2wISyxAh4rLbAiLLEDHistsCMssQQeKy2wJCyxBR4rLbAlLLEGHistsCYssQceKy2wJyyxCB4rLbAoLLEJHistsCksIDywAWAtsCosIGCwEGAgQyOwAWBDsAIlYbABYLApKiEtsCsssCorsCoqLbAsLCAgRyAgsAtDY7gEAGIgsABQWLBAYFlmsAFjYCNhOCMgilVYIEcgILALQ2O4BABiILAAUFiwQGBZZrABY2AjYTgbIVktsC0sALEAAkVUWLABFrAsKrABFTAbIlktsC4sALANK7EAAkVUWLABFrAsKrABFTAbIlktsC8sIDWwAWAtsDAsALABRWO4BABiILAAUFiwQGBZZrABY7ABK7ALQ2O4BABiILAAUFiwQGBZZrABY7ABK7AAFrQAAAAAAEQ+IzixLwEVKi2wMSwgPCBHILALQ2O4BABiILAAUFiwQGBZZrABY2CwAENhOC2wMiwuFzwtsDMsIDwgRyCwC0NjuAQAYiCwAFBYsEBgWWawAWNgsABDYbABQ2M4LbA0LLECABYlIC4gR7AAI0KwAiVJiopHI0cjYSBYYhshWbABI0KyMwEBFRQqLbA1LLAAFrAEJbAEJUcjRyNhsAlDK2WKLiMgIDyKOC2wNiywABawBCWwBCUgLkcjRyNhILAEI0KwCUMrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyCwCEMgiiNHI0cjYSNGYLAEQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwAmIgsABQWLBAYFlmsAFjYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsAJiILAAUFiwQGBZZrABY2AjILABKyOwBENgsAErsAUlYbAFJbACYiCwAFBYsEBgWWawAWOwBCZhILAEJWBkI7ADJWBkUFghGyMhWSMgILAEJiNGYThZLbA3LLAAFiAgILAFJiAuRyNHI2EjPDgtsDgssAAWILAII0IgICBGI0ewASsjYTgtsDkssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbkIAAgAY2MjIFhiGyFZY7gEAGIgsABQWLBAYFlmsAFjYCMuIyAgPIo4IyFZLbA6LLAAFiCwCEMgLkcjRyNhIGCwIGBmsAJiILAAUFiwQGBZZrABYyMgIDyKOC2wOywjIC5GsAIlRlJYIDxZLrErARQrLbA8LCMgLkawAiVGUFggPFkusSsBFCstsD0sIyAuRrACJUZSWCA8WSMgLkawAiVGUFggPFkusSsBFCstsD4ssDUrIyAuRrACJUZSWCA8WS6xKwEUKy2wPyywNiuKICA8sAQjQoo4IyAuRrACJUZSWCA8WS6xKwEUK7AEQy6wKystsEAssAAWsAQlsAQmIC5HI0cjYbAJQysjIDwgLiM4sSsBFCstsEEssQgEJUKwABawBCWwBCUgLkcjRyNhILAEI0KwCUMrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyBHsARDsAJiILAAUFiwQGBZZrABY2AgsAErIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbACYiCwAFBYsEBgWWawAWNhsAIlRmE4IyA8IzgbISAgRiNHsAErI2E4IVmxKwEUKy2wQiywNSsusSsBFCstsEMssDYrISMgIDywBCNCIzixKwEUK7AEQy6wKystsEQssAAVIEewACNCsgABARUUEy6wMSotsEUssAAVIEewACNCsgABARUUEy6wMSotsEYssQABFBOwMiotsEcssDQqLbBILLAAFkUjIC4gRoojYTixKwEUKy2wSSywCCNCsEgrLbBKLLIAAEErLbBLLLIAAUErLbBMLLIBAEErLbBNLLIBAUErLbBOLLIAAEIrLbBPLLIAAUIrLbBQLLIBAEIrLbBRLLIBAUIrLbBSLLIAAD4rLbBTLLIAAT4rLbBULLIBAD4rLbBVLLIBAT4rLbBWLLIAAEArLbBXLLIAAUArLbBYLLIBAEArLbBZLLIBAUArLbBaLLIAAEMrLbBbLLIAAUMrLbBcLLIBAEMrLbBdLLIBAUMrLbBeLLIAAD8rLbBfLLIAAT8rLbBgLLIBAD8rLbBhLLIBAT8rLbBiLLA3Ky6xKwEUKy2wYyywNyuwOystsGQssDcrsDwrLbBlLLAAFrA3K7A9Ky2wZiywOCsusSsBFCstsGcssDgrsDsrLbBoLLA4K7A8Ky2waSywOCuwPSstsGossDkrLrErARQrLbBrLLA5K7A7Ky2wbCywOSuwPCstsG0ssDkrsD0rLbBuLLA6Ky6xKwEUKy2wbyywOiuwOystsHAssDorsDwrLbBxLLA6K7A9Ky2wciyzCQQCA0VYIRsjIVlCK7AIZbADJFB4sAEVMC0AS7gAyFJYsQEBjlmwAbkIAAgAY3CxAAVCsgABACqxAAVCswoCAQgqsQAFQrMOAAEIKrEABkK6AsAAAQAJKrEAB0K6AEAAAQAJKrEDAESxJAGIUViwQIhYsQNkRLEmAYhRWLoIgAABBECIY1RYsQMARFlZWVmzDAIBDCq4Af+FsASNsQIARAAA) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-angle-circled-left:before{content:'\f137'}.icon-angle-circled-right:before{content:'\f138'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#ff729b;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#ff729b;border-color:#ff729b}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:auto;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}[data-views-current="0"] .scroll-to,[data-views-current="1"] .scroll-to{opacity:0!important}.scroll-to-bottom .scroll-to,.scroll-to-top .scroll-to{opacity:1}.scroll-to{opacity:0;display:block;width:40px;height:40px;line-height:40px;border-radius:50%;position:fixed;transform:translateZ(0);margin:30px;padding:0;bottom:0;font-size:18px;z-index:100000;transition:opacity .15s ease-in-out;right:0}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang-label);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file +.pull-start{float:left}.pull-end{float:right}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-right:20px!important}.margin-start{margin-left:20px!important}.margin-end-small{margin-right:10px!important}.margin-start-small{margin-left:10px!important}.margin-end-large{margin-right:50px!important}.margin-start-large{margin-left:50px!important}.margin-end-no{margin-right:0!important}.margin-start-no{margin-left:0!important}.margin-end-negative{margin-right:-30px!important}.margin-start-negative{margin-left:-30px!important}.margin-end-negative-small{margin-right:-15px!important}.margin-start-negative-small{margin-left:-15px!important}.margin-end-negative-tiny{margin-right:-5px!important}.margin-start-negative-tiny{margin-left:-5px!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:left}.text-align-end{text-align:right}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:left;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-left:30px}table td:last-child,table th:last-child{padding-right:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1000px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-left:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.row{margin:0 -30px;padding-left:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:right}.row.wide{margin:0 -100px;padding-left:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-right:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-right:100px}.row.thin{margin:0 -20px;padding-left:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-right:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-right:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:left;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-right:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-right:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-right:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-right:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-right:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-right:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-right:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-right:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-right:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-right:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-right:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-right:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-right:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-right:50px!important;float:left;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-right:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-right:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxNwAA8TcAAABWAADxOAAA8TgAAABXAADxcQAA8XEAAABYAADxegAA8XoAAABZAADxkwAA8ZMAAABaAADxnAAA8ZwAAABbAADxoAAA8aAAAABcAADxrQAA8a0AAABdAADxwAAA8cAAAABeAADxzQAA8c0AAABfAADx3AAA8dwAAABgAADx5QAA8eUAAABhAADx/gAA8f4AAABiAADyMQAA8jEAAABjAADyOgAA8joAAABkAADylgAA8pYAAABlAADyxgAA8sYAAABmAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMl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MgAwACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAAR1c2VyBmZvbGRlcgRsaXN0BWxvZ2luA2NvZwd0d2l0dGVyC2FydGljbGUtYWx0BmNhbmNlbARob21lCGRvd24tZGlyCGZhY2Vib29rCGFzdGVyaXNrBnVwbG9hZAlzdG9wd2F0Y2gGZXhwb3J0BWhlYXJ0BHBsdXMGdXAtZGlyBG1lbnUJbGVmdC1vcGVuCnJpZ2h0LW9wZW4FaW5ib3gGd3JlbmNoB2NvbW1lbnQNc3RhY2tvdmVyZmxvdwhxdWVzdGlvbgpvay1jaXJjbGVkB3dhcm5pbmcEbWFpbARsaW5rB2tleS1pbnYFdHJhc2gIZG93bmxvYWQHZ2xhc3NlcwZxcmNvZGUHc2h1ZmZsZQNleWUEbG9jawZzZWFyY2gEYmVsbAV1c2Vycwhsb2NhdGlvbglicmllZmNhc2UJaW5zdGFncmFtBWNsb2NrBXBob25lCGNhbGVuZGFyBXByaW50BGVk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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-angle-circled-left:before{content:'\f137'}.icon-angle-circled-right:before{content:'\f138'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:left}::-webkit-input-placeholder{text-align:left}input:-moz-placeholder{text-align:left}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#ff729b;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;right:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:left;padding:0 20px!important}.button.icon,button.icon{padding-right:30px!important}.button.icon-reduce,button.icon-reduce{padding-left:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#ff729b;border-color:#ff729b}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-right:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:right 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:left 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-right:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:right;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;left:20%;margin-left:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;left:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-right:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;right:0;border-left:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-left:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-right:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-left:30px;padding-right:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-left:5px;padding-right:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:left;margin-right:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:left;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-left:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;left:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-right:0!important;margin-bottom:0!important}.upload .button{float:left;margin-right:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:left;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:left;margin-right:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;right:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-left:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-right:15px;margin-left:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;left:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;left:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-right:10px;float:left}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;left:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:right 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-right:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:right;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-left:6px;margin-right:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-right:50px;padding-left:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-left:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-left:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;right:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;left:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:auto;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;right:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-left:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-right:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-right:30px;padding-left:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:left;margin-right:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-right:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;right:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-left:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:1200px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-right:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:1200px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-right:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;left:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-left:10px}article table td:last-child,article table th:last-child{padding-right:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;left:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-right:25px!important;padding-left:70px;right:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;left:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;right:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-right:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-left:50px;padding-right:30px;position:relative}.console .database .items li i{position:absolute;display:none;right:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:left;margin-right:20px!important}body>footer .copyright{padding-left:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:left}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:left}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}[data-views-current="0"] .scroll-to,[data-views-current="1"] .scroll-to{opacity:0!important}.scroll-to-bottom .scroll-to,.scroll-to-top .scroll-to{opacity:1}.scroll-to{opacity:0;display:block;width:40px;height:40px;line-height:40px;border-radius:50%;position:fixed;transform:translateZ(0);margin:30px;padding:0;bottom:0;font-size:18px;z-index:100000;transition:opacity .15s ease-in-out;right:0}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;left:-2px}.container .tabs .number{display:none}.container .tabs li{float:left;padding-right:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang-label);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;right:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;left:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-right:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-right:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:ltr}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right} \ No newline at end of file diff --git a/public/dist/styles/default-rtl.css b/public/dist/styles/default-rtl.css index e3cabe9eda..0023d74463 100644 --- a/public/dist/styles/default-rtl.css +++ b/public/dist/styles/default-rtl.css @@ -1 +1 @@ -.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-end-negative{margin-left:-30px!important}.margin-start-negative{margin-right:-30px!important}.margin-end-negative-small{margin-left:-15px!important}.margin-start-negative-small{margin-right:-15px!important}.margin-end-negative-tiny{margin-left:-5px!important}.margin-start-negative-tiny{margin-right:-5px!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1000px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxNwAA8TcAAABWAADxOAAA8TgAAABXAADxcQAA8XEAAABYAADxegAA8XoAAABZAADxkwAA8ZMAAABaAADxnAAA8ZwAAABbAADxoAAA8aAAAABcAADxrQAA8a0AAABdAADxwAAA8cAAAABeAADxzQAA8c0AAABfAADx3AAA8dwAAABgAADx5QAA8eUAAABhAADx/gAA8f4AAABiAADyMQAA8jEAAABjAADyOgAA8joAAABkAADylgAA8pYAAABlAADyxgAA8sYAAABmAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMl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MgAwACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAAR1c2VyBmZvbGRlcgRsaXN0BWxvZ2luA2NvZwd0d2l0dGVyC2FydGljbGUtYWx0BmNhbmNlbARob21lCGRvd24tZGlyCGZhY2Vib29rCGFzdGVyaXNrBnVwbG9hZAlzdG9wd2F0Y2gGZXhwb3J0BWhlYXJ0BHBsdXMGdXAtZGlyBG1lbnUJbGVmdC1vcGVuCnJpZ2h0LW9wZW4FaW5ib3gGd3JlbmNoB2NvbW1lbnQNc3RhY2tvdmVyZmxvdwhxdWVzdGlvbgpvay1jaXJjbGVkB3dhcm5pbmcEbWFpbARsaW5rB2tleS1pbnYFdHJhc2gIZG93bmxvYWQHZ2xhc3NlcwZxcmNvZGUHc2h1ZmZsZQNleWUEbG9jawZzZWFyY2gEYmVsbAV1c2Vycwhsb2NhdGlvbglicmllZmNhc2UJaW5zdGFncmFtBWNsb2NrBXBob25lCGNhbGVuZGFyBXByaW50BGVk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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-angle-circled-left:before{content:'\f137'}.icon-angle-circled-right:before{content:'\f138'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#ff729b;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#ff729b;border-color:#ff729b}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:auto;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:970px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}[data-views-current="0"] .scroll-to,[data-views-current="1"] .scroll-to{opacity:0!important}.scroll-to-bottom .scroll-to,.scroll-to-top .scroll-to{opacity:1}.scroll-to{opacity:0;display:block;width:40px;height:40px;line-height:40px;border-radius:50%;position:fixed;transform:translateZ(0);margin:30px;padding:0;bottom:0;font-size:18px;z-index:100000;transition:opacity .15s ease-in-out;left:0}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:970px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang-label);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file +.pull-start{float:right}.pull-end{float:left}img[src=""]{visibility:hidden;display:inline-block}.margin-end{margin-left:20px!important}.margin-start{margin-right:20px!important}.margin-end-small{margin-left:10px!important}.margin-start-small{margin-right:10px!important}.margin-end-large{margin-left:50px!important}.margin-start-large{margin-right:50px!important}.margin-end-no{margin-left:0!important}.margin-start-no{margin-right:0!important}.margin-end-negative{margin-left:-30px!important}.margin-start-negative{margin-right:-30px!important}.margin-end-negative-small{margin-left:-15px!important}.margin-start-negative-small{margin-right:-15px!important}.margin-end-negative-tiny{margin-left:-5px!important}.margin-start-negative-tiny{margin-right:-5px!important}.margin-top{margin-top:30px!important}.margin-bottom{margin-bottom:30px!important}.margin-top-no{margin-top:0!important}.margin-bottom-no{margin-bottom:0!important}.margin-top-xxl{margin-top:140px!important}.margin-top-xl{margin-top:80px!important}.margin-top-large{margin-top:50px!important}.margin-top-small{margin-top:15px!important}.margin-top-tiny{margin-top:5px!important}.margin-top-negative{margin-top:-30px!important}.margin-top-negative-tiny{margin-top:-5px!important}.margin-top-negative-small{margin-top:-15px!important}.margin-top-negative-large{margin-top:-50px!important}.margin-top-negative-xl{margin-top:-80px!important}.margin-top-negative-xxl{margin-top:-100px!important}.margin-bottom-xxl{margin-bottom:140px!important}.margin-bottom-xl{margin-bottom:80px!important}.margin-bottom-large{margin-bottom:50px!important}.margin-bottom-small{margin-bottom:15px!important}.margin-bottom-tiny{margin-bottom:5px!important}.margin-bottom-negative{margin-bottom:-30px!important}.margin-bottom-negative-tiny{margin-bottom:-5px!important}.margin-bottom-negative-small{margin-bottom:-15px!important}.margin-bottom-negative-large{margin-bottom:-50px!important}.margin-bottom-negative-xl{margin-bottom:-80px!important}.margin-bottom-negative-xl{margin-bottom:-100px!important}.ratio-wide{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-wide>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-square{height:0;overflow:hidden;padding-top:56%;position:relative;width:100%}.ratio-square>*{position:absolute;top:0;left:0;width:100%;height:100%}.clear:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}*{font-family:Poppins,sans-serif,Arial;-webkit-font-smoothing:antialiased;font-weight:300}h1,h2,h3,h4,h5,h6{margin:0}h4,h5,h6{font-weight:400}.link,a{color:#1e849e;text-decoration:none;border-left:2px solid transparent;border-right:2px solid transparent;border-bottom:solid 1px transparent}.link:hover,a:hover{border-bottom:dotted 1px #1e849e}.link.disabled,a.disabled{opacity:.5}.link.disabled:hover,a.disabled:hover{border-bottom:none}.link.tag:hover,a.tag:hover{border-bottom:none;opacity:.9}b,strong{font-weight:500}p{margin:0 0 20px 0;line-height:26px}small{font-size:16px;color:#818181}.text-size-small{font-size:13px}.text-size-normal{font-size:16px}.text-one-liner{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.text-bold{font-weight:400!important}.text-danger{color:#f53d3d}.text-success{color:#1bbf61}.text-upper{text-transform:uppercase}.text-warning{color:#ffed4d}.text-focus{color:#f02e65}.text-fade{color:#818181}.text-disclaimer{font-size:11px;color:#818181}.text-fade-extra{color:#818181;opacity:.5}.text-line-high-large{line-height:30px}.text-line-high-xl{line-height:40px}.text-sign{margin:5px 0;font-size:25px;width:25px;height:25px;line-height:25px;display:inline-block}.text-align-center{text-align:center}.text-align-start{text-align:right}.text-align-end{text-align:left}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-dir-ltr{direction:ltr;display:inline-block}.text-dir-rtl{direction:rtl;display:inline-block}.icon-dot-3:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}table{width:calc(100% + 60px);border-collapse:collapse;margin:-30px;border-radius:10px;overflow:hidden;position:relative;table-layout:fixed}table thead{box-shadow:0 0 2px rgba(0,0,0,.25);border-bottom:solid 1px #f1f3f5;font-size:14px}table thead th{position:sticky;top:0}table.small{font-size:14px}table.open-end tbody tr:last-child{border-bottom:none;font-weight:700;background:#f7fbf7}table.full tbody td,table.full tbody th{vertical-align:top;white-space:normal;overflow:auto;line-height:24px;padding-top:20px;padding-bottom:20px;height:auto}table .avatar{width:30px;height:30px}table tr{border-bottom:solid 1px #f1f3f5}table tr:last-child{border-bottom:none}table tr:nth-child(even){background:#fbfbfb}table th{text-align:right;font-weight:400}table th i{color:#818181;font-size:10px;display:inline-block;vertical-align:top;line-height:16px;padding:0 3px}table td,table th{height:65px;padding:0 15px;line-height:50px}table td:first-child,table th:first-child{padding-right:30px}table td:last-child,table th:last-child{padding-left:30px}@media only screen and (max-width:550px){table td:first-child,table th:first-child{width:auto}}table td,table th{overflow:hidden;white-space:nowrap}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){table.vertical{border-top:solid 1px #f1f3f5;display:block;overflow:hidden;padding-top:12px}table.vertical .hide{display:none}table.vertical tbody,table.vertical td,table.vertical th,table.vertical thead,table.vertical tr{width:100%;display:block}table.vertical th,table.vertical tr{padding-top:12px;padding-bottom:12px}table.vertical th:first-child,table.vertical tr:first-child{padding-top:0}table.vertical td,table.vertical th{padding:5px 20px!important;text-overflow:ellipsis;white-space:normal;height:40px;line-height:40px}table.vertical td:first-child,table.vertical td:last-child,table.vertical th:first-child,table.vertical th:last-child{padding:0 10px}table.vertical td:last-child,table.vertical th:last-child{padding-bottom:0}table.vertical td p,table.vertical th p{display:inline-block;width:calc(100% - 40px)}table.vertical td:before{content:attr(data-title);margin-right:4px;font-weight:400}table.vertical thead{display:none}}.zone{max-width:910px;margin:0 auto 40px auto}.zone.xxxl{max-width:calc(100% - 100px)}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.zone.xxxl{max-width:100%}}.zone.xxl{max-width:1000px}.zone.xl{max-width:910px}.zone.large{max-width:700px}.zone.medium{max-width:550px}.zone.small{max-width:320px}.row{position:relative;margin:0 -50px;padding-right:50px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.row{margin:0 -30px;padding-right:30px}}.row.force-ltr>.col{float:left}.row.force-rtl>.col{float:right}.row.force-reverse>.col{float:left}.row.wide{margin:0 -100px;padding-right:100px}.row.wide>.span-1{width:calc(8.33333333% * 1 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-2{width:calc(8.33333333% * 2 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-3{width:calc(8.33333333% * 3 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-4{width:calc(8.33333333% * 4 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-5{width:calc(8.33333333% * 5 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-6{width:calc(8.33333333% * 6 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-7{width:calc(8.33333333% * 7 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-8{width:calc(8.33333333% * 8 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-9{width:calc(8.33333333% * 9 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-10{width:calc(8.33333333% * 10 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-11{width:calc(8.33333333% * 11 - 100px);box-sizing:content-box;padding-left:100px}.row.wide>.span-12{width:calc(8.33333333% * 12 - 100px);box-sizing:content-box;padding-left:100px}.row.thin{margin:0 -20px;padding-right:20px}.row.thin>.span-1{width:calc(8.33333333% * 1 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-2{width:calc(8.33333333% * 2 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-3{width:calc(8.33333333% * 3 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-4{width:calc(8.33333333% * 4 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-5{width:calc(8.33333333% * 5 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-6{width:calc(8.33333333% * 6 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-7{width:calc(8.33333333% * 7 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-8{width:calc(8.33333333% * 8 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-9{width:calc(8.33333333% * 9 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-10{width:calc(8.33333333% * 10 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-11{width:calc(8.33333333% * 11 - 20px);box-sizing:content-box;padding-left:20px}.row.thin>.span-12{width:calc(8.33333333% * 12 - 20px);box-sizing:content-box;padding-left:20px}.row:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.row .col{float:right;box-sizing:border-box}.row .col.sticky-top{position:sticky;top:0}.row .col.sticky-bottom{position:sticky;bottom:0}.row .span-1{width:calc(8.33333333% * 1 - 40px);box-sizing:content-box;padding-left:40px}.row .span-2{width:calc(8.33333333% * 2 - 40px);box-sizing:content-box;padding-left:40px}.row .span-3{width:calc(8.33333333% * 3 - 40px);box-sizing:content-box;padding-left:40px}.row .span-4{width:calc(8.33333333% * 4 - 40px);box-sizing:content-box;padding-left:40px}.row .span-5{width:calc(8.33333333% * 5 - 40px);box-sizing:content-box;padding-left:40px}.row .span-6{width:calc(8.33333333% * 6 - 40px);box-sizing:content-box;padding-left:40px}.row .span-7{width:calc(8.33333333% * 7 - 40px);box-sizing:content-box;padding-left:40px}.row .span-8{width:calc(8.33333333% * 8 - 40px);box-sizing:content-box;padding-left:40px}.row .span-9{width:calc(8.33333333% * 9 - 40px);box-sizing:content-box;padding-left:40px}.row .span-10{width:calc(8.33333333% * 10 - 40px);box-sizing:content-box;padding-left:40px}.row .span-11{width:calc(8.33333333% * 11 - 40px);box-sizing:content-box;padding-left:40px}.row .span-12{width:calc(8.33333333% * 12 - 40px);box-sizing:content-box;padding-left:40px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.row.responsive{width:100%;padding:0;margin:0}.row.responsive>.span-1,.row.responsive>.span-10,.row.responsive>.span-11,.row.responsive>.span-12,.row.responsive>.span-2,.row.responsive>.span-3,.row.responsive>.span-4,.row.responsive>.span-5,.row.responsive>.span-6,.row.responsive>.span-7,.row.responsive>.span-8,.row.responsive>.span-9{width:calc(8.33333333% * 12 - 0px)!important;box-sizing:content-box!important;padding-left:0!important;width:100%!important}}.tiles{position:relative}.tiles:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.tiles li{margin-left:50px!important;float:right;width:calc(33% - 33px)}.tiles li .photo-title{width:calc(100% + 30px);height:15px;margin:-15px -15px 10px -15px;border-radius:10px 10px 0 0;background:#f1f3f5;border-bottom:solid 1px #f1f3f5}.tiles li:nth-child(3n){margin-left:0!important}@media only screen and (max-width:550px){.tiles li{width:100%;margin-left:0!important}}@font-face{font-family:fontello;src:url(data:application/octet-stream;base64,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) format('woff'),url(data:application/octet-stream;base64,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6DEAAAAyAADoMgAA6DIAAAAzAADoMwAA6DMAAAA0AADoNAAA6DQAAAA1AADoNQAA6DUAAAA2AADoNgAA6DYAAAA3AADoNwAA6DcAAAA4AADoOAAA6DgAAAA5AADoOQAA6DkAAAA6AADoOgAA6DoAAAA7AADoOwAA6DsAAAA8AADoPAAA6DwAAAA9AADoPQAA6D0AAAA+AADoPgAA6D4AAAA/AADoPwAA6D8AAABAAADoQAAA6EAAAABBAADoQQAA6EEAAABCAADoQgAA6EIAAABDAADoQwAA6EMAAABEAADoRAAA6EQAAABFAADoRQAA6EUAAABGAADoRgAA6EYAAABHAADoRwAA6EcAAABIAADwjgAA8I4AAABJAADwmwAA8JsAAABKAADwsAAA8LAAAABLAADwxQAA8MUAAABMAADwygAA8MoAAABNAADwywAA8MsAAABOAADwzQAA8M0AAABPAADw3AAA8NwAAABQAADw4QAA8OEAAABRAADxGAAA8RgAAABSAADxHAAA8RwAAABTAADxIQAA8SEAAABUAADxMgAA8TIAAABVAADxNwAA8TcAAABWAADxOAAA8TgAAABXAADxcQAA8XEAAABYAADxegAA8XoAAABZAADxkwAA8ZMAAABaAADxnAAA8ZwAAABbAADxoAAA8aAAAABcAADxrQAA8a0AAABdAADxwAAA8cAAAABeAADxzQAA8c0AAABfAADx3AAA8dwAAABgAADx5QAA8eUAAABhAADx/gAA8f4AAABiAADyMQAA8jEAAABjAADyOgAA8joAAABkAADylgAA8pYAAABlAADyxgAA8sYAAABmAAAAAgAA/7ECygMMABUAHgAlQCIABQEFbwMBAQQBbwAEAgRvAAIAAm8AAABmExcRERcyBgUaKyUUBiMhIiY1ND4DFxYyNzIeAwMUBiIuATYeAQLKRjH+JDFGChgqPi1JykoqQiYcCI98tHoEgqyERTxYWDwwVFY8KAFISCY+VFYBwFh+frCAAnwAAAL//v/OA+oC7gAOAB4AZEuwDVBYQCMAAwQEA2MFAQACAQIAAW0AAQFuAAQCAgRUAAQEAlcAAgQCSxtAIgADBANvBQEAAgECAAFtAAEBbgAEAgIEVAAEBAJXAAIEAktZQBEBAB0aFxQREAkGAA4BDQYFFCsBMhYHAw4BIyEiJwMmNjMl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MgAwACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8BQAFBAUIBQwFEAUUBRgFHAUgBSQFKAUsBTAFNAU4BTwFQAVEBUgFTAVQBVQFWAVcBWAFZAVoBWwFcAV0BXgFfAWABYQFiAWMBZAFlAWYBZwFoAAR1c2VyBmZvbGRlcgRsaXN0BWxvZ2luA2NvZwd0d2l0dGVyC2FydGljbGUtYWx0BmNhbmNlbARob21lCGRvd24tZGlyCGZhY2Vib29rCGFzdGVyaXNrBnVwbG9hZAlzdG9wd2F0Y2gGZXhwb3J0BWhlYXJ0BHBsdXMGdXAtZGlyBG1lbnUJbGVmdC1vcGVuCnJpZ2h0LW9wZW4FaW5ib3gGd3JlbmNoB2NvbW1lbnQNc3RhY2tvdmVyZmxvdwhxdWVzdGlvbgpvay1jaXJjbGVkB3dhcm5pbmcEbWFpbARsaW5rB2tleS1pbnYFdHJhc2gIZG93bmxvYWQHZ2xhc3NlcwZxcmNvZGUHc2h1ZmZsZQNleWUEbG9jawZzZWFyY2gEYmVsbAV1c2Vycwhsb2NhdGlvbglicmllZmNhc2UJaW5zdGFncmFtBWNsb2NrBXBob25lCGNhbGVuZGFyBXByaW50BGVk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) format('truetype')}[class*=" icon-"]:before,[class^=icon-]:before{font-family:fontello;font-style:normal;font-weight:400;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em}.icon-user:before{content:'\e800'}.icon-folder:before{content:'\e801'}.icon-list:before{content:'\e802'}.icon-login:before{content:'\e803'}.icon-cog:before{content:'\e804'}.icon-twitter:before{content:'\e805'}.icon-article-alt:before{content:'\e806'}.icon-cancel:before{content:'\e807'}.icon-home:before{content:'\e808'}.icon-down-dir:before{content:'\e809'}.icon-facebook:before{content:'\e80a'}.icon-asterisk:before{content:'\e80b'}.icon-upload:before{content:'\e80c'}.icon-stopwatch:before{content:'\e80d'}.icon-export:before{content:'\e80e'}.icon-heart:before{content:'\e80f'}.icon-plus:before{content:'\e810'}.icon-up-dir:before{content:'\e811'}.icon-menu:before{content:'\e812'}.icon-left-open:before{content:'\e813'}.icon-right-open:before{content:'\e814'}.icon-inbox:before{content:'\e815'}.icon-wrench:before{content:'\e816'}.icon-comment:before{content:'\e817'}.icon-stackoverflow:before{content:'\e818'}.icon-question:before{content:'\e819'}.icon-ok-circled:before{content:'\e81a'}.icon-warning:before{content:'\e81b'}.icon-mail:before{content:'\e81c'}.icon-link:before{content:'\e81d'}.icon-key-inv:before{content:'\e81e'}.icon-trash:before{content:'\e81f'}.icon-download:before{content:'\e820'}.icon-glasses:before{content:'\e821'}.icon-qrcode:before{content:'\e822'}.icon-shuffle:before{content:'\e823'}.icon-eye:before{content:'\e824'}.icon-lock:before{content:'\e825'}.icon-search:before{content:'\e826'}.icon-bell:before{content:'\e827'}.icon-users:before{content:'\e828'}.icon-location:before{content:'\e829'}.icon-briefcase:before{content:'\e82a'}.icon-instagram:before{content:'\e82b'}.icon-clock:before{content:'\e82c'}.icon-phone:before{content:'\e82d'}.icon-calendar:before{content:'\e82e'}.icon-print:before{content:'\e82f'}.icon-edit:before{content:'\e830'}.icon-bold:before{content:'\e831'}.icon-italic:before{content:'\e832'}.icon-rocket:before{content:'\e833'}.icon-whatsapp:before{content:'\e834'}.icon-dot-3:before{content:'\e835'}.icon-info-circled:before{content:'\e836'}.icon-videocam:before{content:'\e837'}.icon-quote-right:before{content:'\e838'}.icon-picture:before{content:'\e839'}.icon-palette:before{content:'\e83a'}.icon-lamp:before{content:'\e83b'}.icon-book-open:before{content:'\e83c'}.icon-ok:before{content:'\e83d'}.icon-chat-alt:before{content:'\e83e'}.icon-archive:before{content:'\e83f'}.icon-play:before{content:'\e840'}.icon-pause:before{content:'\e841'}.icon-down-open:before{content:'\e842'}.icon-up-open:before{content:'\e843'}.icon-minus:before{content:'\e844'}.icon-exchange:before{content:'\e845'}.icon-network:before{content:'\e846'}.icon-discord:before{content:'\e847'}.icon-link-ext:before{content:'\f08e'}.icon-github-circled:before{content:'\f09b'}.icon-filter:before{content:'\f0b0'}.icon-docs:before{content:'\f0c5'}.icon-list-bullet:before{content:'\f0ca'}.icon-list-numbered:before{content:'\f0cb'}.icon-underline:before{content:'\f0cd'}.icon-sort:before{content:'\f0dc'}.icon-linkedin:before{content:'\f0e1'}.icon-smile:before{content:'\f118'}.icon-keyboard:before{content:'\f11c'}.icon-code:before{content:'\f121'}.icon-shield:before{content:'\f132'}.icon-angle-circled-left:before{content:'\f137'}.icon-angle-circled-right:before{content:'\f138'}.icon-bitbucket:before{content:'\f171'}.icon-windows:before{content:'\f17a'}.icon-wheelchair:before{content:'\f193'}.icon-bank:before{content:'\f19c'}.icon-google:before{content:'\f1a0'}.icon-building-filled:before{content:'\f1ad'}.icon-database:before{content:'\f1c0'}.icon-lifebuoy:before{content:'\f1cd'}.icon-header:before{content:'\f1dc'}.icon-binoculars:before{content:'\f1e5'}.icon-chart-area:before{content:'\f1fe'}.icon-pinterest:before{content:'\f231'}.icon-medium:before{content:'\f23a'}.icon-gitlab:before{content:'\f296'}.icon-telegram:before{content:'\f2c6'}.datalist-polyfill{list-style:none;display:none;background:#fff;box-shadow:0 2px 2px #999;position:absolute;left:0;top:0;margin:0;padding:0;max-height:300px;overflow-y:auto}.datalist-polyfill:empty{display:none!important}.datalist-polyfill>li{padding:3px;font:13px "Lucida Grande",Sans-Serif}.datalist-polyfill__active{background:#3875d7;color:#fff}date-input-polyfill{z-index:1000!important;max-width:320px!important;width:320px!important}date-input-polyfill .monthSelect-wrapper,date-input-polyfill .yearSelect-wrapper{height:50px;line-height:50px;padding:0;width:40%!important;margin-bottom:10px!important}date-input-polyfill .monthSelect-wrapper select,date-input-polyfill .yearSelect-wrapper select{padding:0 12px;height:50px;line-height:50px;box-sizing:border-box}date-input-polyfill .yearSelect-wrapper{width:35%!important}date-input-polyfill table{width:100%!important;max-width:100%!important;padding:0 12px 12px 12px!important;box-sizing:border-box;margin:0}date-input-polyfill table td:first-child,date-input-polyfill table td:last-child,date-input-polyfill table th:first-child,date-input-polyfill table th:last-child{width:32px!important;padding:4px!important}date-input-polyfill select{margin-bottom:10px}date-input-polyfill button{width:25%!important;height:50px!important;line-height:50px!important;margin-bottom:10px!important;background:inherit;position:relative;color:inherit;padding:inherit;box-sizing:inherit;border-radius:inherit;font-size:inherit;box-shadow:none;border:none;border-bottom:none!important}::placeholder{color:#868686;text-align:right}::-webkit-input-placeholder{text-align:right}input:-moz-placeholder{text-align:right}.button,button{display:inline-block;background:#f02e65;border-radius:26px;border:none;color:#fff;height:52px;line-height:52px;padding:0 25px;cursor:pointer;font-size:16px;box-sizing:border-box;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.button:focus,.button:hover,button:focus,button:hover{background:#ff729b;border-bottom:none}.button.fly,button.fly{position:fixed;z-index:2;bottom:30px;left:30px}.button.fill,button.fill{display:block;width:100%;text-align:center;padding:0 10px!important}.button.fill-aligned,button.fill-aligned{display:block;width:100%;text-align:right;padding:0 20px!important}.button.icon,button.icon{padding-left:30px!important}.button.icon-reduce,button.icon-reduce{padding-right:15px!important}.button.reverse,button.reverse{background:0 0;height:50px;line-height:48px;padding:0 23px;color:#f02e65;border:solid 2px #f02e65}.button.reverse:focus,.button.reverse:hover,button.reverse:focus,button.reverse:hover{color:#ff729b;border-color:#ff729b}.button.round,button.round{width:52px;padding:0}.button.round.small,button.round.small{font-size:12px;width:30px;height:30px;line-height:30px}.button.white,button.white{background:#fff;color:#f02e65}.button.white.reverse,button.white.reverse{color:#fff;background:0 0;border:solid 2px #fff}.button.trans,button.trans{background:0 0!important}.button.trans.reverse,button.trans.reverse{background:0 0!important}.button.success,button.success{background:#1bbf61}.button.success.reverse,button.success.reverse{color:#1bbf61;background:#fff;border:solid 2px #1bbf61}.button.danger,button.danger{background:#f53d3d}.button.danger.reverse,button.danger.reverse{color:#f53d3d;background:#fff;border:solid 2px #f53d3d}.button .disabled,.button.disabled,.button:disabled,button .disabled,button.disabled,button:disabled{background:#818181;cursor:default}.button.link,button.link{background:0 0;border-radius:0;color:#1e849e;height:auto;line-height:normal;padding:0;padding-left:0!important}.button.link:hover,button.link:hover{border-bottom:dotted 1px #1e849e}.button.link:focus,button.link:focus{box-shadow:inherit}.button.strip,button.strip{background:0 0;height:auto;line-height:16px;color:inherit;padding:0 5px}.button.facebook,button.facebook{color:#fff!important;background:#4070b4!important}.button.twitter,button.twitter{color:#fff!important;background:#56c2ea!important}.button.linkedin,button.linkedin{color:#fff!important;background:#0076b5!important}.button.github,button.github{color:#fff!important;background:#7e7c7c!important}.button:focus,button:focus{outline:0}label{margin-bottom:15px;display:block;line-height:normal}.input,input[type=date],input[type=datetime-local],input[type=email],input[type=file],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=url],select,textarea{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px}.input[type=file],input[type=date][type=file],input[type=datetime-local][type=file],input[type=email][type=file],input[type=file][type=file],input[type=number][type=file],input[type=password][type=file],input[type=search][type=file],input[type=tel][type=file],input[type=text][type=file],input[type=url][type=file],select[type=file],textarea[type=file]{line-height:0;padding:15px;height:auto}.input[xtype=file],input[type=date][xtype=file],input[type=datetime-local][xtype=file],input[type=email][xtype=file],input[type=file][xtype=file],input[type=number][xtype=file],input[type=password][xtype=file],input[type=search][xtype=file],input[type=tel][xtype=file],input[type=text][xtype=file],input[type=url][xtype=file],select[xtype=file],textarea[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.input[xtype=file]:disabled,input[type=date][xtype=file]:disabled,input[type=datetime-local][xtype=file]:disabled,input[type=email][xtype=file]:disabled,input[type=file][xtype=file]:disabled,input[type=number][xtype=file]:disabled,input[type=password][xtype=file]:disabled,input[type=search][xtype=file]:disabled,input[type=tel][xtype=file]:disabled,input[type=text][xtype=file]:disabled,input[type=url][xtype=file]:disabled,select[xtype=file]:disabled,textarea[xtype=file]:disabled{opacity:0!important}.input:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=email]:focus,input[type=file]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=url]:focus,select:focus,textarea:focus{outline:0;border-color:#b3d7fd}.input:disabled,input[type=date]:disabled,input[type=datetime-local]:disabled,input[type=email]:disabled,input[type=file]:disabled,input[type=number]:disabled,input[type=password]:disabled,input[type=search]:disabled,input[type=tel]:disabled,input[type=text]:disabled,input[type=url]:disabled,select:disabled,textarea:disabled{background:#f1f3f5}.input.strip,input[type=date].strip,input[type=datetime-local].strip,input[type=email].strip,input[type=file].strip,input[type=number].strip,input[type=password].strip,input[type=search].strip,input[type=tel].strip,input[type=text].strip,input[type=url].strip,select.strip,textarea.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.input.strip:focus,input[type=date].strip:focus,input[type=datetime-local].strip:focus,input[type=email].strip:focus,input[type=file].strip:focus,input[type=number].strip:focus,input[type=password].strip:focus,input[type=search].strip:focus,input[type=tel].strip:focus,input[type=text].strip:focus,input[type=url].strip:focus,select.strip:focus,textarea.strip:focus{border-color:#b3d7fd}input[type=email],input[type=url]{direction:ltr}input[type=email]::placeholder,input[type=url]::placeholder{text-align:left;direction:ltr}select{background:0 0;-webkit-appearance:none;background-image:url("data:image/svg+xml;utf8,");background-position:left 15px top 50%;background-repeat:no-repeat;background-color:#fff;width:calc(100% - 62px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-left:45px}select:-webkit-autofill{background-image:url("data:image/svg+xml;utf8,")!important;background-position:100% 50%!important;background-repeat:no-repeat!important}input[type=search],input[type=search].strip{background:0 0;-webkit-appearance:none;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAdZJREFUWIXt1s2LjWEYBvDfnDMzFpNIamZIFrMiJYMyFmKhZKfOwoiFr2LFn2BByG6WVrKwMcjWxgoLIlKIUk6RrzAjZWZ8LO731FlwvB+PUbjq6X0X7/VeV/d9P9fz8IdRL8Hpw3x8w0xaOz9GNxq4gJeZcGs1cRab0fU7xLfgMSYzoT3YgNXYhIO4iM+4iTWphGs4jikcFSXvhEGczr4/UFW8C2N4jXUFudvwCYeqGNgnSr6yJH8rpkWLCqMfE9hdUryFE3iC3qLEk7ij+kT34Q32FiHV8Qr7K4q3cArXihCGxd5elMjARnzBvE4f1dreV+AtnicycC/7/7K8BhaIvqXCO3zFwrwGZtCT0EAtW9N5DTSxWGR/CizNns/yEgbFEK5NZGCnaEPHE7e9Ai9wA6OJDIzistgJubFdxHB/RfFVYgCHixJruI5x5dNwDm6J47sUhkTvjpUw0Y1zeOrXR3hHjOA9zmBuTs4Arog4/yhuUZWwHPdFMh7280BZgiP4ILJ/UuymqRQmejPxphiquzgvKnMJDzOxB9glZqiRiecykbfHdawX98EhcdxO4BGu4nYm2EJDzEKPSMIdYrBnFYUq8d/EP2di1gey3cS4ErflvxffASbhcakIINaMAAAAAElFTkSuQmCC);background-position:right 15px top 50%;background-repeat:no-repeat;background-size:20px 20px;width:calc(100% - 60px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:45px}select[multiple]{min-height:75px;padding:5px 10px!important;padding-left:50px!important}select[multiple] option{padding:10px 4px;border-bottom:solid 1px #f1f1f1}select[multiple] option:last-child{border-bottom:none}textarea{min-height:75px;resize:vertical;line-height:32px;padding:5px 15px}textarea.tall{min-height:180px}fieldset{border:none;margin:0;padding:0}.counter{font-size:13px;float:left;margin-top:-20px}.file-preview{background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAIElEQVQoU2NkYGAwZsAEZ9GFGIeIQix+wfQgyDODXSEAcUwGCrDSHgkAAAAASUVORK5CYII=)!important;border:solid 1px #e2e2e2;box-shadow:inset 0 0 3px #a0a0a0;border-radius:8px;width:calc(100% - 2px);max-height:180px;visibility:visible!important}.video-preview{padding-top:56%;position:relative;border-radius:10px;background:#e7e7e7;overflow:hidden;margin:0}.video-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.map-preview{padding-top:50%;position:relative;margin-bottom:10px;border-radius:10px;background:#e7e7e7;overflow:hidden;box-shadow:0 0 30px rgba(218,218,218,.5)}.map-preview iframe{position:absolute;top:0;width:100%;height:100%;border:none}.tooltip{position:relative}.tooltip.large:hover:after{white-space:normal;width:280px}.tooltip:hover:after{white-space:nowrap;background:#333;border-radius:5px;bottom:26px;color:#fff;content:attr(data-tooltip);padding:5px 15px;position:absolute;font-size:13px;line-height:20px;z-index:98;right:20%;margin-right:-30px}.tooltip:hover:before{border:solid;border-color:#333 transparent;border-width:6px 6px 0 6px;bottom:20px;content:"";position:absolute;z-index:99;right:5px}.tooltip.down:hover:after{top:26px;bottom:inherit}.tooltip.down:hover:before{top:20px;border-width:0 6px 6px 6px;bottom:inherit}.tag{display:inline-block;background:#e7e7e7;color:#868686;border-radius:12px;line-height:24px;padding:0 8px;font-size:12px;box-shadow:none!important;border:none;height:auto;width:auto;white-space:nowrap;text-overflow:ellipsis}.tag:hover{border:none}.tag.green{background:#1bbf61;color:#fff}.tag.red{background:#f53d3d;color:#fff}.tag.yellow{background:#ffe28b;color:#494949}.tag.focus{background:#f02e65;color:#fff}.tag.dark{background:#6f6f6f;color:#e7e7e7}.tag.blue{background:#4abde8;color:#fff}.tag.link{background:#1e849e;color:#fff}input[type=checkbox]{width:26px;height:16px;position:relative;-webkit-appearance:none;border-radius:0;border:none;background:0 0;vertical-align:middle}input[type=checkbox]:after{content:"";display:block;width:20px;height:20px;background:#fff;top:-5px;border-radius:50%;position:absolute;border:solid 3px #f02e65;vertical-align:middle}input[type=checkbox]:checked:after{text-align:center;font-family:fontello;content:'\e83d';font-size:16px;line-height:20px;color:#fff;background:#f02e65}input[type=checkbox]:focus{outline:0}input[type=checkbox]:focus:after,input[type=checkbox]:hover:after{outline:0;border-color:#000}input[type=checkbox]:checked:focus:after,input[type=checkbox]:checked:hover:after{border-color:#f02e65}.input-copy{position:relative}.input-copy input,.input-copy textarea{padding-left:65px;width:calc(100% - 82px);resize:none}.input-copy .copy{position:absolute;top:0;left:0;border-right:solid 1px #e2e2e2;height:calc(100% - 2px);width:50px;line-height:50px;text-align:center;background:#fbfbfb;margin:1px;border-radius:0 10px 10px 0}.paging{color:#8d8e8e;padding:5px 15px;font-size:12px}.paging form{display:inline-block}.blue-snap iframe{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;float:none!important;height:40px!important;width:calc(100% - 32px)!important;border:solid 1px #e2e2e2!important;background:0 0!important;position:static!important}.blue-snap iframe[type=file]{line-height:0;padding:15px;height:auto}.blue-snap iframe[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.blue-snap iframe[xtype=file]:disabled{opacity:0!important}.blue-snap iframe:focus{outline:0;border-color:#b3d7fd}.blue-snap iframe:disabled{background:#f1f3f5}.blue-snap iframe.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.blue-snap iframe.strip:focus{border-color:#b3d7fd}.blue-snap .error{font-size:12px;margin-top:-25px;color:#f53d3d;height:40px;padding-right:2px}.pell{height:auto;padding-bottom:0;margin-bottom:0;padding-top:0;background:#fff;line-height:normal!important}.pell.hide{padding:0!important;height:1px;min-height:1px;max-height:1px;border:none;box-shadow:none;margin-bottom:20px;opacity:0}.pell [contenteditable=true]:empty:before{content:attr(placeholder);display:block;color:#868686}.pell .pell-actionbar{border-bottom:solid 1px #e7e7e7;margin:0 -15px 15px -15px;padding:10px 15px}.pell .pell-content{min-height:100px;display:block;padding:10px;margin:-10px;cursor:text}.pell .pell-content:focus{outline:0}.pell button{background:inherit;color:inherit;margin:0;padding:0;padding-left:15px;height:40px;line-height:40px;box-shadow:none;cursor:pointer;font-size:13px;border-radius:0}.pell button.pell-button-selected,.pell button:focus,.pell button:hover{color:#1e849e}.pell h1,.pell h2,.pell h3,.pell h4,.pell h5,.pell h6{text-align:inherit;margin-bottom:30px}.pell b,.pell strong{font-weight:700}.pell ol,.pell ul{margin:0 0 20px 0}.pell ol li,.pell ul li{display:list-item!important;list-style:inherit;margin-bottom:10px}.pell ol li p,.pell ul li p{margin:0}.pell ul li{margin:0 20px;display:list-item}label.switch{line-height:42px}input[type=checkbox].switch{width:67px;height:42px;line-height:42px;border-radius:21px;background:#818181;display:block;margin:0;padding:5px;padding-right:30px;padding-left:5px}input[type=checkbox].switch:checked{background:#f02e65;padding-right:5px;padding-left:30px}input[type=checkbox].switch:focus:after,input[type=checkbox].switch:hover:after{background:#fff}input[type=checkbox].switch:after{content:"";display:block;width:32px;height:32px;background:#fff;border-radius:50%;border:none;position:static;top:0}.password-meter{margin:-41px 10px 30px 10px;height:2px;background:0 0;max-width:100%;z-index:2;position:relative}.password-meter.weak{background:#f53d3d}.password-meter.medium{background:#ffed4d}.password-meter.strong{background:#1bbf61}.color-input:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.color-input .color-preview{width:53px;height:53px;float:right;margin-left:10px;background:#000;border-radius:10px;box-shadow:inset 0 0 3px #a0a0a0;position:relative}.color-input .color-preview input{opacity:0;position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%;cursor:pointer}.color-input input{text-transform:uppercase;float:right;width:calc(100% - 95px)}.grecaptcha-badge{box-shadow:none!important;border-radius:10px!important;overflow:hidden!important;background:#4d92df!important;bottom:25px}.grecaptcha-badge:hover{width:256px!important}.back{font-size:15px;line-height:24px;height:24px;margin-right:-15px;margin-top:-25px;margin-bottom:20px}hr{height:1px;background:#eceff1;border:none}.upload{position:relative}.upload:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload input{position:absolute;top:0;right:0;opacity:0;cursor:pointer}.upload.single .preview{height:0;position:relative;padding-top:100%;width:100%;margin-bottom:15px!important}.upload.single .preview li{position:absolute;top:0;width:calc(100% - 20px);height:calc(100% - 20px);margin-left:0!important;margin-bottom:0!important}.upload .button{float:right;margin-left:20px!important}.upload .button.disabled,.upload .button.disabled:hover{background:0 0;color:inherit;border-color:inherit}.upload .count{float:right;line-height:52px}.upload .progress{background:#1bbf61;height:6px;border-radius:3px;margin-bottom:15px!important}.upload .preview:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.upload .preview li{float:right;margin-left:20px!important;margin-bottom:15px!important;background:#f1f1f1;width:150px;height:150px;line-height:148px;text-align:center;border-radius:20px;overflow:hidden;position:relative;cursor:pointer;border:solid 10px #f1f1f1}.upload .preview li:hover:before{background:#f02e65}.upload .preview li:before{content:'\e807';font-family:fontello;font-size:12px;position:absolute;width:20px;height:20px;display:block;top:5px;left:5px;text-align:center;line-height:20px;vertical-align:middle;border-radius:50%;background:#484848;color:#fff;z-index:1}.upload .preview li img{vertical-align:middle;max-height:150px;max-width:150px;-webkit-filter:drop-shadow(0 0 6px rgba(0, 0, 0, .3));filter:drop-shadow(0 0 1px rgba(0, 0, 0, .3))}.upload.wide .preview li{height:0;width:100%;position:relative;padding-top:30.547%;background:#e7e7e7;border-radius:10px;overflow:hidden;border:solid 1px #f9f9f9;margin:0}.upload.wide .preview li img{border-radius:10px;position:absolute;top:0;width:100%;display:block;opacity:1;max-width:inherit;max-height:inherit}ol{list-style:none;counter-reset:x-counter;padding:0}ol li{counter-increment:x-counter;line-height:30px;margin-bottom:30px;margin-right:45px}ol li::before{display:inline-block;content:counter(x-counter);color:#f02e65;color:#fff;background:#fff;background:#f02e65;border:solid 2px #f02e65;margin-left:15px;margin-right:-45px;width:26px;height:26px;border-radius:50%;text-align:center;line-height:26px}.required{color:#f53d3d;font-size:8px;position:relative;top:-8px}.drop-list{position:relative;outline:0}.drop-list.open ul{display:block}.drop-list ul{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none;box-shadow:0 0 6px rgba(0,0,0,.1);display:none;position:absolute;bottom:calc(100% + 10px);z-index:2;padding:0;right:-10px;max-width:280px;min-width:240px;overflow:hidden}.drop-list ul.padding-small{padding:15px}.drop-list ul.y-scroll{overflow-y:auto}.drop-list ul.danger{background:#f53d3d;color:#fff}.drop-list ul.focus{background:#f02e65;color:#fff}.drop-list ul.focus .button,.drop-list ul.focus button{background:#fff;color:#f02e65}.drop-list ul.warning{background:#ffed4d;color:#2d2d2d}.drop-list ul.warning .button,.drop-list ul.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.drop-list ul>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.drop-list ul hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.drop-list ul .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.drop-list ul .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.drop-list ul .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.drop-list ul .toggle .icon-minus{display:none}.drop-list ul .toggle .content{display:none}.drop-list ul .toggle.open{height:auto}.drop-list ul .toggle.open .icon-minus{display:block}.drop-list ul .toggle.open .icon-plus{display:none}.drop-list ul .toggle.open .content{display:block}.drop-list ul .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.drop-list ul .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.drop-list ul.new{text-align:center}.drop-list ul.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.drop-list ul.new b{margin-top:20px;display:block}.drop-list ul:before{border:solid;border-color:#fff transparent;border-width:8px 8px 0 8px;bottom:-8px;content:"";position:absolute;z-index:99;right:30px}.drop-list ul li{border-bottom:solid 1px #f1f3f5;margin:0;padding:0}.drop-list ul li:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.drop-list ul li .link,.drop-list ul li a{vertical-align:middle;height:30px;line-height:30px;display:block;padding:10px 25px;color:inherit;font-size:14px;border:none;max-width:260px;cursor:pointer}.drop-list ul li .link:hover,.drop-list ul li a:hover{background:#f1f3f5;border-color:transparent}.drop-list ul li.disabled .link:hover,.drop-list ul li.disabled a:hover{background:0 0}.drop-list ul li .avatar{width:30px;height:30px;margin-left:10px;float:right}.drop-list ul li:last-child{border-bottom:none}.drop-list.bottom ul{bottom:auto;margin-top:-2px}.drop-list.bottom ul:before{bottom:auto;top:-8px;border-width:0 8px 8px 8px}.disabled{opacity:.2;cursor:default}.disabled .button,.disabled .link,.disabled a,.disabled button{cursor:default!important}.disabled .button:hover,.disabled .link:hover,.disabled a:hover,.disabled button:hover{background:0 0}.tags{-webkit-appearance:none;-moz-appearance:none;-webkit-transform:translateZ(0);box-sizing:content-box;height:40px;line-height:40px;border:solid 1px #e2e2e2;border-radius:10px;padding:5px 15px;font-size:16px;display:block;width:calc(100% - 32px);margin-bottom:30px;background:#fff;min-height:42px;height:auto}.tags[type=file]{line-height:0;padding:15px;height:auto}.tags[xtype=file]{line-height:normal;height:auto;border:none;position:absolute;top:0;right:0;bottom:0;opacity:0;cursor:pointer;padding:0;margin:0;font-size:0;width:100%}.tags[xtype=file]:disabled{opacity:0!important}.tags:focus{outline:0;border-color:#b3d7fd}.tags:disabled{background:#f1f3f5}.tags.strip{border:none;border-radius:0;padding:5px 0;width:100%;background-color:transparent;background-position:left 2px top 50%;border-bottom:solid 1px #e2e2e2;color:#868686}.tags.strip:focus{border-color:#b3d7fd}.tags .add{display:inline-block!important;border:none;padding:0;width:auto;margin:0}.tags ul.tags-list{display:inline}.tags ul.tags-list li{display:inline-block!important;margin-left:10px;font-size:16px;padding:5px 10px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.tags ul.tags-list li::before{float:left;content:'\e807';font-family:fontello;font-style:normal;display:inline-block;text-align:center;line-height:16px;width:16px;height:16px;font-size:12px;background:#000;color:#fff;border-radius:50%;margin-top:4px;margin-bottom:4px;margin-right:6px;margin-left:0}.console{height:100%;width:100%;padding:0}.console body{position:relative;height:calc(100% - 70px);width:calc(100% - 320px);padding-top:70px;padding-bottom:0;padding-left:50px;padding-right:270px;margin:0;color:#4b4b4b;background:#eceff1}.console body .project-only{display:none!important}.console body.show-nav .project-only{display:inline-block!important}.console body.hide-nav .console-back{display:block}.console body.hide-nav .account{display:none}.console body.index .console-back{display:none}.console body.index .account{display:block}.console body .console-back{display:none}.console body:before{content:'';display:block;position:absolute;width:calc(100% - 220px);height:100px;top:-100px;left:0;right:0;background:#fff;z-index:1000;border-right:solid 220px #132a3b}.console header{position:fixed;top:0;width:calc(100% - 280px);height:40px;line-height:40px;padding:15px 30px;background:#fff;box-shadow:0 0 2px rgba(0,0,0,.1);margin:0 -50px;z-index:2;font-size:14px}.console header .setup-new{width:40px;height:40px;line-height:40px}.console header .list{width:240px}.console header .list select{height:40px;line-height:40px;padding-top:0;padding-bottom:0;border:none;border-radius:26px;background-color:#ececec;color:#868686}.console header .account{margin-right:25px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.console header .account:hover{border-bottom:none}.console header .avatar{height:40px;width:40px}.console header .notifications{position:relative;font-size:20px}.console header .notifications a{color:#1b3445}.console header .notifications:after{position:absolute;content:"";display:block;background:#f53d3d;width:8px;height:8px;border-radius:50%;top:3px;left:3px}.console header nav{background:#1b3445;background:linear-gradient(#132a3b,#302839);background:linear-gradient(#143650,#302839);color:#788c99;position:fixed;height:100%;width:220px;top:0;right:0}.console header nav .logo{height:39px;padding:15px 20px;display:block;border-bottom:none}.console header nav .logo:hover{border-bottom:none}.console header nav .logo img{display:inline-block;margin-top:9px;width:75%}.console header nav .logo svg g{fill:#f02e65}.console header nav .icon{display:block;border:none;margin:18px 10px 50px 10px}.console header nav .icon img{display:block}.console header nav .icon:hover{border-bottom:none}.console header nav .icon:hover svg g{fill:#f02e65}.console header nav .container{overflow:auto;height:calc(100% - 183px);padding-bottom:50px;width:100%}.console header nav .project-box{padding:20px;text-align:center;display:block;border:none;line-height:100px;height:100px}.console header nav .project-box img{max-height:80px;max-width:80%;display:inline-block;vertical-align:middle}.console header nav .project{display:block;padding:85px 25px 20px 25px;color:#788c99;position:relative;border:none;height:20px}.console header nav .project:hover{border-bottom:none}.console header nav .project .name{height:20px;line-height:20px;margin:0;padding:0;display:inline-block;max-width:100%}.console header nav .project .arrow{display:block;position:absolute;left:5px;top:10px;width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #788c99;transform:rotate(225deg)}.console header nav .project img{position:absolute;bottom:40px;display:block;margin-bottom:10px;max-height:35px;max-width:40%}.console header nav .subtitle{padding:0 30px;display:block;font-size:12px;font-weight:300}.console header nav .links{margin-bottom:15px!important}.console header nav .links.top{border:none;padding-bottom:0;margin-bottom:5px!important}.console header nav .links.bottom{position:absolute;bottom:0;left:0;right:0;padding-bottom:0;border:none;margin-bottom:0!important}.console header nav .links.bottom a{border-top:solid 1px #2a253a;border-bottom:none}.console header nav .links .sub{display:inline-block;border:none;width:25px;height:25px;line-height:25px;border-radius:50%;padding:0;background:#f02e65;color:#fff;text-align:center;font-size:12px;margin:18px}.console header nav .links .sub i{width:auto;margin:0}.console header nav .links .sub:hover{border:none}.console header nav .links a{padding:8px 20px;border:none;display:block;color:#87a5b9;font-weight:400;border-right:solid 5px transparent;font-size:13px}.console header nav .links a i{margin-left:8px;width:22px;display:inline-block}.console header nav .links a.selected,.console header nav .links a:hover{color:#e4e4e4;font-weight:500}.console header nav:after{content:'';display:block;position:absolute;background:#302839;height:100px;width:100%;bottom:-100px}.console>footer{width:calc(100% + 100px);margin:0 -50px;box-sizing:border-box;background:0 0;padding-left:30px;padding-right:30px}.console>footer ul{float:none;text-align:center}.console>footer ul li{float:none;display:inline-block}.console .projects{position:relative}.console .projects:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.console .projects li{float:right;margin-left:50px;margin-bottom:50px;width:270px}.console .projects li.new,.console .projects li:nth-child(3n){margin-left:0}.console .dashboard{padding:20px;min-height:95px;overflow:hidden;position:relative;z-index:1}.console .dashboard hr{margin:20px -20px}.console .dashboard footer{margin:-20px;padding:20px;background:#fcfeff;border:none;color:#1e849e}.console .dashboard .col{position:relative}.console .dashboard .col:last-child:after{display:none}.console .dashboard .col:after{content:"";display:block;width:2px;background:#eceff1;height:calc(100% + 110px);position:absolute;top:-20px;bottom:-20px;left:24px}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.console .dashboard .col:after{width:calc(100% + 40px);height:3px;position:static;margin:20px -20px}}.console .dashboard .value{color:#f02e65;vertical-align:bottom;line-height:45px}.console .dashboard .value .sum{font-size:45px;line-height:45px;font-weight:700;vertical-align:bottom}.console .dashboard .unit{font-weight:500;line-height:20px;vertical-align:bottom;font-size:16px;display:inline-block;margin-bottom:5px;margin-right:5px;color:#f02e65}.console .dashboard .metric{color:#f02e65;font-weight:400;font-size:13px;line-height:16px}.console .dashboard .range{color:#818181;font-weight:400;font-size:14px;line-height:16px}.console .dashboard a{display:block;font-weight:400;font-size:14px;line-height:16px;padding:0;border:none}.console .dashboard .chart-metric{width:19%}@media only screen and (min-width:551px) and (max-width:1200px),only screen and (max-width:550px){.console .dashboard .chart-metric{width:100%}}.console .dashboard .chart{width:80%;position:relative;height:0;padding-top:20px;padding-bottom:26%;margin-left:-2px;overflow:hidden;background-color:#fff;background-image:linear-gradient(transparent 1px,transparent 1px),linear-gradient(90deg,transparent 1px,transparent 1px),linear-gradient(#f1f1f1 1px,transparent 1px),linear-gradient(90deg,#f1f1f1 1px,transparent 1px);background-size:100px 100px,100px 100px,20px 20px,20px 20px;background-position:-2px -2px,-2px -2px,-1px -1px,-1px -1px;background-repeat:round;border:solid 1px #f1f1f1;border-right:solid 1px transparent;border-bottom:solid 1px transparent}@media only screen and (min-width:551px) and (max-width:1200px),only screen and (max-width:550px){.console .dashboard .chart{width:100%;float:none;margin-bottom:20px}}.console .dashboard .chart canvas{position:absolute;bottom:0;display:block;height:100%;width:100%}.console .link-list li{margin-bottom:15px}.console .link-list i{display:inline-block;width:30px;height:30px;line-height:30px;text-align:center;background:#818181;color:#f1f3f5;border-radius:50%;margin-left:15px}.console .link-list i.fade{background:0 0;color:#818181}.console .provider{width:50px;height:50px;background:#f5f5f5;color:#868686;line-height:50px;text-align:center;font-size:25px;border-radius:50%}.console .provider.facebook{color:#fff;background:#3b5998}.console .provider.twitter{color:#fff;background:#55beff}.console .provider.telegram{color:#fff;background:#3ba9e1}.console .provider.github{color:#fff;background:#24292e}.console .provider.whatsapp{color:#fff;background:#25d366}.console .provider.linkedin{color:#fff;background:#1074af}.console .provider.microsoft{color:#fff;background:#137ad4}.console .provider.google{color:#fff;background:#4489f1}.console .provider.bitbucket{color:#fff;background:#2a88fb}.console .provider.gitlab{color:#faa238;background:#30353e}.console .provider.instagram{color:#fff;background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.console .premium{z-index:3;margin-top:320px}.console .premium .message{height:190px;overflow:hidden;position:absolute;top:-280px}.console .premium:after{content:'';position:absolute;top:0;left:-20px;right:-20px;bottom:-20px;background:#f6f7f8;opacity:.7;z-index:300}.console .app-section{height:90px}.console .confirm{background:#1e849e;color:#fff;border-radius:25px;padding:12px;line-height:28px;text-align:center}.console .confirm .action{font-weight:500;cursor:pointer}.console .platforms{overflow:hidden}.console .platforms .box{overflow:hidden}.console .platforms .box img{width:50px;margin:0 auto;margin-bottom:20px}.console .platforms .box .cover{margin:-30px -30px 30px -30px;padding:30px}.console .platforms .box .cover.android{background:#a4ca24}.console .platforms .box .cover.android h1{color:#fff;font-size:18px;margin-top:20px}.console .platforms .col{text-align:center;line-height:30px}.console .platforms a{display:block;margin:-20px;padding:20px}.console .platforms a:hover{background:#fbfeff}.console .platforms img{display:block;margin:0 30px;width:calc(100% - 60px);border-radius:50%;margin-bottom:20px}.dev-feature{display:none}.prod-feature{display:none}.development .dev-feature{display:block;opacity:.6!important;outline:solid #ff0 3px;outline-offset:3px}.development .dev-feature.dev-inline{display:inline-block}.development .prod-feature{display:none}.production .dev-feature{display:none}.production .prod-feature{display:block}.search{opacity:1!important}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.search button{margin-top:20px}}html.home body{padding:0 50px}html.home .logo img{max-height:35px;margin:45px 25px 25px 25px}html.home footer{background:0 0;text-align:center}.alerts ul{width:100%;visibility:hidden;position:fixed;padding:0;right:0;left:0;color:#fff;z-index:1002;margin:0 auto;bottom:15px;max-width:650px;opacity:.9}.alerts ul li{margin:1px 0 0 0;padding:0}.alerts ul li div.message{position:relative;padding:12px 35px;margin:0 auto;list-style:none;background:#818181;text-align:center;font-weight:700;border-radius:20px;line-height:16px;min-height:16px}.alerts ul li div.message i{cursor:pointer;position:absolute;font-size:22px;top:8px;right:8px}.alerts ul li div.message.error{color:#fff;background:#f53d3d}.alerts ul li div.message.success{color:#fff;background:#1bbf61}.alerts ul li div.message.warning{color:#fff;background:#ffed4d}.alerts ul li div.message.open{display:block}.alerts ul li div.message.close{display:none}.alerts .cookie-alert{background:#fff6f9!important;color:#f02e65}.alerts .cookie-alert a{color:#f02e65;font-weight:400;border-bottom:dotted 1px #f02e65}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.alerts ul{top:auto;bottom:0;max-width:100%}.alerts ul li{margin:5px 0 0 0}.alerts ul li div.message{border-radius:0}}article{overflow-wrap:break-word;word-wrap:break-word}article h1{font-size:36px}article h2{font-size:24px}article h3{font-size:20px}article h4{font-size:20px}article h5{font-size:18px}article h6{font-size:16px}article h1,article h2,article h3,article h4,article h5,article h6{margin-top:30px!important;margin-bottom:30px!important}article p{line-height:32px;font-size:16px}article .update{display:block;margin-top:50px!important}article table{width:100%;margin:0;margin-bottom:30px!important;border-radius:0;border-bottom:solid 1px #e7e7e7}article table thead td{font-weight:500;padding:5px 15px}article table td,article table th{padding:15px;height:auto}article table td:first-child,article table th:first-child{padding-right:10px}article table td:last-child,article table th:last-child{padding-left:10px}article table td p,article table th p{font-size:inherit;line-height:inherit}article table td p:last-child,article table th p:last-child{margin:0}.avatar{width:60px;height:60px;border-radius:50%;background:#ddd;display:inline-block;overflow:hidden;box-shadow:0 0 6px rgba(0,0,0,.09);position:relative;z-index:1;opacity:1!important}.avatar:before{content:"";position:absolute;width:100%;height:100%;z-index:0;background:#ddd}.avatar.inline{display:inline-block;vertical-align:middle}.avatar.trans{background:0 0}.avatar.xs{width:20px;height:20px}.avatar.small{width:50px;height:50px}.avatar.big{width:100px;height:100px}.avatar.huge{width:150px;height:150px}.box{position:relative;background:#fff;border-radius:10px;box-shadow:0 0 3px rgba(0,0,0,.05);padding:30px;display:block;border-bottom:none}.box.padding-small{padding:15px}.box.y-scroll{overflow-y:auto}.box.danger{background:#f53d3d;color:#fff}.box.focus{background:#f02e65;color:#fff}.box.focus .button,.box.focus button{background:#fff;color:#f02e65}.box.warning{background:#ffed4d;color:#2d2d2d}.box.warning .button,.box.warning button{background:rgba(45,45,45,.8);color:#ffed4d}.box>footer{margin:30px -30px -30px -30px;padding:15px 30px;background:#f5f5f5;border:solid 1px #eaeaea;border-radius:0 0 10px 10px}.box hr{height:2px;background:#eceff1;border:none;margin:30px -30px}.box .header{position:static;height:40px;padding:20px 30px 20px 30px;margin-bottom:30px;margin:-30px -30px 20px -30px;background:#f9f9f9;border-bottom:solid 1px #efefef}.box .toggle{position:relative;border-top:2px solid #f6f7f8;border-bottom:2px solid #f6f7f8;margin:0 -30px;padding:30px;height:35px;overflow:hidden}.box .toggle button.ls-ui-open{position:absolute;top:0;right:0;width:100%;height:95px;background:0 0;opacity:.5;border-radius:0}.box .toggle .icon-minus{display:none}.box .toggle .content{display:none}.box .toggle.open{height:auto}.box .toggle.open .icon-minus{display:block}.box .toggle.open .icon-plus{display:none}.box .toggle.open .content{display:block}.box .list li{border-bottom:solid 2px #f6f7f8;margin:0 -30px 30px -30px;padding:0 30px 30px 30px}.box .list li:last-child{padding-bottom:0;margin-bottom:0;border-bottom:none}.box.new{text-align:center}.box.new i{font-size:80px;line-height:80px;font-family:Poppins,sans-serif;font-style:normal;font-weight:300}.box.new b{margin-top:20px;display:block}a.box{border-right:none;border-left:none}a.box:hover{border-bottom:none;border-right:none;border-left:none;background:#f8fdff;box-shadow:0 0 1px rgba(0,0,0,.2)}.box-asidex{padding-left:25px!important;padding-right:70px;left:0;background:#f9f9f9;border-radius:0 10px 10px 0;height:calc(100% - 30px);position:absolute;padding-top:30px}.box-asidex:after{content:"";display:block;position:absolute;height:100%;width:51px;background:#fff;top:0;bottom:0;right:-6px}.cover{background:#fff6f9;padding:30px 50px;margin:0 -50px;position:relative}.cover .title,.cover h1,.cover h2,.cover h3,.cover h4{color:#f02e65;font-weight:600;margin-bottom:40px!important;font-size:28px;line-height:42px}.cover i:before{margin:0!important}.cover p{color:#737373}.cover .button{color:#fff}.cover .link,.cover a{color:#f02e65;border-left:none;border-right:none;cursor:pointer}.cover .link:hover,.cover a:hover{border-bottom-color:#f02e65}.console .database .row .col{height:452px}.console .database .row .col:after{width:2px;left:20px}.console .database hr{margin:0 -20px;background:#efefef;height:2px}.console .database h3{font-size:13px;line-height:20px;height:20px;background-color:#f5f5f5;margin:-20px -20px 0 -20px;padding:10px 20px;border-bottom:solid 1px #e1e2e2;font-weight:600}.console .database .empty{height:160px;font-size:12px;text-align:center;margin:50px 0}.console .database .empty h4{font-size:13px;font-weight:600;line-height:120px}.console .database .search{background-color:#f5f5f5;margin:0 -20px 0 -20px;padding:10px 15px}.console .database .search input{height:40px;background-color:#fff;border-radius:25px;padding-top:0;padding-bottom:0}.console .database .code{height:411px;background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px;width:calc(100% - 10px)}.console .database .code .ide{overflow:scroll;height:451px;margin:-20px;box-shadow:none;border-radius:0}.console .database .paging{background:#f5f5f5;margin:0 -20px -20px -20px;padding:20px}.console .database .button{margin:0 -20px;padding:0 20px!important;text-align:inherit;color:#f02e65;width:100%;font-size:15px;line-height:55px;box-sizing:content-box}.console .database .button i{margin-left:8px}.console .database .button:hover{border:none;background:#fff6f9}.console .database .items{margin:0 -20px;height:260px;overflow-x:hidden;overflow-y:scroll}.console .database .items form{opacity:0;position:relative}.console .database .items form button{background:red;position:absolute;top:0;bottom:0;right:0;left:0;width:100%;height:45px;border-radius:0;cursor:pointer}.console .database .items li{padding:0;margin:0 0;line-height:45px;font-size:15px;padding-right:50px;padding-left:30px;position:relative}.console .database .items li i{position:absolute;display:none;left:10px}.console .database .items li .name{display:inline-block;width:100%;height:28px}.console .database .items li.selected,.console .database .items li:hover{background:#f5f5f5}.console .database .items li.selected i,.console .database .items li:hover i{display:block}.console .database .items li:last-child{border-bottom:none}body>footer{color:#818181;line-height:40px;margin:0 -50px;padding:12px 50px;font-size:13px;width:100%;background:#f1f1f1;position:relative;margin-top:80px!important}body>footer:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer .logo img{height:22px;padding-top:12px}body>footer a{color:#505050;font-size:13px}body>footer a:hover{border-bottom-color:#505050}body>footer ul:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}body>footer ul li{font-size:13px;float:right;margin-left:20px!important}body>footer .copyright{padding-right:2px}[data-ls-if]{display:none}[data-service]{opacity:0}.load-service-start{opacity:0}.load-service-end{opacity:1;transition:opacity .5s ease-out;-moz-transition:opacity .5s ease-out;-webkit-transition:opacity .5s ease-out;-o-transition:opacity .5s ease-out}.modal-open .modal-bg,.modal-open body .modal-bg{position:fixed;content:'';display:block;width:100%;height:100%;left:0;right:0;top:0;bottom:0;background:#0c0c0c;opacity:.5;z-index:4}.modal{overflow:auto;display:none;position:fixed;width:100%;max-height:90%;max-width:640px;background:#fff;z-index:1000;box-shadow:0 0 4px rgba(0,0,0,.25);padding:30px;left:50%;top:50%;transform:translate(-50%,-50%);border-radius:10px;box-sizing:border-box;text-align:right}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.modal{width:calc(100% - 20px)}}.modal.padding-small{padding:15px}.modal.height-tiny form{height:100px}.modal.height-small form{height:220px}.modal.width-small{max-width:400px}.modal.width-medium{max-width:500px}.modal.width-large{max-width:800px}.modal.open{display:block}.modalbutton.close{display:none}.modal.fill{height:95%;max-height:95%;max-width:75%}.modal h1,.modal h2{margin-bottom:25px;margin-top:0;font-size:20px;text-align:right}.modal h1,.modal h2,.modal h3,.modal h4,.modal h5,.modal h6{color:inherit!important;line-height:35px}.modal .main,.modal form{position:relative;border-top:solid 1px #e7e7e7;padding:30px 30px 0 30px;margin:0 -30px}.modal .separator{margin:20px -30px}.modal .info{margin:0 -30px;padding:20px 30px;background:#f5fbff;color:#3b5d73;border-top:solid 1px #eaf2f7;border-bottom:solid 1px #eaf2f7}.modal button.close{width:30px;height:30px;line-height:30px;padding:0;margin:0;background:#1b1b1b;color:#fff;border-radius:50%}[data-views-current="0"] .scroll-to,[data-views-current="1"] .scroll-to{opacity:0!important}.scroll-to-bottom .scroll-to,.scroll-to-top .scroll-to{opacity:1}.scroll-to{opacity:0;display:block;width:40px;height:40px;line-height:40px;border-radius:50%;position:fixed;transform:translateZ(0);margin:30px;padding:0;bottom:0;font-size:18px;z-index:100000;transition:opacity .15s ease-in-out;left:0}.phases{list-style:none;margin:0;padding:0;position:relative}.phases li{display:none}.phases li li{display:block}.phases li.selected{display:block}.phases .number{display:none}.phases h2,.phases h3,.phases h4,.phases h5,.phases h6{margin:0 0 30px 0;text-align:inherit}.container{position:relative}.container .tabs{height:55px;line-height:55px;list-style:none;padding:0;margin-bottom:50px!important;margin-top:-55px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.container .tabs:after{visibility:hidden;display:block;font-size:0;content:" ";clear:both;height:0}.container .tabs .selected{font-weight:400;color:#f02e65;position:relative;opacity:1}.container .tabs .selected:after{content:"";display:block;height:2px;background:#f02e65;width:calc(100% - 46px);position:absolute;bottom:0;border-radius:2px;right:-2px}.container .tabs .number{display:none}.container .tabs li{float:right;padding-left:50px;color:#f02e65;opacity:.9;cursor:pointer}.container .tabs li:focus{outline:0}.container .icon{display:none}@media only screen and (max-width:550px),only screen and (min-width:551px) and (max-width:1200px){.container .tabs{width:auto;overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.container .tabs li{display:inline-block;float:none}}.ide{background-color:#373738;overflow:hidden;position:relative;z-index:1;box-shadow:0 2px 4px 0 rgba(50,50,93,.3);border-radius:10px;margin-bottom:30px}.ide[data-lang]::after{content:attr(data-lang-label);display:inline-block;background:#fff;color:#000;position:absolute;top:15px;padding:5px 10px;border-radius:15px;font-size:10px;left:10px;opacity:.95}.ide[data-lang=bash]::after{background:#2b2626;color:#fff}.ide[data-lang=javascript]::after{background:#fff054;color:#333232}.ide[data-lang=html]::after{background:#ff895b;color:#fff}.ide[data-lang=php]::after{background:#6182bb;color:#fff}.ide[data-lang="node.js"]::after{background:#8cc500;color:#373738}.ide[data-lang=ruby]::after{background:#fc3f48;color:#fff}.ide[data-lang=python]::after{background:#3873a2;color:#fff}.ide[data-lang=go]::after{background:#00add8;color:#fff}.ide[data-lang=dart]::after{background:#035698;color:#2bb1f0}.ide .tag{color:inherit!important;background:0 0!important;padding:inherit!important;font-size:inherit!important}.ide .copy{cursor:pointer;content:attr(data-lang);display:inline-block;background:#fff;color:#000;position:absolute;transform:translateX(-50%);bottom:-20px;padding:5px 10px;border-radius:15px;font-size:10px;font-style:normal;right:50%;opacity:0;transition:bottom .3s,opacity .3s}.ide .copy::before{padding-left:5px}.ide:hover .copy{transition:bottom .3s,opacity .3s;opacity:.9;bottom:16px}.ide pre{-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;color:#e6ebf1;font-weight:400;line-height:20px;font-size:13px;margin:0;padding:20px;padding-left:60px}.ide.light{box-shadow:0 2px 4px 0 rgba(50,50,93,.1);background-color:#fff}.ide.light pre{color:#414770}.ide.light .token.cdata,.ide.light .token.comment,.ide.light .token.doctype,.ide.light .token.prolog{color:#91a2b0}.ide.light .token.attr-name,.ide.light .token.builtin,.ide.light .token.char,.ide.light .token.inserted,.ide.light .token.selector,.ide.light .token.string{color:#149570}.ide.light .token.punctuation{color:#414770}.ide.light .language-css .token.string,.ide.light .style .token.string,.ide.light .token.entity,.ide.light .token.operator,.ide.light .token.url,.ide.light .token.variable{color:#414770}.ide.light .line-numbers .line-numbers-rows{background:#f2feef}.ide.light .line-numbers-rows>span:before{color:#5dc79e}.ide.light .token.keyword{color:#6772e4;font-weight:500}code[class*=language-],pre[class*=language-]{text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre[class*=language-]{overflow:auto}:not(pre)>code[class*=language-]{padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#6b7c93}.token.punctuation{color:#f8f8f2}.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#f79a59}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#3ecf8e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#45b2e8}.token.keyword{color:#7795f8}.token.important,.token.regex{color:#fd971f}.token.italic{font-style:italic}.token.entity{cursor:help}pre[class*=language-].line-numbers{position:relative;padding-left:60px;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{background:#39393c;position:absolute;pointer-events:none;top:-20px;padding:20px 0;font-size:100%;left:-60px;width:40px;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{padding-left:5px;pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#636365;display:block;padding-right:.8em;text-align:right}html{padding:0;margin:0;direction:rtl}body{margin:0;background:#f6f7f8 no-repeat fixed}main{min-height:100%}ul{padding:0;margin:0}ul li{margin:0;list-style:none}.force-left{direction:ltr;text-align:left}.force-right{direction:rtl;text-align:right}.pull-left{float:left}.pull-right{float:right}.icon-left-open:before{content:'\e814'!important}.icon-right-open:before{content:'\e813'!important}.icon-link-ext:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.icon-article-alt:before{-moz-transform:scaleX(-1);-o-transform:scaleX(-1);-webkit-transform:scaleX(-1);transform:scaleX(-1)}.copy{border-radius:10px 0 0 10px!important} \ No newline at end of file diff --git a/public/styles/default.less b/public/styles/default.less index 61d9d935d2..e36f59fbd7 100644 --- a/public/styles/default.less +++ b/public/styles/default.less @@ -24,9 +24,9 @@ @watch: ~"only screen and (max-width: 260px)"; @phones: ~"only screen and (max-width: 550px)"; -@tablets: ~"only screen and (min-width: 551px) and (max-width: 970px)"; -@desktops: ~"only screen and (min-width: 971px) and (max-width: 1300px)"; -@big-screens: ~"only screen and (min-width: 970px)"; +@tablets: ~"only screen and (min-width: 551px) and (max-width: 1200px)"; +@desktops: ~"only screen and (min-width: 1201px) and (max-width: 1300px)"; +@big-screens: ~"only screen and (min-width: 1200px)"; @dark: ~"(prefers-color-scheme: dark)"; img[src=""] { From 45ee43064afcb1d7e699a4458ea5a6c147b027db Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 01:07:03 +0200 Subject: [PATCH 100/237] Updated SDKs --- app/sdks/go/account.go | 20 ++--- app/sdks/go/teams.go | 2 +- app/sdks/javascript/src/sdk.js | 19 ++--- app/sdks/nodejs/lib/services/account.js | 17 ++-- app/sdks/nodejs/lib/services/teams.js | 2 +- app/sdks/php/docs/account.md | 8 +- app/sdks/php/docs/teams.md | 2 +- .../php/src/Appwrite/Services/Account.php | 17 ++-- app/sdks/php/src/Appwrite/Services/Teams.php | 2 +- app/tasks/sdks.php | 82 ++++--------------- 10 files changed, 57 insertions(+), 114 deletions(-) diff --git a/app/sdks/go/account.go b/app/sdks/go/account.go index e255dfde52..90582ae0d8 100644 --- a/app/sdks/go/account.go +++ b/app/sdks/go/account.go @@ -138,12 +138,12 @@ func (srv *Account) UpdatePrefs(Prefs string) (map[string]interface{}, error) { return srv.client.Call("PATCH", path, nil, params) } -// CreateAccountRecovery sends the user an email with a temporary secret token +// CreateAccountRecovery sends the user an email with a temporary secret key // for password reset. When the user clicks the confirmation link he is -// redirected back to your app password reset redirect URL with a secret token -// and email address values attached to the URL query string. Use the query -// string params to submit a request to the /auth/password/reset endpoint to -// complete the process. +// redirected back to your app password reset URL with the secret key and +// email address values attached to the URL query string. Use the query string +// params to submit a request to the /auth/password/reset endpoint to complete +// the process. func (srv *Account) CreateAccountRecovery(Email string, Url string) (map[string]interface{}, error) { path := "/account/recovery" @@ -156,7 +156,7 @@ func (srv *Account) CreateAccountRecovery(Email string, Url string) (map[string] } // UpdateAccountRecovery use this endpoint to complete the user account -// password reset. Both the **userId** and **token** arguments will be passed +// password reset. Both the **userId** and **secret** arguments will be passed // as query parameters to the redirect URL you have provided when sending your // request to the /auth/recovery endpoint. // @@ -269,11 +269,11 @@ func (srv *Account) DeleteAccountSession(Id string) (map[string]interface{}, err // CreateAccountVerification use this endpoint to send a verification message // to your user email address to confirm they are the valid owners of that -// address. Both the **userId** and **token** arguments will be passed as +// address. Both the **userId** and **secret** arguments will be passed as // query parameters to the URL you have provider to be attached to the // verification email. The provided URL should redirect the user back for your // app and allow you to complete the verification process by verifying both -// the **userId** and **token** parameters. Learn more about how to [complete +// the **userId** and **secret** parameters. Learn more about how to [complete // the verification process](/docs/account#updateAccountVerification). // // Please note that in order to avoid a [Redirect @@ -291,8 +291,8 @@ func (srv *Account) CreateAccountVerification(Url string) (map[string]interface{ } // UpdateAccountVerification use this endpoint to complete the user email -// verification process. Use both the **userId** and **token** parameters that -// were attached to your app URL to verify the user email ownership. If +// verification process. Use both the **userId** and **secret** parameters +// that were attached to your app URL to verify the user email ownership. If // confirmed this route will return a 200 status code. func (srv *Account) UpdateAccountVerification(UserId string, Secret string, PasswordB string) (map[string]interface{}, error) { path := "/account/verification" diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index f9b7b949cb..996d9ed4bc 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -145,7 +145,7 @@ func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[stri // result with a 200 status code on success and with 401 status error on // failure. This behavior was applied to help the web clients deal with // browsers who don't allow to set 3rd party HTTP cookies needed for saving -// the account session token. +// the account session key. func (srv *Teams) UpdateTeamMembershipStatus(TeamId string, InviteId string, UserId string, Secret string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId, "{inviteId}", InviteId) path := r.Replace("/teams/{teamId}/memberships/{inviteId}/status") diff --git a/app/sdks/javascript/src/sdk.js b/app/sdks/javascript/src/sdk.js index 8e286fd404..de45c183cc 100644 --- a/app/sdks/javascript/src/sdk.js +++ b/app/sdks/javascript/src/sdk.js @@ -579,12 +579,11 @@ /** * Password Recovery * - * Sends the user an email with a temporary secret token for password reset. + * Sends the user an email with a temporary secret key for password reset. * When the user clicks the confirmation link he is redirected back to your - * app password reset redirect URL with a secret token and email address - * values attached to the URL query string. Use the query string params to - * submit a request to the /auth/password/reset endpoint to complete the - * process. + * app password reset URL with the secret key and email address values + * attached to the URL query string. Use the query string params to submit a + * request to the /auth/password/reset endpoint to complete the process. * * @param {string} email * @param {string} url @@ -622,7 +621,7 @@ * Password Reset * * Use this endpoint to complete the user account password reset. Both the - * **userId** and **token** arguments will be passed as query parameters to + * **userId** and **secret** arguments will be passed as query parameters to * the redirect URL you have provided when sending your request to the * /auth/recovery endpoint. * @@ -868,10 +867,10 @@ * * Use this endpoint to send a verification message to your user email address * to confirm they are the valid owners of that address. Both the **userId** - * and **token** arguments will be passed as query parameters to the URL you + * and **secret** arguments will be passed as query parameters to the URL you * have provider to be attached to the verification email. The provided URL * should redirect the user back for your app and allow you to complete the - * verification process by verifying both the **userId** and **token** + * verification process by verifying both the **userId** and **secret** * parameters. Learn more about how to [complete the verification * process](/docs/account#updateAccountVerification). * @@ -907,7 +906,7 @@ * Updated Verification * * Use this endpoint to complete the user email verification process. Use both - * the **userId** and **token** parameters that were attached to your app URL + * the **userId** and **secret** parameters that were attached to your app URL * to verify the user email ownership. If confirmed this route will return a * 200 status code. * @@ -3513,7 +3512,7 @@ * result with a 200 status code on success and with 401 status error on * failure. This behavior was applied to help the web clients deal with * browsers who don't allow to set 3rd party HTTP cookies needed for saving - * the account session token. + * the account session key. * * @param {string} teamId * @param {string} inviteId diff --git a/app/sdks/nodejs/lib/services/account.js b/app/sdks/nodejs/lib/services/account.js index 8ad6a312ea..27f6d1f709 100644 --- a/app/sdks/nodejs/lib/services/account.js +++ b/app/sdks/nodejs/lib/services/account.js @@ -214,12 +214,11 @@ class Account extends Service { /** * Password Recovery * - * Sends the user an email with a temporary secret token for password reset. + * Sends the user an email with a temporary secret key for password reset. * When the user clicks the confirmation link he is redirected back to your - * app password reset redirect URL with a secret token and email address - * values attached to the URL query string. Use the query string params to - * submit a request to the /auth/password/reset endpoint to complete the - * process. + * app password reset URL with the secret key and email address values + * attached to the URL query string. Use the query string params to submit a + * request to the /auth/password/reset endpoint to complete the process. * * @param string email * @param string url @@ -242,7 +241,7 @@ class Account extends Service { * Password Reset * * Use this endpoint to complete the user account password reset. Both the - * **userId** and **token** arguments will be passed as query parameters to + * **userId** and **secret** arguments will be passed as query parameters to * the redirect URL you have provided when sending your request to the * /auth/recovery endpoint. * @@ -417,10 +416,10 @@ class Account extends Service { * * Use this endpoint to send a verification message to your user email address * to confirm they are the valid owners of that address. Both the **userId** - * and **token** arguments will be passed as query parameters to the URL you + * and **secret** arguments will be passed as query parameters to the URL you * have provider to be attached to the verification email. The provided URL * should redirect the user back for your app and allow you to complete the - * verification process by verifying both the **userId** and **token** + * verification process by verifying both the **userId** and **secret** * parameters. Learn more about how to [complete the verification * process](/docs/account#updateAccountVerification). * @@ -448,7 +447,7 @@ class Account extends Service { * Updated Verification * * Use this endpoint to complete the user email verification process. Use both - * the **userId** and **token** parameters that were attached to your app URL + * the **userId** and **secret** parameters that were attached to your app URL * to verify the user email ownership. If confirmed this route will return a * 200 status code. * diff --git a/app/sdks/nodejs/lib/services/teams.js b/app/sdks/nodejs/lib/services/teams.js index 324837977f..5da060f2b9 100644 --- a/app/sdks/nodejs/lib/services/teams.js +++ b/app/sdks/nodejs/lib/services/teams.js @@ -215,7 +215,7 @@ class Teams extends Service { * result with a 200 status code on success and with 401 status error on * failure. This behavior was applied to help the web clients deal with * browsers who don't allow to set 3rd party HTTP cookies needed for saving - * the account session token. + * the account session key. * * @param string teamId * @param string inviteId diff --git a/app/sdks/php/docs/account.md b/app/sdks/php/docs/account.md index a9dc7f39a7..26e195d673 100644 --- a/app/sdks/php/docs/account.md +++ b/app/sdks/php/docs/account.md @@ -118,7 +118,7 @@ PATCH https://appwrite.io/v1/account/prefs POST https://appwrite.io/v1/account/recovery ``` -** Sends the user an email with a temporary secret token for password reset. When the user clicks the confirmation link he is redirected back to your app password reset redirect URL with a secret token and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process. ** +** Sends the user an email with a temporary secret key for password reset. When the user clicks the confirmation link he is redirected back to your app password reset URL with the secret key and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process. ** ### Parameters @@ -133,7 +133,7 @@ POST https://appwrite.io/v1/account/recovery PUT https://appwrite.io/v1/account/recovery ``` -** Use this endpoint to complete the user account password reset. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. +** Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. ** @@ -225,7 +225,7 @@ DELETE https://appwrite.io/v1/account/sessions/{id} POST https://appwrite.io/v1/account/verification ``` -** Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **token** arguments will be passed as query parameters to the URL you have provider to be attached to the verification email. The provided URL should redirect the user back for your app and allow you to complete the verification process by verifying both the **userId** and **token** parameters. Learn more about how to [complete the verification process](/docs/account#updateAccountVerification). +** Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provider to be attached to the verification email. The provided URL should redirect the user back for your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](/docs/account#updateAccountVerification). Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. ** @@ -241,7 +241,7 @@ Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/ PUT https://appwrite.io/v1/account/verification ``` -** Use this endpoint to complete the user email verification process. Use both the **userId** and **token** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code. ** +** Use this endpoint to complete the user email verification process. Use both the **userId** and **secret** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code. ** ### Parameters diff --git a/app/sdks/php/docs/teams.md b/app/sdks/php/docs/teams.md index dfd4ae91d4..499a52ee49 100644 --- a/app/sdks/php/docs/teams.md +++ b/app/sdks/php/docs/teams.md @@ -136,7 +136,7 @@ PATCH https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId}/status Please note that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. -When not using the success or failure redirect arguments this endpoint will result with a 200 status code on success and with 401 status error on failure. This behavior was applied to help the web clients deal with browsers who don't allow to set 3rd party HTTP cookies needed for saving the account session token. ** +When not using the success or failure redirect arguments this endpoint will result with a 200 status code on success and with 401 status error on failure. This behavior was applied to help the web clients deal with browsers who don't allow to set 3rd party HTTP cookies needed for saving the account session key. ** ### Parameters diff --git a/app/sdks/php/src/Appwrite/Services/Account.php b/app/sdks/php/src/Appwrite/Services/Account.php index 871ff73c0c..b1aa6a1ad3 100644 --- a/app/sdks/php/src/Appwrite/Services/Account.php +++ b/app/sdks/php/src/Appwrite/Services/Account.php @@ -229,12 +229,11 @@ class Account extends Service /** * Password Recovery * - * Sends the user an email with a temporary secret token for password reset. + * Sends the user an email with a temporary secret key for password reset. * When the user clicks the confirmation link he is redirected back to your - * app password reset redirect URL with a secret token and email address - * values attached to the URL query string. Use the query string params to - * submit a request to the /auth/password/reset endpoint to complete the - * process. + * app password reset URL with the secret key and email address values + * attached to the URL query string. Use the query string params to submit a + * request to the /auth/password/reset endpoint to complete the process. * * @param string $email * @param string $url @@ -258,7 +257,7 @@ class Account extends Service * Password Reset * * Use this endpoint to complete the user account password reset. Both the - * **userId** and **token** arguments will be passed as query parameters to + * **userId** and **secret** arguments will be passed as query parameters to * the redirect URL you have provided when sending your request to the * /auth/recovery endpoint. * @@ -440,10 +439,10 @@ class Account extends Service * * Use this endpoint to send a verification message to your user email address * to confirm they are the valid owners of that address. Both the **userId** - * and **token** arguments will be passed as query parameters to the URL you + * and **secret** arguments will be passed as query parameters to the URL you * have provider to be attached to the verification email. The provided URL * should redirect the user back for your app and allow you to complete the - * verification process by verifying both the **userId** and **token** + * verification process by verifying both the **userId** and **secret** * parameters. Learn more about how to [complete the verification * process](/docs/account#updateAccountVerification). * @@ -472,7 +471,7 @@ class Account extends Service * Updated Verification * * Use this endpoint to complete the user email verification process. Use both - * the **userId** and **token** parameters that were attached to your app URL + * the **userId** and **secret** parameters that were attached to your app URL * to verify the user email ownership. If confirmed this route will return a * 200 status code. * diff --git a/app/sdks/php/src/Appwrite/Services/Teams.php b/app/sdks/php/src/Appwrite/Services/Teams.php index fffee9877b..5117caa855 100644 --- a/app/sdks/php/src/Appwrite/Services/Teams.php +++ b/app/sdks/php/src/Appwrite/Services/Teams.php @@ -229,7 +229,7 @@ class Teams extends Service * result with a 200 status code on success and with 401 status error on * failure. This behavior was applied to help the web clients deal with * browsers who don't allow to set 3rd party HTTP cookies needed for saving - * the account session token. + * the account session key. * * @param string $teamId * @param string $inviteId diff --git a/app/tasks/sdks.php b/app/tasks/sdks.php index 0df9b7b762..3200540c1e 100644 --- a/app/tasks/sdks.php +++ b/app/tasks/sdks.php @@ -52,7 +52,7 @@ $cli $spec = getSSLPage('http://localhost/v1/open-api-2.json?extensions=1'); $result = realpath(__DIR__.'/..').'/sdks/'.$language['key']; - $target = realpath(__DIR__.'/..').'/sdks/git/'.$language['key']; + $target = realpath(__DIR__.'/..').'/sdks/git/'.$language['key'].'/'; $readme = realpath(__DIR__ . '/../../docs/sdks/'.$language['key'].'.md'); $readme = ($readme) ? file_get_contents($readme) : ''; $warning = ($language['beta']) ? '**This SDK is compatible with Appwrite server version ' . $version . '. For older versions, please check previous releases.**' : ''; @@ -149,85 +149,31 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND Console::error($exception->getMessage()); } - var_dump('rm -rf '.$target.' && \ + $gitUrl = $language['gitUrl']; + $gitUrl = 'git@github.com:aw-tests/'.$language['gitRepoName'].'.git'; + + exec('rm -rf '.$target.' && \ mkdir -p '.$target.' && \ cd '.$target.' && \ git init && \ - git remote add origin '.$language['gitUrl'].' && \ + git remote add origin '.$gitUrl.' && \ git fetch && \ - git pull '.$language['gitUrl'].' && \ + git pull '.$gitUrl.' && \ rm -rf '.$target.'/* && \ - cp -r '.$result.' '.$target.' && \ + cp -r '.$result.'/ '.$target.'/ && \ git add . && \ git commit -m "'.$message.'" && \ git push -u origin master'); - Console::success("Pushed {$language['name']} SDK to {$language['url']}"); + Console::success("Pushed {$language['name']} SDK to {$gitUrl}"); + + exec('rm -rf '.$target); + + Console::success("Remove temp directory '{$target}' for {$language['name']} SDK"); } } + exit(); - - foreach ($clients as $name => $client) { - - - - $sdk - ->setLicense($license) - ->setLicenseContent($licenseContent) - ->setVersion($client['version']) - ->setGitRepo($client['gitRepo']) - ->setGitURL($client['gitURL']) - ->setGitRepoName($client['gitRepoName']) - ->setGitUserName($client['gitUserName']) - ->setLogo('https://appwrite.io/images/github.png') - ->setURL('https://appwrite.io') - ->setShareText('Appwrite is a backend as a service for building web or mobile apps') - ->setShareURL('http://appwrite.io') - ->setShareTags('JS,javascript,reactjs,angular,ios,android') - ->setShareVia('appwrite_io') - ->setWarning($client['warning']) - ->setReadme(($client['readme'] && file_exists($client['readme'])) ? file_get_contents($client['readme']) : ''); - - try { - $sdk->generate($client['result']); - } catch (Exception $exception) { - Console::error($exception->getMessage()); - } catch (Throwable $exception) { - Console::error($exception->getMessage()); - } - - var_dump('rm -rf '.$target.' && \ - mkdir -p '.$target.' && \ - cd '.$target.' && \ - git init && \ - git remote add origin '.$client['gitRepo'].' && \ - git fetch && \ - git pull '.$client['gitRepo'].' && \ - rm -rf '.$target.'/* && \ - cp -r '.$client['result'].' '.$target.' && \ - git add . && \ - git commit -m "Initial commit" && \ - git push -u origin master'); - - exec('rm -rf '.$target.' && \ - mkdir -p '.$target.' && \ - cd '.$target.' && \ - git init && \ - git remote add origin '.$client['gitRepo'].' && \ - git fetch && \ - git pull '.$client['gitRepo'].' && \ - rm -rf '.$target.'/* && \ - cp -r '.$client['result'].' '.$target.' && \ - git add . && \ - git commit -m "Initial commit" && \ - git push -u origin master'); - - Console::success("Pushing {$name} SDK to {$client['gitRepo']}"); - - exec('rm -rf '.$target); - - Console::success("Remove temp directory '{$target}' for {$name} SDK"); - } }); $cli->run(); From b5a73340c2c5cdb12d21d008477d9bc41c935ef0 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 14:56:09 +0200 Subject: [PATCH 101/237] Split for client and servers SDKs --- app/app.php | 16 ++++++++++++++++ app/controllers/api/account.php | 1 + 2 files changed, 17 insertions(+) diff --git a/app/app.php b/app/app.php index af3e07f0e8..45e2e98bd5 100644 --- a/app/app.php +++ b/app/app.php @@ -452,6 +452,11 @@ $utopia->get('/v1/open-api-2.json') 'server' => ['Project' => [], 'Key' => []], ]; + $platforms = [ + 'client' => APP_PLATFORM_CLIENT, + 'server' => APP_PLATFORM_SERVER, + ]; + /* * Specifications (v3.0.0): * https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md @@ -549,6 +554,13 @@ $utopia->get('/v1/open-api-2.json') ], ]; + if ($extensions) { + $output['securityDefinitions']['Project']['extensions'] = ['demo' => '5df5acd0d48c2']; + $output['securityDefinitions']['Key']['extensions'] = ['demo' => '919c2d18fb5d4...a2ae413da83346ad2']; + $output['securityDefinitions']['Locale']['extensions'] = ['demo' => 'en']; + $output['securityDefinitions']['Mode']['extensions'] = ['demo' => '']; + } + foreach ($utopia->getRoutes() as $key => $method) { foreach ($method as $route) { /* @var $route \Utopia\Route */ if (!$route->getLabel('docs', true)) { @@ -559,6 +571,10 @@ $utopia->get('/v1/open-api-2.json') continue; } + if(!in_array($platforms[$platform], $route->getLabel('sdk.platform', []))) { + continue; + } + $url = str_replace('/v1', '', $route->getURL()); $scope = $route->getLabel('scope', ''); $hide = $route->getLabel('sdk.hide', false); diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index f052040b9a..7c78712904 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -48,6 +48,7 @@ $utopia->get('/v1/account') ->label('sdk.namespace', 'account') ->label('sdk.method', 'getAccount') ->label('sdk.description', '/docs/references/account/get.md') + ->label('sdk.response', ['200' => 'user']) ->action( function () use ($response, &$user, $oauthKeys) { $response->json(array_merge($user->getArrayCopy(array_merge( From 007dfbe043b1a9108c5a69093ef8ae5bdb7a7d07 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 15:16:33 +0200 Subject: [PATCH 102/237] Updated all SDKs --- app/config/platforms.php | 13 + app/sdks/dart/.packages | 14 - app/sdks/dart/LICENSE | 12 - app/sdks/dart/README.md | 31 - app/sdks/dart/lib/appwrite.dart | 11 - app/sdks/dart/lib/client.dart | 100 - app/sdks/dart/lib/service.dart | 9 - app/sdks/dart/lib/services/account.dart | 107 - app/sdks/dart/lib/services/auth.dart | 173 - app/sdks/dart/lib/services/avatars.dart | 93 - app/sdks/dart/lib/services/database.dart | 139 - app/sdks/dart/lib/services/locale.dart | 73 - app/sdks/dart/lib/services/projects.dart | 292 -- app/sdks/dart/lib/services/storage.dart | 109 - app/sdks/dart/lib/services/teams.dart | 152 - app/sdks/dart/lib/services/users.dart | 111 - app/sdks/dart/pubspec.lock | 89 - app/sdks/dart/pubspec.yaml | 11 - app/sdks/go/account.go | 307 -- app/sdks/go/auth.go | 186 - app/sdks/go/docs/examples/Account/Delete.md | 34 - app/sdks/go/docs/examples/Account/Get.md | 35 - app/sdks/go/docs/examples/Account/GetPrefs.md | 35 - .../go/docs/examples/Account/GetSecurity.md | 35 - .../go/docs/examples/Account/GetSessions.md | 35 - .../go/docs/examples/Account/UpdateEmail.md | 35 - .../go/docs/examples/Account/UpdateName.md | 35 - .../docs/examples/Account/UpdatePassword.md | 35 - .../go/docs/examples/Account/UpdatePrefs.md | 35 - .../Account/create-account-recovery.md | 33 - .../Account/create-account-session-o-auth.md | 33 - .../Account/create-account-session.md | 33 - .../Account/create-account-verification.md | 34 - .../docs/examples/Account/create-account.md | 33 - .../Account/delete-account-current-session.md | 34 - .../Account/delete-account-session.md | 34 - .../Account/delete-account-sessions.md | 34 - .../docs/examples/Account/get-account-logs.md | 34 - .../examples/Account/get-account-prefs.md | 34 - .../examples/Account/get-account-sessions.md | 34 - .../go/docs/examples/Account/get-account.md | 34 - .../go/docs/examples/Account/get-prefs.md | 35 - .../go/docs/examples/Account/get-security.md | 35 - .../go/docs/examples/Account/get-sessions.md | 35 - .../examples/Account/update-account-name.md | 34 - .../Account/update-account-password.md | 34 - .../Account/update-account-recovery.md | 33 - .../Account/update-account-verification.md | 33 - .../go/docs/examples/Account/update-email.md | 34 - .../go/docs/examples/Account/update-name.md | 35 - .../docs/examples/Account/update-password.md | 35 - .../go/docs/examples/Account/update-prefs.md | 34 - app/sdks/go/docs/examples/Auth/Confirm.md | 33 - .../go/docs/examples/Auth/ConfirmResend.md | 35 - app/sdks/go/docs/examples/Auth/Login.md | 35 - app/sdks/go/docs/examples/Auth/Logout.md | 35 - .../go/docs/examples/Auth/LogoutBySession.md | 35 - app/sdks/go/docs/examples/Auth/Oauth.md | 35 - app/sdks/go/docs/examples/Auth/Recovery.md | 35 - .../go/docs/examples/Auth/RecoveryReset.md | 35 - app/sdks/go/docs/examples/Auth/Register.md | 35 - .../go/docs/examples/Auth/confirm-resend.md | 35 - .../docs/examples/Auth/logout-by-session.md | 35 - .../go/docs/examples/Auth/recovery-reset.md | 35 - .../go/docs/examples/Avatars/GetBrowser.md | 35 - .../go/docs/examples/Avatars/GetCreditCard.md | 35 - .../go/docs/examples/Avatars/GetFavicon.md | 35 - app/sdks/go/docs/examples/Avatars/GetFlag.md | 35 - app/sdks/go/docs/examples/Avatars/GetImage.md | 35 - app/sdks/go/docs/examples/Avatars/GetQR.md | 35 - .../go/docs/examples/Avatars/get-browser.md | 1 + .../docs/examples/Avatars/get-credit-card.md | 1 + .../go/docs/examples/Avatars/get-favicon.md | 1 + app/sdks/go/docs/examples/Avatars/get-flag.md | 1 + .../go/docs/examples/Avatars/get-image.md | 1 + app/sdks/go/docs/examples/Avatars/get-q-r.md | 1 + .../examples/Database/CreateCollection.md | 35 - .../docs/examples/Database/CreateDocument.md | 35 - .../examples/Database/DeleteCollection.md | 35 - .../docs/examples/Database/DeleteDocument.md | 35 - .../docs/examples/Database/GetCollection.md | 35 - .../go/docs/examples/Database/GetDocument.md | 35 - .../docs/examples/Database/ListCollections.md | 35 - .../docs/examples/Database/ListDocuments.md | 35 - .../examples/Database/UpdateCollection.md | 35 - .../docs/examples/Database/UpdateDocument.md | 35 - .../examples/Database/create-collection.md | 1 + .../docs/examples/Database/create-document.md | 1 + .../examples/Database/delete-collection.md | 1 + .../docs/examples/Database/delete-document.md | 1 + .../docs/examples/Database/get-collection.md | 1 + .../go/docs/examples/Database/get-document.md | 1 + .../examples/Database/list-collections.md | 1 + .../docs/examples/Database/list-documents.md | 1 + .../examples/Database/update-collection.md | 1 + .../docs/examples/Database/update-document.md | 1 + .../go/docs/examples/Locale/GetCountries.md | 35 - .../go/docs/examples/Locale/GetCountriesEU.md | 35 - .../examples/Locale/GetCountriesPhones.md | 35 - .../go/docs/examples/Locale/GetCurrencies.md | 35 - app/sdks/go/docs/examples/Locale/GetLocale.md | 35 - .../go/docs/examples/Locale/get-continents.md | 1 + .../docs/examples/Locale/get-countries-e-u.md | 1 + .../examples/Locale/get-countries-phones.md | 1 + .../go/docs/examples/Locale/get-countries.md | 1 + .../go/docs/examples/Locale/get-currencies.md | 1 + .../go/docs/examples/Locale/get-locale.md | 1 + .../go/docs/examples/Projects/CreateKey.md | 35 - .../docs/examples/Projects/CreatePlatform.md | 35 - .../docs/examples/Projects/CreateProject.md | 35 - .../go/docs/examples/Projects/CreateTask.md | 35 - .../docs/examples/Projects/CreateWebhook.md | 35 - .../go/docs/examples/Projects/DeleteKey.md | 35 - .../docs/examples/Projects/DeletePlatform.md | 35 - .../docs/examples/Projects/DeleteProject.md | 35 - .../go/docs/examples/Projects/DeleteTask.md | 35 - .../docs/examples/Projects/DeleteWebhook.md | 35 - app/sdks/go/docs/examples/Projects/GetKey.md | 35 - .../go/docs/examples/Projects/GetPlatform.md | 35 - .../go/docs/examples/Projects/GetProject.md | 35 - .../docs/examples/Projects/GetProjectUsage.md | 35 - app/sdks/go/docs/examples/Projects/GetTask.md | 35 - .../go/docs/examples/Projects/GetWebhook.md | 35 - .../go/docs/examples/Projects/ListKeys.md | 35 - .../docs/examples/Projects/ListPlatforms.md | 35 - .../go/docs/examples/Projects/ListProjects.md | 35 - .../go/docs/examples/Projects/ListTasks.md | 35 - .../go/docs/examples/Projects/ListWebhooks.md | 35 - .../go/docs/examples/Projects/UpdateKey.md | 35 - .../docs/examples/Projects/UpdatePlatform.md | 35 - .../docs/examples/Projects/UpdateProject.md | 35 - .../examples/Projects/UpdateProjectOAuth.md | 35 - .../go/docs/examples/Projects/UpdateTask.md | 35 - .../docs/examples/Projects/UpdateWebhook.md | 35 - .../go/docs/examples/Projects/create-key.md | 34 - .../docs/examples/Projects/create-platform.md | 34 - .../docs/examples/Projects/create-project.md | 34 - .../go/docs/examples/Projects/create-task.md | 34 - .../docs/examples/Projects/create-webhook.md | 34 - .../go/docs/examples/Projects/delete-key.md | 34 - .../docs/examples/Projects/delete-platform.md | 34 - .../docs/examples/Projects/delete-project.md | 34 - .../go/docs/examples/Projects/delete-task.md | 34 - .../docs/examples/Projects/delete-webhook.md | 34 - app/sdks/go/docs/examples/Projects/get-key.md | 34 - .../go/docs/examples/Projects/get-platform.md | 34 - .../examples/Projects/get-project-usage.md | 34 - .../go/docs/examples/Projects/get-project.md | 34 - .../go/docs/examples/Projects/get-task.md | 34 - .../go/docs/examples/Projects/get-webhook.md | 34 - .../go/docs/examples/Projects/list-keys.md | 34 - .../docs/examples/Projects/list-platforms.md | 34 - .../docs/examples/Projects/list-projects.md | 34 - .../go/docs/examples/Projects/list-tasks.md | 34 - .../docs/examples/Projects/list-webhooks.md | 34 - .../go/docs/examples/Projects/update-key.md | 34 - .../docs/examples/Projects/update-platform.md | 34 - .../Projects/update-project-o-auth.md | 34 - .../docs/examples/Projects/update-project.md | 34 - .../go/docs/examples/Projects/update-task.md | 34 - .../docs/examples/Projects/update-webhook.md | 34 - .../go/docs/examples/Storage/CreateFile.md | 35 - .../go/docs/examples/Storage/DeleteFile.md | 35 - app/sdks/go/docs/examples/Storage/GetFile.md | 35 - .../docs/examples/Storage/GetFileDownload.md | 35 - .../docs/examples/Storage/GetFilePreview.md | 35 - .../go/docs/examples/Storage/GetFileView.md | 35 - .../go/docs/examples/Storage/ListFiles.md | 35 - .../go/docs/examples/Storage/UpdateFile.md | 35 - .../go/docs/examples/Storage/create-file.md | 1 + .../go/docs/examples/Storage/delete-file.md | 1 + .../examples/Storage/get-file-download.md | 1 + .../docs/examples/Storage/get-file-preview.md | 1 + .../go/docs/examples/Storage/get-file-view.md | 1 + app/sdks/go/docs/examples/Storage/get-file.md | 1 + .../go/docs/examples/Storage/list-files.md | 1 + .../go/docs/examples/Storage/update-file.md | 1 + app/sdks/go/docs/examples/Teams/CreateTeam.md | 35 - .../examples/Teams/CreateTeamMembership.md | 35 - .../Teams/CreateTeamMembershipResend.md | 35 - app/sdks/go/docs/examples/Teams/DeleteTeam.md | 35 - .../examples/Teams/DeleteTeamMembership.md | 35 - app/sdks/go/docs/examples/Teams/GetTeam.md | 35 - .../go/docs/examples/Teams/GetTeamMembers.md | 35 - app/sdks/go/docs/examples/Teams/ListTeams.md | 35 - app/sdks/go/docs/examples/Teams/UpdateTeam.md | 35 - .../Teams/UpdateTeamMembershipStatus.md | 35 - .../Teams/create-team-membership-resend.md | 35 - .../examples/Teams/create-team-membership.md | 1 + .../go/docs/examples/Teams/create-team.md | 1 + .../examples/Teams/delete-team-membership.md | 1 + .../go/docs/examples/Teams/delete-team.md | 1 + .../docs/examples/Teams/get-team-members.md | 35 - .../examples/Teams/get-team-memberships.md | 1 + app/sdks/go/docs/examples/Teams/get-team.md | 1 + app/sdks/go/docs/examples/Teams/list-teams.md | 1 + .../Teams/update-team-membership-status.md | 33 - .../go/docs/examples/Teams/update-team.md | 1 + app/sdks/go/docs/examples/Users/CreateUser.md | 35 - .../docs/examples/Users/DeleteUserSession.md | 35 - .../docs/examples/Users/DeleteUserSessions.md | 35 - app/sdks/go/docs/examples/Users/GetUser.md | 35 - .../go/docs/examples/Users/GetUserLogs.md | 35 - .../go/docs/examples/Users/GetUserPrefs.md | 35 - .../go/docs/examples/Users/GetUserSessions.md | 35 - app/sdks/go/docs/examples/Users/ListUsers.md | 35 - .../go/docs/examples/Users/UpdateUserPrefs.md | 35 - .../docs/examples/Users/UpdateUserStatus.md | 35 - .../go/docs/examples/Users/create-user.md | 1 + .../examples/Users/delete-user-session.md | 1 + .../examples/Users/delete-user-sessions.md | 1 + .../go/docs/examples/Users/get-user-logs.md | 1 + .../go/docs/examples/Users/get-user-prefs.md | 1 + .../docs/examples/Users/get-user-sessions.md | 1 + app/sdks/go/docs/examples/Users/get-user.md | 1 + app/sdks/go/docs/examples/Users/list-users.md | 1 + .../docs/examples/Users/update-user-prefs.md | 1 + .../docs/examples/Users/update-user-status.md | 1 + app/sdks/go/projects.go | 372 -- app/sdks/go/teams.go | 27 - .../account/create-account-verification.md | 13 - .../docs/examples/projects/create-key.md | 13 - .../docs/examples/projects/create-platform.md | 13 - .../docs/examples/projects/create-project.md | 13 - .../docs/examples/projects/create-task.md | 13 - .../docs/examples/projects/create-webhook.md | 13 - .../docs/examples/projects/delete-key.md | 13 - .../docs/examples/projects/delete-platform.md | 13 - .../docs/examples/projects/delete-project.md | 13 - .../docs/examples/projects/delete-task.md | 13 - .../docs/examples/projects/delete-webhook.md | 13 - .../docs/examples/projects/get-key.md | 13 - .../docs/examples/projects/get-platform.md | 13 - .../examples/projects/get-project-usage.md | 13 - .../docs/examples/projects/get-project.md | 13 - .../docs/examples/projects/get-task.md | 13 - .../docs/examples/projects/get-webhook.md | 13 - .../docs/examples/projects/list-keys.md | 13 - .../docs/examples/projects/list-platforms.md | 13 - .../docs/examples/projects/list-projects.md | 13 - .../docs/examples/projects/list-tasks.md | 13 - .../docs/examples/projects/list-webhooks.md | 13 - .../docs/examples/projects/update-key.md | 13 - .../docs/examples/projects/update-platform.md | 13 - .../projects/update-project-o-auth.md | 13 - .../docs/examples/projects/update-project.md | 13 - .../docs/examples/projects/update-task.md | 13 - .../docs/examples/projects/update-webhook.md | 13 - .../docs/examples/users/create-user.md | 13 - .../examples/users/delete-user-session.md | 13 - .../examples/users/delete-user-sessions.md | 13 - .../docs/examples/users/get-user-logs.md | 13 - .../docs/examples/users/get-user-prefs.md | 13 - .../docs/examples/users/get-user-sessions.md | 13 - .../docs/examples/users/get-user.md | 13 - .../docs/examples/users/list-users.md | 13 - .../docs/examples/users/update-user-prefs.md | 13 - .../docs/examples/users/update-user-status.md | 13 - app/sdks/javascript/src/sdk.js | 1482 +------ app/sdks/javascript/src/sdk.min.js | 166 +- app/sdks/js/LICENSE | 12 - app/sdks/js/README.md | 55 - app/sdks/js/docs/examples/account/delete.md | 13 - .../js/docs/examples/account/get-prefs.md | 13 - .../js/docs/examples/account/get-security.md | 13 - .../js/docs/examples/account/get-sessions.md | 13 - app/sdks/js/docs/examples/account/get.md | 13 - .../js/docs/examples/account/update-email.md | 13 - .../js/docs/examples/account/update-name.md | 13 - .../docs/examples/account/update-password.md | 13 - .../js/docs/examples/account/update-prefs.md | 13 - .../js/docs/examples/auth/confirm-resend.md | 13 - app/sdks/js/docs/examples/auth/confirm.md | 12 - app/sdks/js/docs/examples/auth/login.md | 13 - .../docs/examples/auth/logout-by-session.md | 13 - app/sdks/js/docs/examples/auth/logout.md | 13 - .../js/docs/examples/auth/oauth-callback.md | 13 - app/sdks/js/docs/examples/auth/oauth.md | 13 - .../js/docs/examples/auth/recovery-reset.md | 13 - app/sdks/js/docs/examples/auth/recovery.md | 13 - app/sdks/js/docs/examples/auth/register.md | 13 - .../js/docs/examples/avatars/get-browser.md | 13 - .../docs/examples/avatars/get-credit-card.md | 13 - .../js/docs/examples/avatars/get-favicon.md | 13 - app/sdks/js/docs/examples/avatars/get-flag.md | 13 - .../js/docs/examples/avatars/get-image.md | 13 - app/sdks/js/docs/examples/avatars/get-q-r.md | 13 - .../examples/database/create-collection.md | 13 - .../docs/examples/database/create-document.md | 13 - .../examples/database/delete-collection.md | 13 - .../docs/examples/database/delete-document.md | 13 - .../docs/examples/database/get-collection.md | 13 - .../js/docs/examples/database/get-document.md | 13 - .../examples/database/list-collections.md | 13 - .../docs/examples/database/list-documents.md | 13 - .../examples/database/update-collection.md | 13 - .../docs/examples/database/update-document.md | 13 - .../js/docs/examples/locale/get-continents.md | 13 - .../docs/examples/locale/get-countries-e-u.md | 13 - .../examples/locale/get-countries-phones.md | 13 - .../js/docs/examples/locale/get-countries.md | 13 - .../js/docs/examples/locale/get-currencies.md | 13 - .../js/docs/examples/locale/get-locale.md | 13 - .../js/docs/examples/projects/create-key.md | 13 - .../docs/examples/projects/create-platform.md | 13 - .../docs/examples/projects/create-project.md | 13 - .../js/docs/examples/projects/create-task.md | 13 - .../docs/examples/projects/create-webhook.md | 13 - .../js/docs/examples/projects/delete-key.md | 13 - .../docs/examples/projects/delete-platform.md | 13 - .../docs/examples/projects/delete-project.md | 13 - .../js/docs/examples/projects/delete-task.md | 13 - .../docs/examples/projects/delete-webhook.md | 13 - app/sdks/js/docs/examples/projects/get-key.md | 13 - .../js/docs/examples/projects/get-platform.md | 13 - .../examples/projects/get-project-usage.md | 13 - .../js/docs/examples/projects/get-project.md | 13 - .../js/docs/examples/projects/get-task.md | 13 - .../js/docs/examples/projects/get-webhook.md | 13 - .../js/docs/examples/projects/list-keys.md | 13 - .../docs/examples/projects/list-platforms.md | 13 - .../docs/examples/projects/list-projects.md | 13 - .../js/docs/examples/projects/list-tasks.md | 13 - .../docs/examples/projects/list-webhooks.md | 13 - .../js/docs/examples/projects/update-key.md | 13 - .../docs/examples/projects/update-platform.md | 13 - .../projects/update-project-o-auth.md | 13 - .../docs/examples/projects/update-project.md | 13 - .../js/docs/examples/projects/update-task.md | 13 - .../docs/examples/projects/update-webhook.md | 13 - .../js/docs/examples/storage/create-file.md | 13 - .../js/docs/examples/storage/delete-file.md | 13 - .../examples/storage/get-file-download.md | 13 - .../docs/examples/storage/get-file-preview.md | 13 - .../js/docs/examples/storage/get-file-view.md | 13 - app/sdks/js/docs/examples/storage/get-file.md | 13 - .../js/docs/examples/storage/list-files.md | 13 - .../js/docs/examples/storage/update-file.md | 13 - .../teams/create-team-membership-resend.md | 13 - .../examples/teams/create-team-membership.md | 13 - .../js/docs/examples/teams/create-team.md | 13 - .../examples/teams/delete-team-membership.md | 13 - .../js/docs/examples/teams/delete-team.md | 13 - .../docs/examples/teams/get-team-members.md | 13 - app/sdks/js/docs/examples/teams/get-team.md | 13 - app/sdks/js/docs/examples/teams/list-teams.md | 13 - .../teams/update-team-membership-status.md | 13 - .../js/docs/examples/teams/update-team.md | 13 - .../js/docs/examples/users/create-user.md | 13 - .../examples/users/delete-user-session.md | 13 - .../examples/users/delete-user-sessions.md | 13 - .../examples/users/delete-users-session.md | 13 - .../js/docs/examples/users/get-user-logs.md | 13 - .../js/docs/examples/users/get-user-prefs.md | 13 - .../docs/examples/users/get-user-sessions.md | 13 - app/sdks/js/docs/examples/users/get-user.md | 13 - app/sdks/js/docs/examples/users/list-users.md | 13 - .../docs/examples/users/update-user-prefs.md | 13 - .../docs/examples/users/update-user-status.md | 13 - app/sdks/js/package.json | 14 - app/sdks/js/src/sdk.js | 3929 ----------------- app/sdks/js/src/sdk.min.js | 361 -- app/sdks/node/LICENSE | 12 - app/sdks/node/README.md | 24 - app/sdks/node/docs/examples/account/delete.md | 19 - .../node/docs/examples/account/get-prefs.md | 19 - .../docs/examples/account/get-security.md | 19 - .../docs/examples/account/get-sessions.md | 19 - app/sdks/node/docs/examples/account/get.md | 19 - .../docs/examples/account/update-email.md | 19 - .../node/docs/examples/account/update-name.md | 19 - .../docs/examples/account/update-password.md | 19 - .../docs/examples/account/update-prefs.md | 19 - .../node/docs/examples/auth/confirm-resend.md | 19 - app/sdks/node/docs/examples/auth/confirm.md | 17 - app/sdks/node/docs/examples/auth/login.md | 19 - .../docs/examples/auth/logout-by-session.md | 19 - app/sdks/node/docs/examples/auth/logout.md | 19 - .../node/docs/examples/auth/oauth-callback.md | 19 - app/sdks/node/docs/examples/auth/oauth.md | 19 - .../node/docs/examples/auth/recovery-reset.md | 19 - app/sdks/node/docs/examples/auth/recovery.md | 19 - app/sdks/node/docs/examples/auth/register.md | 19 - .../node/docs/examples/avatars/get-browser.md | 19 - .../docs/examples/avatars/get-credit-card.md | 19 - .../node/docs/examples/avatars/get-favicon.md | 19 - .../node/docs/examples/avatars/get-flag.md | 19 - .../node/docs/examples/avatars/get-image.md | 19 - .../node/docs/examples/avatars/get-q-r.md | 19 - .../examples/database/create-collection.md | 19 - .../docs/examples/database/create-document.md | 19 - .../examples/database/delete-collection.md | 19 - .../docs/examples/database/delete-document.md | 19 - .../docs/examples/database/get-collection.md | 19 - .../docs/examples/database/get-document.md | 19 - .../examples/database/list-collections.md | 19 - .../docs/examples/database/list-documents.md | 19 - .../examples/database/update-collection.md | 19 - .../docs/examples/database/update-document.md | 19 - .../docs/examples/locale/get-continents.md | 19 - .../docs/examples/locale/get-countries-e-u.md | 19 - .../examples/locale/get-countries-phones.md | 19 - .../docs/examples/locale/get-countries.md | 19 - .../docs/examples/locale/get-currencies.md | 19 - .../node/docs/examples/locale/get-locale.md | 19 - .../node/docs/examples/projects/create-key.md | 19 - .../docs/examples/projects/create-platform.md | 19 - .../docs/examples/projects/create-project.md | 19 - .../docs/examples/projects/create-task.md | 19 - .../docs/examples/projects/create-webhook.md | 19 - .../node/docs/examples/projects/delete-key.md | 19 - .../docs/examples/projects/delete-platform.md | 19 - .../docs/examples/projects/delete-project.md | 19 - .../docs/examples/projects/delete-task.md | 19 - .../docs/examples/projects/delete-webhook.md | 19 - .../node/docs/examples/projects/get-key.md | 19 - .../docs/examples/projects/get-platform.md | 19 - .../examples/projects/get-project-usage.md | 19 - .../docs/examples/projects/get-project.md | 19 - .../node/docs/examples/projects/get-task.md | 19 - .../docs/examples/projects/get-webhook.md | 19 - .../node/docs/examples/projects/list-keys.md | 19 - .../docs/examples/projects/list-platforms.md | 19 - .../docs/examples/projects/list-projects.md | 19 - .../node/docs/examples/projects/list-tasks.md | 19 - .../docs/examples/projects/list-webhooks.md | 19 - .../node/docs/examples/projects/update-key.md | 19 - .../docs/examples/projects/update-platform.md | 19 - .../projects/update-project-o-auth.md | 19 - .../docs/examples/projects/update-project.md | 19 - .../docs/examples/projects/update-task.md | 19 - .../docs/examples/projects/update-webhook.md | 19 - .../node/docs/examples/storage/create-file.md | 19 - .../node/docs/examples/storage/delete-file.md | 19 - .../examples/storage/get-file-download.md | 19 - .../docs/examples/storage/get-file-preview.md | 19 - .../docs/examples/storage/get-file-view.md | 19 - .../node/docs/examples/storage/get-file.md | 19 - .../node/docs/examples/storage/list-files.md | 19 - .../node/docs/examples/storage/update-file.md | 19 - .../teams/create-team-membership-resend.md | 19 - .../examples/teams/create-team-membership.md | 19 - .../node/docs/examples/teams/create-team.md | 19 - .../examples/teams/delete-team-membership.md | 19 - .../node/docs/examples/teams/delete-team.md | 19 - .../docs/examples/teams/get-team-members.md | 19 - app/sdks/node/docs/examples/teams/get-team.md | 19 - .../node/docs/examples/teams/list-teams.md | 19 - .../teams/update-team-membership-status.md | 19 - .../node/docs/examples/teams/update-team.md | 19 - .../node/docs/examples/users/create-user.md | 19 - .../examples/users/delete-user-session.md | 19 - .../examples/users/delete-user-sessions.md | 19 - .../examples/users/delete-users-session.md | 19 - .../node/docs/examples/users/get-user-logs.md | 19 - .../docs/examples/users/get-user-prefs.md | 19 - .../docs/examples/users/get-user-sessions.md | 19 - app/sdks/node/docs/examples/users/get-user.md | 19 - .../node/docs/examples/users/list-users.md | 19 - .../docs/examples/users/update-user-prefs.md | 19 - .../docs/examples/users/update-user-status.md | 19 - app/sdks/node/index.js | 23 - app/sdks/node/lib/client.js | 122 - app/sdks/node/lib/service.js | 10 - app/sdks/node/lib/services/account.js | 191 - app/sdks/node/lib/services/auth.js | 274 -- app/sdks/node/lib/services/avatars.js | 164 - app/sdks/node/lib/services/database.js | 266 -- app/sdks/node/lib/services/locale.js | 124 - app/sdks/node/lib/services/projects.js | 609 --- app/sdks/node/lib/services/storage.js | 199 - app/sdks/node/lib/services/teams.js | 266 -- app/sdks/node/lib/services/users.js | 216 - app/sdks/node/package.json | 17 - .../account/create-account-recovery.md | 17 - .../account/create-account-session-o-auth.md | 17 - .../account/create-account-session.md | 17 - .../account/create-account-verification.md | 18 - .../docs/examples/account/create-account.md | 17 - .../account/delete-account-current-session.md | 18 - .../account/delete-account-session.md | 18 - .../account/delete-account-sessions.md | 18 - .../nodejs/docs/examples/account/delete.md | 18 - .../docs/examples/account/get-account-logs.md | 18 - .../examples/account/get-account-prefs.md | 18 - .../examples/account/get-account-sessions.md | 18 - .../docs/examples/account/get-account.md | 18 - .../examples/account/update-account-name.md | 18 - .../account/update-account-password.md | 18 - .../account/update-account-recovery.md | 17 - .../account/update-account-verification.md | 17 - .../docs/examples/account/update-email.md | 18 - .../docs/examples/account/update-prefs.md | 18 - .../docs/examples/avatars/get-browser.md | 1 + .../docs/examples/avatars/get-credit-card.md | 1 + .../docs/examples/avatars/get-favicon.md | 1 + .../nodejs/docs/examples/avatars/get-flag.md | 1 + .../nodejs/docs/examples/avatars/get-image.md | 1 + .../nodejs/docs/examples/avatars/get-q-r.md | 1 + .../examples/database/create-collection.md | 1 + .../docs/examples/database/create-document.md | 1 + .../examples/database/delete-collection.md | 1 + .../docs/examples/database/delete-document.md | 1 + .../docs/examples/database/get-collection.md | 1 + .../docs/examples/database/get-document.md | 1 + .../examples/database/list-collections.md | 1 + .../docs/examples/database/list-documents.md | 1 + .../examples/database/update-collection.md | 1 + .../docs/examples/database/update-document.md | 1 + .../docs/examples/locale/get-continents.md | 1 + .../docs/examples/locale/get-countries-e-u.md | 1 + .../examples/locale/get-countries-phones.md | 1 + .../docs/examples/locale/get-countries.md | 1 + .../docs/examples/locale/get-currencies.md | 1 + .../nodejs/docs/examples/locale/get-locale.md | 1 + .../docs/examples/projects/create-key.md | 18 - .../docs/examples/projects/create-platform.md | 18 - .../docs/examples/projects/create-project.md | 18 - .../docs/examples/projects/create-task.md | 18 - .../docs/examples/projects/create-webhook.md | 18 - .../docs/examples/projects/delete-key.md | 18 - .../docs/examples/projects/delete-platform.md | 18 - .../docs/examples/projects/delete-project.md | 18 - .../docs/examples/projects/delete-task.md | 18 - .../docs/examples/projects/delete-webhook.md | 18 - .../nodejs/docs/examples/projects/get-key.md | 18 - .../docs/examples/projects/get-platform.md | 18 - .../examples/projects/get-project-usage.md | 18 - .../docs/examples/projects/get-project.md | 18 - .../nodejs/docs/examples/projects/get-task.md | 18 - .../docs/examples/projects/get-webhook.md | 18 - .../docs/examples/projects/list-keys.md | 18 - .../docs/examples/projects/list-platforms.md | 18 - .../docs/examples/projects/list-projects.md | 18 - .../docs/examples/projects/list-tasks.md | 18 - .../docs/examples/projects/list-webhooks.md | 18 - .../docs/examples/projects/update-key.md | 18 - .../docs/examples/projects/update-platform.md | 18 - .../projects/update-project-o-auth.md | 18 - .../docs/examples/projects/update-project.md | 18 - .../docs/examples/projects/update-task.md | 18 - .../docs/examples/projects/update-webhook.md | 18 - .../docs/examples/storage/create-file.md | 1 + .../docs/examples/storage/delete-file.md | 1 + .../examples/storage/get-file-download.md | 1 + .../docs/examples/storage/get-file-preview.md | 1 + .../docs/examples/storage/get-file-view.md | 1 + .../nodejs/docs/examples/storage/get-file.md | 1 + .../docs/examples/storage/list-files.md | 1 + .../docs/examples/storage/update-file.md | 1 + .../examples/teams/create-team-membership.md | 1 + .../nodejs/docs/examples/teams/create-team.md | 1 + .../examples/teams/delete-team-membership.md | 1 + .../nodejs/docs/examples/teams/delete-team.md | 1 + .../examples/teams/get-team-memberships.md | 1 + .../nodejs/docs/examples/teams/get-team.md | 1 + .../nodejs/docs/examples/teams/list-teams.md | 1 + .../teams/update-team-membership-status.md | 17 - .../nodejs/docs/examples/teams/update-team.md | 1 + .../nodejs/docs/examples/users/create-user.md | 1 + .../examples/users/delete-user-session.md | 1 + .../examples/users/delete-user-sessions.md | 1 + .../docs/examples/users/get-user-logs.md | 1 + .../docs/examples/users/get-user-prefs.md | 1 + .../docs/examples/users/get-user-sessions.md | 1 + .../nodejs/docs/examples/users/get-user.md | 1 + .../nodejs/docs/examples/users/list-users.md | 1 + .../docs/examples/users/update-user-prefs.md | 1 + .../docs/examples/users/update-user-status.md | 1 + app/sdks/nodejs/index.js | 4 - app/sdks/nodejs/lib/services/account.js | 474 -- app/sdks/nodejs/lib/services/projects.js | 609 --- app/sdks/nodejs/lib/services/teams.js | 38 - app/sdks/php/docs/account.md | 253 -- app/sdks/php/docs/auth.md | 151 - .../account/create-account-recovery.md | 13 - .../account/create-account-session-o-auth.md | 13 - .../account/create-account-session.md | 13 - .../account/create-account-verification.md | 14 - .../docs/examples/account/create-account.md | 13 - .../account/delete-account-current-session.md | 14 - .../account/delete-account-session.md | 14 - .../account/delete-account-sessions.md | 14 - app/sdks/php/docs/examples/account/delete.md | 14 - .../docs/examples/account/get-account-logs.md | 14 - .../examples/account/get-account-prefs.md | 14 - .../examples/account/get-account-sessions.md | 14 - .../php/docs/examples/account/get-account.md | 14 - .../php/docs/examples/account/get-prefs.md | 15 - .../php/docs/examples/account/get-security.md | 15 - .../php/docs/examples/account/get-sessions.md | 15 - app/sdks/php/docs/examples/account/get.md | 15 - .../examples/account/update-account-name.md | 14 - .../account/update-account-password.md | 14 - .../account/update-account-recovery.md | 13 - .../account/update-account-verification.md | 13 - .../php/docs/examples/account/update-email.md | 14 - .../php/docs/examples/account/update-name.md | 15 - .../docs/examples/account/update-password.md | 15 - .../php/docs/examples/account/update-prefs.md | 14 - .../php/docs/examples/auth/confirm-resend.md | 15 - app/sdks/php/docs/examples/auth/confirm.md | 13 - app/sdks/php/docs/examples/auth/login.md | 15 - .../docs/examples/auth/logout-by-session.md | 15 - app/sdks/php/docs/examples/auth/logout.md | 15 - .../php/docs/examples/auth/oauth-callback.md | 15 - app/sdks/php/docs/examples/auth/oauth.md | 15 - .../php/docs/examples/auth/recovery-reset.md | 15 - app/sdks/php/docs/examples/auth/recovery.md | 15 - app/sdks/php/docs/examples/auth/register.md | 15 - .../php/docs/examples/avatars/get-browser.md | 1 + .../docs/examples/avatars/get-credit-card.md | 1 + .../php/docs/examples/avatars/get-favicon.md | 1 + .../php/docs/examples/avatars/get-flag.md | 1 + .../php/docs/examples/avatars/get-image.md | 1 + app/sdks/php/docs/examples/avatars/get-q-r.md | 1 + .../examples/database/create-collection.md | 1 + .../docs/examples/database/create-document.md | 1 + .../examples/database/delete-collection.md | 1 + .../docs/examples/database/delete-document.md | 1 + .../docs/examples/database/get-collection.md | 1 + .../docs/examples/database/get-document.md | 1 + .../examples/database/list-collections.md | 1 + .../docs/examples/database/list-documents.md | 1 + .../examples/database/update-collection.md | 1 + .../docs/examples/database/update-document.md | 1 + .../docs/examples/locale/get-continents.md | 1 + .../docs/examples/locale/get-countries-e-u.md | 1 + .../examples/locale/get-countries-phones.md | 1 + .../php/docs/examples/locale/get-countries.md | 1 + .../docs/examples/locale/get-currencies.md | 1 + .../php/docs/examples/locale/get-locale.md | 1 + .../php/docs/examples/projects/create-key.md | 14 - .../docs/examples/projects/create-platform.md | 14 - .../docs/examples/projects/create-project.md | 14 - .../php/docs/examples/projects/create-task.md | 14 - .../docs/examples/projects/create-webhook.md | 14 - .../php/docs/examples/projects/delete-key.md | 14 - .../docs/examples/projects/delete-platform.md | 14 - .../docs/examples/projects/delete-project.md | 14 - .../php/docs/examples/projects/delete-task.md | 14 - .../docs/examples/projects/delete-webhook.md | 14 - .../php/docs/examples/projects/get-key.md | 14 - .../docs/examples/projects/get-platform.md | 14 - .../examples/projects/get-project-usage.md | 14 - .../php/docs/examples/projects/get-project.md | 14 - .../php/docs/examples/projects/get-task.md | 14 - .../php/docs/examples/projects/get-webhook.md | 14 - .../php/docs/examples/projects/list-keys.md | 14 - .../docs/examples/projects/list-platforms.md | 14 - .../docs/examples/projects/list-projects.md | 14 - .../php/docs/examples/projects/list-tasks.md | 14 - .../docs/examples/projects/list-webhooks.md | 14 - .../php/docs/examples/projects/update-key.md | 14 - .../docs/examples/projects/update-platform.md | 14 - .../projects/update-project-o-auth.md | 14 - .../docs/examples/projects/update-project.md | 14 - .../php/docs/examples/projects/update-task.md | 14 - .../docs/examples/projects/update-webhook.md | 14 - .../php/docs/examples/storage/create-file.md | 1 + .../php/docs/examples/storage/delete-file.md | 1 + .../examples/storage/get-file-download.md | 1 + .../docs/examples/storage/get-file-preview.md | 1 + .../docs/examples/storage/get-file-view.md | 1 + .../php/docs/examples/storage/get-file.md | 1 + .../php/docs/examples/storage/list-files.md | 1 + .../php/docs/examples/storage/update-file.md | 1 + .../teams/create-team-membership-resend.md | 15 - .../examples/teams/create-team-membership.md | 1 + .../php/docs/examples/teams/create-team.md | 1 + .../examples/teams/delete-team-membership.md | 1 + .../php/docs/examples/teams/delete-team.md | 1 + .../docs/examples/teams/get-team-members.md | 15 - .../examples/teams/get-team-memberships.md | 1 + app/sdks/php/docs/examples/teams/get-team.md | 1 + .../php/docs/examples/teams/list-teams.md | 1 + .../teams/update-team-membership-status.md | 13 - .../php/docs/examples/teams/update-team.md | 1 + .../php/docs/examples/users/create-user.md | 1 + .../examples/users/delete-user-session.md | 1 + .../examples/users/delete-user-sessions.md | 1 + .../examples/users/delete-users-session.md | 15 - .../php/docs/examples/users/get-user-logs.md | 1 + .../php/docs/examples/users/get-user-prefs.md | 1 + .../docs/examples/users/get-user-sessions.md | 1 + app/sdks/php/docs/examples/users/get-user.md | 1 + .../php/docs/examples/users/list-users.md | 1 + .../docs/examples/users/update-user-prefs.md | 1 + .../docs/examples/users/update-user-status.md | 1 + app/sdks/php/docs/projects.md | 398 -- app/sdks/php/docs/teams.md | 21 - .../php/src/Appwrite/Services/Account.php | 498 --- app/sdks/php/src/Appwrite/Services/Auth.php | 288 -- .../php/src/Appwrite/Services/Projects.php | 641 --- app/sdks/php/src/Appwrite/Services/Teams.php | 39 - app/sdks/python/appwrite/services/account.py | 222 - app/sdks/python/appwrite/services/auth.py | 120 - app/sdks/python/appwrite/services/projects.py | 381 -- app/sdks/python/appwrite/services/teams.py | 14 - app/sdks/ruby/lib/appwrite.rb | 2 - .../ruby/lib/appwrite/services/account.rb | 243 - app/sdks/ruby/lib/appwrite/services/auth.rb | 131 - .../ruby/lib/appwrite/services/projects.rb | 410 -- app/sdks/ruby/lib/appwrite/services/teams.rb | 15 - app/tasks/sdks.php | 4 +- 705 files changed, 163 insertions(+), 26466 deletions(-) delete mode 100644 app/sdks/dart/.packages delete mode 100644 app/sdks/dart/LICENSE delete mode 100644 app/sdks/dart/README.md delete mode 100644 app/sdks/dart/lib/appwrite.dart delete mode 100644 app/sdks/dart/lib/client.dart delete mode 100644 app/sdks/dart/lib/service.dart delete mode 100644 app/sdks/dart/lib/services/account.dart delete mode 100644 app/sdks/dart/lib/services/auth.dart delete mode 100644 app/sdks/dart/lib/services/avatars.dart delete mode 100644 app/sdks/dart/lib/services/database.dart delete mode 100644 app/sdks/dart/lib/services/locale.dart delete mode 100644 app/sdks/dart/lib/services/projects.dart delete mode 100644 app/sdks/dart/lib/services/storage.dart delete mode 100644 app/sdks/dart/lib/services/teams.dart delete mode 100644 app/sdks/dart/lib/services/users.dart delete mode 100644 app/sdks/dart/pubspec.lock delete mode 100644 app/sdks/dart/pubspec.yaml delete mode 100644 app/sdks/go/account.go delete mode 100644 app/sdks/go/auth.go delete mode 100644 app/sdks/go/docs/examples/Account/Delete.md delete mode 100644 app/sdks/go/docs/examples/Account/Get.md delete mode 100644 app/sdks/go/docs/examples/Account/GetPrefs.md delete mode 100644 app/sdks/go/docs/examples/Account/GetSecurity.md delete mode 100644 app/sdks/go/docs/examples/Account/GetSessions.md delete mode 100644 app/sdks/go/docs/examples/Account/UpdateEmail.md delete mode 100644 app/sdks/go/docs/examples/Account/UpdateName.md delete mode 100644 app/sdks/go/docs/examples/Account/UpdatePassword.md delete mode 100644 app/sdks/go/docs/examples/Account/UpdatePrefs.md delete mode 100644 app/sdks/go/docs/examples/Account/create-account-recovery.md delete mode 100644 app/sdks/go/docs/examples/Account/create-account-session-o-auth.md delete mode 100644 app/sdks/go/docs/examples/Account/create-account-session.md delete mode 100644 app/sdks/go/docs/examples/Account/create-account-verification.md delete mode 100644 app/sdks/go/docs/examples/Account/create-account.md delete mode 100644 app/sdks/go/docs/examples/Account/delete-account-current-session.md delete mode 100644 app/sdks/go/docs/examples/Account/delete-account-session.md delete mode 100644 app/sdks/go/docs/examples/Account/delete-account-sessions.md delete mode 100644 app/sdks/go/docs/examples/Account/get-account-logs.md delete mode 100644 app/sdks/go/docs/examples/Account/get-account-prefs.md delete mode 100644 app/sdks/go/docs/examples/Account/get-account-sessions.md delete mode 100644 app/sdks/go/docs/examples/Account/get-account.md delete mode 100644 app/sdks/go/docs/examples/Account/get-prefs.md delete mode 100644 app/sdks/go/docs/examples/Account/get-security.md delete mode 100644 app/sdks/go/docs/examples/Account/get-sessions.md delete mode 100644 app/sdks/go/docs/examples/Account/update-account-name.md delete mode 100644 app/sdks/go/docs/examples/Account/update-account-password.md delete mode 100644 app/sdks/go/docs/examples/Account/update-account-recovery.md delete mode 100644 app/sdks/go/docs/examples/Account/update-account-verification.md delete mode 100644 app/sdks/go/docs/examples/Account/update-email.md delete mode 100644 app/sdks/go/docs/examples/Account/update-name.md delete mode 100644 app/sdks/go/docs/examples/Account/update-password.md delete mode 100644 app/sdks/go/docs/examples/Account/update-prefs.md delete mode 100644 app/sdks/go/docs/examples/Auth/Confirm.md delete mode 100644 app/sdks/go/docs/examples/Auth/ConfirmResend.md delete mode 100644 app/sdks/go/docs/examples/Auth/Login.md delete mode 100644 app/sdks/go/docs/examples/Auth/Logout.md delete mode 100644 app/sdks/go/docs/examples/Auth/LogoutBySession.md delete mode 100644 app/sdks/go/docs/examples/Auth/Oauth.md delete mode 100644 app/sdks/go/docs/examples/Auth/Recovery.md delete mode 100644 app/sdks/go/docs/examples/Auth/RecoveryReset.md delete mode 100644 app/sdks/go/docs/examples/Auth/Register.md delete mode 100644 app/sdks/go/docs/examples/Auth/confirm-resend.md delete mode 100644 app/sdks/go/docs/examples/Auth/logout-by-session.md delete mode 100644 app/sdks/go/docs/examples/Auth/recovery-reset.md delete mode 100644 app/sdks/go/docs/examples/Avatars/GetBrowser.md delete mode 100644 app/sdks/go/docs/examples/Avatars/GetCreditCard.md delete mode 100644 app/sdks/go/docs/examples/Avatars/GetFavicon.md delete mode 100644 app/sdks/go/docs/examples/Avatars/GetFlag.md delete mode 100644 app/sdks/go/docs/examples/Avatars/GetImage.md delete mode 100644 app/sdks/go/docs/examples/Avatars/GetQR.md delete mode 100644 app/sdks/go/docs/examples/Database/CreateCollection.md delete mode 100644 app/sdks/go/docs/examples/Database/CreateDocument.md delete mode 100644 app/sdks/go/docs/examples/Database/DeleteCollection.md delete mode 100644 app/sdks/go/docs/examples/Database/DeleteDocument.md delete mode 100644 app/sdks/go/docs/examples/Database/GetCollection.md delete mode 100644 app/sdks/go/docs/examples/Database/GetDocument.md delete mode 100644 app/sdks/go/docs/examples/Database/ListCollections.md delete mode 100644 app/sdks/go/docs/examples/Database/ListDocuments.md delete mode 100644 app/sdks/go/docs/examples/Database/UpdateCollection.md delete mode 100644 app/sdks/go/docs/examples/Database/UpdateDocument.md delete mode 100644 app/sdks/go/docs/examples/Locale/GetCountries.md delete mode 100644 app/sdks/go/docs/examples/Locale/GetCountriesEU.md delete mode 100644 app/sdks/go/docs/examples/Locale/GetCountriesPhones.md delete mode 100644 app/sdks/go/docs/examples/Locale/GetCurrencies.md delete mode 100644 app/sdks/go/docs/examples/Locale/GetLocale.md delete mode 100644 app/sdks/go/docs/examples/Projects/CreateKey.md delete mode 100644 app/sdks/go/docs/examples/Projects/CreatePlatform.md delete mode 100644 app/sdks/go/docs/examples/Projects/CreateProject.md delete mode 100644 app/sdks/go/docs/examples/Projects/CreateTask.md delete mode 100644 app/sdks/go/docs/examples/Projects/CreateWebhook.md delete mode 100644 app/sdks/go/docs/examples/Projects/DeleteKey.md delete mode 100644 app/sdks/go/docs/examples/Projects/DeletePlatform.md delete mode 100644 app/sdks/go/docs/examples/Projects/DeleteProject.md delete mode 100644 app/sdks/go/docs/examples/Projects/DeleteTask.md delete mode 100644 app/sdks/go/docs/examples/Projects/DeleteWebhook.md delete mode 100644 app/sdks/go/docs/examples/Projects/GetKey.md delete mode 100644 app/sdks/go/docs/examples/Projects/GetPlatform.md delete mode 100644 app/sdks/go/docs/examples/Projects/GetProject.md delete mode 100644 app/sdks/go/docs/examples/Projects/GetProjectUsage.md delete mode 100644 app/sdks/go/docs/examples/Projects/GetTask.md delete mode 100644 app/sdks/go/docs/examples/Projects/GetWebhook.md delete mode 100644 app/sdks/go/docs/examples/Projects/ListKeys.md delete mode 100644 app/sdks/go/docs/examples/Projects/ListPlatforms.md delete mode 100644 app/sdks/go/docs/examples/Projects/ListProjects.md delete mode 100644 app/sdks/go/docs/examples/Projects/ListTasks.md delete mode 100644 app/sdks/go/docs/examples/Projects/ListWebhooks.md delete mode 100644 app/sdks/go/docs/examples/Projects/UpdateKey.md delete mode 100644 app/sdks/go/docs/examples/Projects/UpdatePlatform.md delete mode 100644 app/sdks/go/docs/examples/Projects/UpdateProject.md delete mode 100644 app/sdks/go/docs/examples/Projects/UpdateProjectOAuth.md delete mode 100644 app/sdks/go/docs/examples/Projects/UpdateTask.md delete mode 100644 app/sdks/go/docs/examples/Projects/UpdateWebhook.md delete mode 100644 app/sdks/go/docs/examples/Projects/create-key.md delete mode 100644 app/sdks/go/docs/examples/Projects/create-platform.md delete mode 100644 app/sdks/go/docs/examples/Projects/create-project.md delete mode 100644 app/sdks/go/docs/examples/Projects/create-task.md delete mode 100644 app/sdks/go/docs/examples/Projects/create-webhook.md delete mode 100644 app/sdks/go/docs/examples/Projects/delete-key.md delete mode 100644 app/sdks/go/docs/examples/Projects/delete-platform.md delete mode 100644 app/sdks/go/docs/examples/Projects/delete-project.md delete mode 100644 app/sdks/go/docs/examples/Projects/delete-task.md delete mode 100644 app/sdks/go/docs/examples/Projects/delete-webhook.md delete mode 100644 app/sdks/go/docs/examples/Projects/get-key.md delete mode 100644 app/sdks/go/docs/examples/Projects/get-platform.md delete mode 100644 app/sdks/go/docs/examples/Projects/get-project-usage.md delete mode 100644 app/sdks/go/docs/examples/Projects/get-project.md delete mode 100644 app/sdks/go/docs/examples/Projects/get-task.md delete mode 100644 app/sdks/go/docs/examples/Projects/get-webhook.md delete mode 100644 app/sdks/go/docs/examples/Projects/list-keys.md delete mode 100644 app/sdks/go/docs/examples/Projects/list-platforms.md delete mode 100644 app/sdks/go/docs/examples/Projects/list-projects.md delete mode 100644 app/sdks/go/docs/examples/Projects/list-tasks.md delete mode 100644 app/sdks/go/docs/examples/Projects/list-webhooks.md delete mode 100644 app/sdks/go/docs/examples/Projects/update-key.md delete mode 100644 app/sdks/go/docs/examples/Projects/update-platform.md delete mode 100644 app/sdks/go/docs/examples/Projects/update-project-o-auth.md delete mode 100644 app/sdks/go/docs/examples/Projects/update-project.md delete mode 100644 app/sdks/go/docs/examples/Projects/update-task.md delete mode 100644 app/sdks/go/docs/examples/Projects/update-webhook.md delete mode 100644 app/sdks/go/docs/examples/Storage/CreateFile.md delete mode 100644 app/sdks/go/docs/examples/Storage/DeleteFile.md delete mode 100644 app/sdks/go/docs/examples/Storage/GetFile.md delete mode 100644 app/sdks/go/docs/examples/Storage/GetFileDownload.md delete mode 100644 app/sdks/go/docs/examples/Storage/GetFilePreview.md delete mode 100644 app/sdks/go/docs/examples/Storage/GetFileView.md delete mode 100644 app/sdks/go/docs/examples/Storage/ListFiles.md delete mode 100644 app/sdks/go/docs/examples/Storage/UpdateFile.md delete mode 100644 app/sdks/go/docs/examples/Teams/CreateTeam.md delete mode 100644 app/sdks/go/docs/examples/Teams/CreateTeamMembership.md delete mode 100644 app/sdks/go/docs/examples/Teams/CreateTeamMembershipResend.md delete mode 100644 app/sdks/go/docs/examples/Teams/DeleteTeam.md delete mode 100644 app/sdks/go/docs/examples/Teams/DeleteTeamMembership.md delete mode 100644 app/sdks/go/docs/examples/Teams/GetTeam.md delete mode 100644 app/sdks/go/docs/examples/Teams/GetTeamMembers.md delete mode 100644 app/sdks/go/docs/examples/Teams/ListTeams.md delete mode 100644 app/sdks/go/docs/examples/Teams/UpdateTeam.md delete mode 100644 app/sdks/go/docs/examples/Teams/UpdateTeamMembershipStatus.md delete mode 100644 app/sdks/go/docs/examples/Teams/create-team-membership-resend.md delete mode 100644 app/sdks/go/docs/examples/Teams/get-team-members.md delete mode 100644 app/sdks/go/docs/examples/Teams/update-team-membership-status.md delete mode 100644 app/sdks/go/docs/examples/Users/CreateUser.md delete mode 100644 app/sdks/go/docs/examples/Users/DeleteUserSession.md delete mode 100644 app/sdks/go/docs/examples/Users/DeleteUserSessions.md delete mode 100644 app/sdks/go/docs/examples/Users/GetUser.md delete mode 100644 app/sdks/go/docs/examples/Users/GetUserLogs.md delete mode 100644 app/sdks/go/docs/examples/Users/GetUserPrefs.md delete mode 100644 app/sdks/go/docs/examples/Users/GetUserSessions.md delete mode 100644 app/sdks/go/docs/examples/Users/ListUsers.md delete mode 100644 app/sdks/go/docs/examples/Users/UpdateUserPrefs.md delete mode 100644 app/sdks/go/docs/examples/Users/UpdateUserStatus.md delete mode 100644 app/sdks/go/projects.go delete mode 100644 app/sdks/javascript/docs/examples/account/create-account-verification.md delete mode 100644 app/sdks/javascript/docs/examples/projects/create-key.md delete mode 100644 app/sdks/javascript/docs/examples/projects/create-platform.md delete mode 100644 app/sdks/javascript/docs/examples/projects/create-project.md delete mode 100644 app/sdks/javascript/docs/examples/projects/create-task.md delete mode 100644 app/sdks/javascript/docs/examples/projects/create-webhook.md delete mode 100644 app/sdks/javascript/docs/examples/projects/delete-key.md delete mode 100644 app/sdks/javascript/docs/examples/projects/delete-platform.md delete mode 100644 app/sdks/javascript/docs/examples/projects/delete-project.md delete mode 100644 app/sdks/javascript/docs/examples/projects/delete-task.md delete mode 100644 app/sdks/javascript/docs/examples/projects/delete-webhook.md delete mode 100644 app/sdks/javascript/docs/examples/projects/get-key.md delete mode 100644 app/sdks/javascript/docs/examples/projects/get-platform.md delete mode 100644 app/sdks/javascript/docs/examples/projects/get-project-usage.md delete mode 100644 app/sdks/javascript/docs/examples/projects/get-project.md delete mode 100644 app/sdks/javascript/docs/examples/projects/get-task.md delete mode 100644 app/sdks/javascript/docs/examples/projects/get-webhook.md delete mode 100644 app/sdks/javascript/docs/examples/projects/list-keys.md delete mode 100644 app/sdks/javascript/docs/examples/projects/list-platforms.md delete mode 100644 app/sdks/javascript/docs/examples/projects/list-projects.md delete mode 100644 app/sdks/javascript/docs/examples/projects/list-tasks.md delete mode 100644 app/sdks/javascript/docs/examples/projects/list-webhooks.md delete mode 100644 app/sdks/javascript/docs/examples/projects/update-key.md delete mode 100644 app/sdks/javascript/docs/examples/projects/update-platform.md delete mode 100644 app/sdks/javascript/docs/examples/projects/update-project-o-auth.md delete mode 100644 app/sdks/javascript/docs/examples/projects/update-project.md delete mode 100644 app/sdks/javascript/docs/examples/projects/update-task.md delete mode 100644 app/sdks/javascript/docs/examples/projects/update-webhook.md delete mode 100644 app/sdks/javascript/docs/examples/users/create-user.md delete mode 100644 app/sdks/javascript/docs/examples/users/delete-user-session.md delete mode 100644 app/sdks/javascript/docs/examples/users/delete-user-sessions.md delete mode 100644 app/sdks/javascript/docs/examples/users/get-user-logs.md delete mode 100644 app/sdks/javascript/docs/examples/users/get-user-prefs.md delete mode 100644 app/sdks/javascript/docs/examples/users/get-user-sessions.md delete mode 100644 app/sdks/javascript/docs/examples/users/get-user.md delete mode 100644 app/sdks/javascript/docs/examples/users/list-users.md delete mode 100644 app/sdks/javascript/docs/examples/users/update-user-prefs.md delete mode 100644 app/sdks/javascript/docs/examples/users/update-user-status.md delete mode 100644 app/sdks/js/LICENSE delete mode 100644 app/sdks/js/README.md delete mode 100644 app/sdks/js/docs/examples/account/delete.md delete mode 100644 app/sdks/js/docs/examples/account/get-prefs.md delete mode 100644 app/sdks/js/docs/examples/account/get-security.md delete mode 100644 app/sdks/js/docs/examples/account/get-sessions.md delete mode 100644 app/sdks/js/docs/examples/account/get.md delete mode 100644 app/sdks/js/docs/examples/account/update-email.md delete mode 100644 app/sdks/js/docs/examples/account/update-name.md delete mode 100644 app/sdks/js/docs/examples/account/update-password.md delete mode 100644 app/sdks/js/docs/examples/account/update-prefs.md delete mode 100644 app/sdks/js/docs/examples/auth/confirm-resend.md delete mode 100644 app/sdks/js/docs/examples/auth/confirm.md delete mode 100644 app/sdks/js/docs/examples/auth/login.md delete mode 100644 app/sdks/js/docs/examples/auth/logout-by-session.md delete mode 100644 app/sdks/js/docs/examples/auth/logout.md delete mode 100644 app/sdks/js/docs/examples/auth/oauth-callback.md delete mode 100644 app/sdks/js/docs/examples/auth/oauth.md delete mode 100644 app/sdks/js/docs/examples/auth/recovery-reset.md delete mode 100644 app/sdks/js/docs/examples/auth/recovery.md delete mode 100644 app/sdks/js/docs/examples/auth/register.md delete mode 100644 app/sdks/js/docs/examples/avatars/get-browser.md delete mode 100644 app/sdks/js/docs/examples/avatars/get-credit-card.md delete mode 100644 app/sdks/js/docs/examples/avatars/get-favicon.md delete mode 100644 app/sdks/js/docs/examples/avatars/get-flag.md delete mode 100644 app/sdks/js/docs/examples/avatars/get-image.md delete mode 100644 app/sdks/js/docs/examples/avatars/get-q-r.md delete mode 100644 app/sdks/js/docs/examples/database/create-collection.md delete mode 100644 app/sdks/js/docs/examples/database/create-document.md delete mode 100644 app/sdks/js/docs/examples/database/delete-collection.md delete mode 100644 app/sdks/js/docs/examples/database/delete-document.md delete mode 100644 app/sdks/js/docs/examples/database/get-collection.md delete mode 100644 app/sdks/js/docs/examples/database/get-document.md delete mode 100644 app/sdks/js/docs/examples/database/list-collections.md delete mode 100644 app/sdks/js/docs/examples/database/list-documents.md delete mode 100644 app/sdks/js/docs/examples/database/update-collection.md delete mode 100644 app/sdks/js/docs/examples/database/update-document.md delete mode 100644 app/sdks/js/docs/examples/locale/get-continents.md delete mode 100644 app/sdks/js/docs/examples/locale/get-countries-e-u.md delete mode 100644 app/sdks/js/docs/examples/locale/get-countries-phones.md delete mode 100644 app/sdks/js/docs/examples/locale/get-countries.md delete mode 100644 app/sdks/js/docs/examples/locale/get-currencies.md delete mode 100644 app/sdks/js/docs/examples/locale/get-locale.md delete mode 100644 app/sdks/js/docs/examples/projects/create-key.md delete mode 100644 app/sdks/js/docs/examples/projects/create-platform.md delete mode 100644 app/sdks/js/docs/examples/projects/create-project.md delete mode 100644 app/sdks/js/docs/examples/projects/create-task.md delete mode 100644 app/sdks/js/docs/examples/projects/create-webhook.md delete mode 100644 app/sdks/js/docs/examples/projects/delete-key.md delete mode 100644 app/sdks/js/docs/examples/projects/delete-platform.md delete mode 100644 app/sdks/js/docs/examples/projects/delete-project.md delete mode 100644 app/sdks/js/docs/examples/projects/delete-task.md delete mode 100644 app/sdks/js/docs/examples/projects/delete-webhook.md delete mode 100644 app/sdks/js/docs/examples/projects/get-key.md delete mode 100644 app/sdks/js/docs/examples/projects/get-platform.md delete mode 100644 app/sdks/js/docs/examples/projects/get-project-usage.md delete mode 100644 app/sdks/js/docs/examples/projects/get-project.md delete mode 100644 app/sdks/js/docs/examples/projects/get-task.md delete mode 100644 app/sdks/js/docs/examples/projects/get-webhook.md delete mode 100644 app/sdks/js/docs/examples/projects/list-keys.md delete mode 100644 app/sdks/js/docs/examples/projects/list-platforms.md delete mode 100644 app/sdks/js/docs/examples/projects/list-projects.md delete mode 100644 app/sdks/js/docs/examples/projects/list-tasks.md delete mode 100644 app/sdks/js/docs/examples/projects/list-webhooks.md delete mode 100644 app/sdks/js/docs/examples/projects/update-key.md delete mode 100644 app/sdks/js/docs/examples/projects/update-platform.md delete mode 100644 app/sdks/js/docs/examples/projects/update-project-o-auth.md delete mode 100644 app/sdks/js/docs/examples/projects/update-project.md delete mode 100644 app/sdks/js/docs/examples/projects/update-task.md delete mode 100644 app/sdks/js/docs/examples/projects/update-webhook.md delete mode 100644 app/sdks/js/docs/examples/storage/create-file.md delete mode 100644 app/sdks/js/docs/examples/storage/delete-file.md delete mode 100644 app/sdks/js/docs/examples/storage/get-file-download.md delete mode 100644 app/sdks/js/docs/examples/storage/get-file-preview.md delete mode 100644 app/sdks/js/docs/examples/storage/get-file-view.md delete mode 100644 app/sdks/js/docs/examples/storage/get-file.md delete mode 100644 app/sdks/js/docs/examples/storage/list-files.md delete mode 100644 app/sdks/js/docs/examples/storage/update-file.md delete mode 100644 app/sdks/js/docs/examples/teams/create-team-membership-resend.md delete mode 100644 app/sdks/js/docs/examples/teams/create-team-membership.md delete mode 100644 app/sdks/js/docs/examples/teams/create-team.md delete mode 100644 app/sdks/js/docs/examples/teams/delete-team-membership.md delete mode 100644 app/sdks/js/docs/examples/teams/delete-team.md delete mode 100644 app/sdks/js/docs/examples/teams/get-team-members.md delete mode 100644 app/sdks/js/docs/examples/teams/get-team.md delete mode 100644 app/sdks/js/docs/examples/teams/list-teams.md delete mode 100644 app/sdks/js/docs/examples/teams/update-team-membership-status.md delete mode 100644 app/sdks/js/docs/examples/teams/update-team.md delete mode 100644 app/sdks/js/docs/examples/users/create-user.md delete mode 100644 app/sdks/js/docs/examples/users/delete-user-session.md delete mode 100644 app/sdks/js/docs/examples/users/delete-user-sessions.md delete mode 100644 app/sdks/js/docs/examples/users/delete-users-session.md delete mode 100644 app/sdks/js/docs/examples/users/get-user-logs.md delete mode 100644 app/sdks/js/docs/examples/users/get-user-prefs.md delete mode 100644 app/sdks/js/docs/examples/users/get-user-sessions.md delete mode 100644 app/sdks/js/docs/examples/users/get-user.md delete mode 100644 app/sdks/js/docs/examples/users/list-users.md delete mode 100644 app/sdks/js/docs/examples/users/update-user-prefs.md delete mode 100644 app/sdks/js/docs/examples/users/update-user-status.md delete mode 100644 app/sdks/js/package.json delete mode 100644 app/sdks/js/src/sdk.js delete mode 100644 app/sdks/js/src/sdk.min.js delete mode 100644 app/sdks/node/LICENSE delete mode 100644 app/sdks/node/README.md delete mode 100644 app/sdks/node/docs/examples/account/delete.md delete mode 100644 app/sdks/node/docs/examples/account/get-prefs.md delete mode 100644 app/sdks/node/docs/examples/account/get-security.md delete mode 100644 app/sdks/node/docs/examples/account/get-sessions.md delete mode 100644 app/sdks/node/docs/examples/account/get.md delete mode 100644 app/sdks/node/docs/examples/account/update-email.md delete mode 100644 app/sdks/node/docs/examples/account/update-name.md delete mode 100644 app/sdks/node/docs/examples/account/update-password.md delete mode 100644 app/sdks/node/docs/examples/account/update-prefs.md delete mode 100644 app/sdks/node/docs/examples/auth/confirm-resend.md delete mode 100644 app/sdks/node/docs/examples/auth/confirm.md delete mode 100644 app/sdks/node/docs/examples/auth/login.md delete mode 100644 app/sdks/node/docs/examples/auth/logout-by-session.md delete mode 100644 app/sdks/node/docs/examples/auth/logout.md delete mode 100644 app/sdks/node/docs/examples/auth/oauth-callback.md delete mode 100644 app/sdks/node/docs/examples/auth/oauth.md delete mode 100644 app/sdks/node/docs/examples/auth/recovery-reset.md delete mode 100644 app/sdks/node/docs/examples/auth/recovery.md delete mode 100644 app/sdks/node/docs/examples/auth/register.md delete mode 100644 app/sdks/node/docs/examples/avatars/get-browser.md delete mode 100644 app/sdks/node/docs/examples/avatars/get-credit-card.md delete mode 100644 app/sdks/node/docs/examples/avatars/get-favicon.md delete mode 100644 app/sdks/node/docs/examples/avatars/get-flag.md delete mode 100644 app/sdks/node/docs/examples/avatars/get-image.md delete mode 100644 app/sdks/node/docs/examples/avatars/get-q-r.md delete mode 100644 app/sdks/node/docs/examples/database/create-collection.md delete mode 100644 app/sdks/node/docs/examples/database/create-document.md delete mode 100644 app/sdks/node/docs/examples/database/delete-collection.md delete mode 100644 app/sdks/node/docs/examples/database/delete-document.md delete mode 100644 app/sdks/node/docs/examples/database/get-collection.md delete mode 100644 app/sdks/node/docs/examples/database/get-document.md delete mode 100644 app/sdks/node/docs/examples/database/list-collections.md delete mode 100644 app/sdks/node/docs/examples/database/list-documents.md delete mode 100644 app/sdks/node/docs/examples/database/update-collection.md delete mode 100644 app/sdks/node/docs/examples/database/update-document.md delete mode 100644 app/sdks/node/docs/examples/locale/get-continents.md delete mode 100644 app/sdks/node/docs/examples/locale/get-countries-e-u.md delete mode 100644 app/sdks/node/docs/examples/locale/get-countries-phones.md delete mode 100644 app/sdks/node/docs/examples/locale/get-countries.md delete mode 100644 app/sdks/node/docs/examples/locale/get-currencies.md delete mode 100644 app/sdks/node/docs/examples/locale/get-locale.md delete mode 100644 app/sdks/node/docs/examples/projects/create-key.md delete mode 100644 app/sdks/node/docs/examples/projects/create-platform.md delete mode 100644 app/sdks/node/docs/examples/projects/create-project.md delete mode 100644 app/sdks/node/docs/examples/projects/create-task.md delete mode 100644 app/sdks/node/docs/examples/projects/create-webhook.md delete mode 100644 app/sdks/node/docs/examples/projects/delete-key.md delete mode 100644 app/sdks/node/docs/examples/projects/delete-platform.md delete mode 100644 app/sdks/node/docs/examples/projects/delete-project.md delete mode 100644 app/sdks/node/docs/examples/projects/delete-task.md delete mode 100644 app/sdks/node/docs/examples/projects/delete-webhook.md delete mode 100644 app/sdks/node/docs/examples/projects/get-key.md delete mode 100644 app/sdks/node/docs/examples/projects/get-platform.md delete mode 100644 app/sdks/node/docs/examples/projects/get-project-usage.md delete mode 100644 app/sdks/node/docs/examples/projects/get-project.md delete mode 100644 app/sdks/node/docs/examples/projects/get-task.md delete mode 100644 app/sdks/node/docs/examples/projects/get-webhook.md delete mode 100644 app/sdks/node/docs/examples/projects/list-keys.md delete mode 100644 app/sdks/node/docs/examples/projects/list-platforms.md delete mode 100644 app/sdks/node/docs/examples/projects/list-projects.md delete mode 100644 app/sdks/node/docs/examples/projects/list-tasks.md delete mode 100644 app/sdks/node/docs/examples/projects/list-webhooks.md delete mode 100644 app/sdks/node/docs/examples/projects/update-key.md delete mode 100644 app/sdks/node/docs/examples/projects/update-platform.md delete mode 100644 app/sdks/node/docs/examples/projects/update-project-o-auth.md delete mode 100644 app/sdks/node/docs/examples/projects/update-project.md delete mode 100644 app/sdks/node/docs/examples/projects/update-task.md delete mode 100644 app/sdks/node/docs/examples/projects/update-webhook.md delete mode 100644 app/sdks/node/docs/examples/storage/create-file.md delete mode 100644 app/sdks/node/docs/examples/storage/delete-file.md delete mode 100644 app/sdks/node/docs/examples/storage/get-file-download.md delete mode 100644 app/sdks/node/docs/examples/storage/get-file-preview.md delete mode 100644 app/sdks/node/docs/examples/storage/get-file-view.md delete mode 100644 app/sdks/node/docs/examples/storage/get-file.md delete mode 100644 app/sdks/node/docs/examples/storage/list-files.md delete mode 100644 app/sdks/node/docs/examples/storage/update-file.md delete mode 100644 app/sdks/node/docs/examples/teams/create-team-membership-resend.md delete mode 100644 app/sdks/node/docs/examples/teams/create-team-membership.md delete mode 100644 app/sdks/node/docs/examples/teams/create-team.md delete mode 100644 app/sdks/node/docs/examples/teams/delete-team-membership.md delete mode 100644 app/sdks/node/docs/examples/teams/delete-team.md delete mode 100644 app/sdks/node/docs/examples/teams/get-team-members.md delete mode 100644 app/sdks/node/docs/examples/teams/get-team.md delete mode 100644 app/sdks/node/docs/examples/teams/list-teams.md delete mode 100644 app/sdks/node/docs/examples/teams/update-team-membership-status.md delete mode 100644 app/sdks/node/docs/examples/teams/update-team.md delete mode 100644 app/sdks/node/docs/examples/users/create-user.md delete mode 100644 app/sdks/node/docs/examples/users/delete-user-session.md delete mode 100644 app/sdks/node/docs/examples/users/delete-user-sessions.md delete mode 100644 app/sdks/node/docs/examples/users/delete-users-session.md delete mode 100644 app/sdks/node/docs/examples/users/get-user-logs.md delete mode 100644 app/sdks/node/docs/examples/users/get-user-prefs.md delete mode 100644 app/sdks/node/docs/examples/users/get-user-sessions.md delete mode 100644 app/sdks/node/docs/examples/users/get-user.md delete mode 100644 app/sdks/node/docs/examples/users/list-users.md delete mode 100644 app/sdks/node/docs/examples/users/update-user-prefs.md delete mode 100644 app/sdks/node/docs/examples/users/update-user-status.md delete mode 100644 app/sdks/node/index.js delete mode 100644 app/sdks/node/lib/client.js delete mode 100644 app/sdks/node/lib/service.js delete mode 100644 app/sdks/node/lib/services/account.js delete mode 100644 app/sdks/node/lib/services/auth.js delete mode 100644 app/sdks/node/lib/services/avatars.js delete mode 100644 app/sdks/node/lib/services/database.js delete mode 100644 app/sdks/node/lib/services/locale.js delete mode 100644 app/sdks/node/lib/services/projects.js delete mode 100644 app/sdks/node/lib/services/storage.js delete mode 100644 app/sdks/node/lib/services/teams.js delete mode 100644 app/sdks/node/lib/services/users.js delete mode 100644 app/sdks/node/package.json delete mode 100644 app/sdks/nodejs/docs/examples/account/create-account-recovery.md delete mode 100644 app/sdks/nodejs/docs/examples/account/create-account-session-o-auth.md delete mode 100644 app/sdks/nodejs/docs/examples/account/create-account-session.md delete mode 100644 app/sdks/nodejs/docs/examples/account/create-account-verification.md delete mode 100644 app/sdks/nodejs/docs/examples/account/create-account.md delete mode 100644 app/sdks/nodejs/docs/examples/account/delete-account-current-session.md delete mode 100644 app/sdks/nodejs/docs/examples/account/delete-account-session.md delete mode 100644 app/sdks/nodejs/docs/examples/account/delete-account-sessions.md delete mode 100644 app/sdks/nodejs/docs/examples/account/delete.md delete mode 100644 app/sdks/nodejs/docs/examples/account/get-account-logs.md delete mode 100644 app/sdks/nodejs/docs/examples/account/get-account-prefs.md delete mode 100644 app/sdks/nodejs/docs/examples/account/get-account-sessions.md delete mode 100644 app/sdks/nodejs/docs/examples/account/get-account.md delete mode 100644 app/sdks/nodejs/docs/examples/account/update-account-name.md delete mode 100644 app/sdks/nodejs/docs/examples/account/update-account-password.md delete mode 100644 app/sdks/nodejs/docs/examples/account/update-account-recovery.md delete mode 100644 app/sdks/nodejs/docs/examples/account/update-account-verification.md delete mode 100644 app/sdks/nodejs/docs/examples/account/update-email.md delete mode 100644 app/sdks/nodejs/docs/examples/account/update-prefs.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/create-key.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/create-platform.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/create-project.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/create-task.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/create-webhook.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/delete-key.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/delete-platform.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/delete-project.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/delete-task.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/delete-webhook.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/get-key.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/get-platform.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/get-project-usage.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/get-project.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/get-task.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/get-webhook.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/list-keys.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/list-platforms.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/list-projects.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/list-tasks.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/list-webhooks.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/update-key.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/update-platform.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/update-project-o-auth.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/update-project.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/update-task.md delete mode 100644 app/sdks/nodejs/docs/examples/projects/update-webhook.md delete mode 100644 app/sdks/nodejs/docs/examples/teams/update-team-membership-status.md delete mode 100644 app/sdks/nodejs/lib/services/account.js delete mode 100644 app/sdks/nodejs/lib/services/projects.js delete mode 100644 app/sdks/php/docs/account.md delete mode 100644 app/sdks/php/docs/auth.md delete mode 100644 app/sdks/php/docs/examples/account/create-account-recovery.md delete mode 100644 app/sdks/php/docs/examples/account/create-account-session-o-auth.md delete mode 100644 app/sdks/php/docs/examples/account/create-account-session.md delete mode 100644 app/sdks/php/docs/examples/account/create-account-verification.md delete mode 100644 app/sdks/php/docs/examples/account/create-account.md delete mode 100644 app/sdks/php/docs/examples/account/delete-account-current-session.md delete mode 100644 app/sdks/php/docs/examples/account/delete-account-session.md delete mode 100644 app/sdks/php/docs/examples/account/delete-account-sessions.md delete mode 100644 app/sdks/php/docs/examples/account/delete.md delete mode 100644 app/sdks/php/docs/examples/account/get-account-logs.md delete mode 100644 app/sdks/php/docs/examples/account/get-account-prefs.md delete mode 100644 app/sdks/php/docs/examples/account/get-account-sessions.md delete mode 100644 app/sdks/php/docs/examples/account/get-account.md delete mode 100644 app/sdks/php/docs/examples/account/get-prefs.md delete mode 100644 app/sdks/php/docs/examples/account/get-security.md delete mode 100644 app/sdks/php/docs/examples/account/get-sessions.md delete mode 100644 app/sdks/php/docs/examples/account/get.md delete mode 100644 app/sdks/php/docs/examples/account/update-account-name.md delete mode 100644 app/sdks/php/docs/examples/account/update-account-password.md delete mode 100644 app/sdks/php/docs/examples/account/update-account-recovery.md delete mode 100644 app/sdks/php/docs/examples/account/update-account-verification.md delete mode 100644 app/sdks/php/docs/examples/account/update-email.md delete mode 100644 app/sdks/php/docs/examples/account/update-name.md delete mode 100644 app/sdks/php/docs/examples/account/update-password.md delete mode 100644 app/sdks/php/docs/examples/account/update-prefs.md delete mode 100644 app/sdks/php/docs/examples/auth/confirm-resend.md delete mode 100644 app/sdks/php/docs/examples/auth/confirm.md delete mode 100644 app/sdks/php/docs/examples/auth/login.md delete mode 100644 app/sdks/php/docs/examples/auth/logout-by-session.md delete mode 100644 app/sdks/php/docs/examples/auth/logout.md delete mode 100644 app/sdks/php/docs/examples/auth/oauth-callback.md delete mode 100644 app/sdks/php/docs/examples/auth/oauth.md delete mode 100644 app/sdks/php/docs/examples/auth/recovery-reset.md delete mode 100644 app/sdks/php/docs/examples/auth/recovery.md delete mode 100644 app/sdks/php/docs/examples/auth/register.md delete mode 100644 app/sdks/php/docs/examples/projects/create-key.md delete mode 100644 app/sdks/php/docs/examples/projects/create-platform.md delete mode 100644 app/sdks/php/docs/examples/projects/create-project.md delete mode 100644 app/sdks/php/docs/examples/projects/create-task.md delete mode 100644 app/sdks/php/docs/examples/projects/create-webhook.md delete mode 100644 app/sdks/php/docs/examples/projects/delete-key.md delete mode 100644 app/sdks/php/docs/examples/projects/delete-platform.md delete mode 100644 app/sdks/php/docs/examples/projects/delete-project.md delete mode 100644 app/sdks/php/docs/examples/projects/delete-task.md delete mode 100644 app/sdks/php/docs/examples/projects/delete-webhook.md delete mode 100644 app/sdks/php/docs/examples/projects/get-key.md delete mode 100644 app/sdks/php/docs/examples/projects/get-platform.md delete mode 100644 app/sdks/php/docs/examples/projects/get-project-usage.md delete mode 100644 app/sdks/php/docs/examples/projects/get-project.md delete mode 100644 app/sdks/php/docs/examples/projects/get-task.md delete mode 100644 app/sdks/php/docs/examples/projects/get-webhook.md delete mode 100644 app/sdks/php/docs/examples/projects/list-keys.md delete mode 100644 app/sdks/php/docs/examples/projects/list-platforms.md delete mode 100644 app/sdks/php/docs/examples/projects/list-projects.md delete mode 100644 app/sdks/php/docs/examples/projects/list-tasks.md delete mode 100644 app/sdks/php/docs/examples/projects/list-webhooks.md delete mode 100644 app/sdks/php/docs/examples/projects/update-key.md delete mode 100644 app/sdks/php/docs/examples/projects/update-platform.md delete mode 100644 app/sdks/php/docs/examples/projects/update-project-o-auth.md delete mode 100644 app/sdks/php/docs/examples/projects/update-project.md delete mode 100644 app/sdks/php/docs/examples/projects/update-task.md delete mode 100644 app/sdks/php/docs/examples/projects/update-webhook.md delete mode 100644 app/sdks/php/docs/examples/teams/create-team-membership-resend.md delete mode 100644 app/sdks/php/docs/examples/teams/get-team-members.md delete mode 100644 app/sdks/php/docs/examples/teams/update-team-membership-status.md delete mode 100644 app/sdks/php/docs/examples/users/delete-users-session.md delete mode 100644 app/sdks/php/docs/projects.md delete mode 100644 app/sdks/php/src/Appwrite/Services/Account.php delete mode 100644 app/sdks/php/src/Appwrite/Services/Auth.php delete mode 100644 app/sdks/php/src/Appwrite/Services/Projects.php delete mode 100644 app/sdks/python/appwrite/services/account.py delete mode 100644 app/sdks/python/appwrite/services/auth.py delete mode 100644 app/sdks/python/appwrite/services/projects.py delete mode 100644 app/sdks/ruby/lib/appwrite/services/account.rb delete mode 100644 app/sdks/ruby/lib/appwrite/services/auth.rb delete mode 100644 app/sdks/ruby/lib/appwrite/services/projects.rb diff --git a/app/config/platforms.php b/app/config/platforms.php index 2eeabbcc73..a18fd1c7d7 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -15,6 +15,7 @@ $langDart = [ 'url' => 'https://github.com/appwrite/sdk-for-dart', 'enabled' => true, 'beta' => false, + 'family' => APP_PLATFORM_CLIENT, 'prism' => 'dart', 'source' => realpath(__DIR__ . '/../sdks/dart'), 'gitUrl' => 'git@github.com:appwrite/sdk-for-dart.git', @@ -35,6 +36,7 @@ return [ 'url' => 'https://github.com/appwrite/sdk-for-js', 'enabled' => true, 'beta' => false, + 'family' => APP_PLATFORM_CLIENT, 'prism' => 'javascript', 'source' => realpath(__DIR__ . '/../sdks/javascript'), 'gitUrl' => 'git@github.com:appwrite/sdk-for-js.git', @@ -47,6 +49,7 @@ return [ 'url' => '', 'enabled' => false, 'beta' => false, + 'family' => APP_PLATFORM_CLIENT, 'prism' => 'typescript', 'source' => false, 'gitUrl' => 'git@github.com:appwrite/sdk-for-typescript.git', @@ -67,6 +70,7 @@ return [ 'url' => '', 'enabled' => false, 'beta' => false, + 'family' => APP_PLATFORM_CLIENT, 'prism' => 'swift', 'source' => false, 'gitUrl' => 'git@github.com:appwrite/sdk-for-swift.git', @@ -79,6 +83,7 @@ return [ 'url' => '', 'enabled' => false, 'beta' => false, + 'family' => APP_PLATFORM_CLIENT, 'prism' => '', 'source' => false, 'gitUrl' => 'git@github.com:appwrite/sdk-for-objective-c.git', @@ -99,6 +104,7 @@ return [ 'url' => '', 'enabled' => false, 'beta' => false, + 'family' => APP_PLATFORM_CLIENT, 'prism' => 'kotlin', 'source' => false, 'gitUrl' => 'git@github.com:appwrite/sdk-for-kotlin.git', @@ -111,6 +117,7 @@ return [ 'url' => '', 'enabled' => false, 'beta' => false, + 'family' => APP_PLATFORM_CLIENT, 'prism' => 'java', 'source' => false, 'gitUrl' => 'git@github.com:appwrite/sdk-for-java.git', @@ -132,6 +139,7 @@ return [ 'url' => 'https://github.com/appwrite/sdk-for-node', 'enabled' => true, 'beta' => false, + 'family' => APP_PLATFORM_SERVER, 'prism' => 'javascript', 'source' => realpath(__DIR__ . '/../sdks/node'), 'gitUrl' => 'git@github.com:appwrite/sdk-for-node.git', @@ -144,6 +152,8 @@ return [ 'version' => '1.0.16', 'url' => 'https://github.com/appwrite/sdk-for-php', 'enabled' => true, + 'beta' => false, + 'family' => APP_PLATFORM_SERVER, 'prism' => 'php', 'source' => realpath(__DIR__ . '/../sdks/php'), 'gitUrl' => 'git@github.com:appwrite/sdk-for-php.git', @@ -157,6 +167,7 @@ return [ 'url' => 'https://github.com/appwrite/sdk-for-python', 'enabled' => true, 'beta' => true, + 'family' => APP_PLATFORM_SERVER, 'prism' => 'python', 'source' => realpath(__DIR__ . '/../sdks/python'), 'gitUrl' => 'git@github.com:appwrite/sdk-for-python.git', @@ -170,6 +181,7 @@ return [ 'url' => 'https://github.com/appwrite/sdk-for-go', 'enabled' => true, 'beta' => true, + 'family' => APP_PLATFORM_SERVER, 'prism' => 'go', 'source' => realpath(__DIR__ . '/../sdks/go'), 'gitUrl' => 'git@github.com:appwrite/sdk-for-go.git', @@ -183,6 +195,7 @@ return [ 'url' => 'https://github.com/appwrite/sdk-for-ruby', 'enabled' => true, 'beta' => true, + 'family' => APP_PLATFORM_SERVER, 'prism' => 'ruby', 'source' => realpath(__DIR__ . '/../sdks/ruby'), 'gitUrl' => 'git@github.com:appwrite/sdk-for-ruby.git', diff --git a/app/sdks/dart/.packages b/app/sdks/dart/.packages deleted file mode 100644 index 8b327e4ec1..0000000000 --- a/app/sdks/dart/.packages +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by pub on 2019-12-05 18:55:11.878585. -charcode:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/charcode-1.1.2/lib/ -collection:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/collection-1.14.12/lib/ -cookie_jar:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/cookie_jar-1.0.1/lib/ -dio:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/dio-3.0.3/lib/ -dio_cookie_manager:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/dio_cookie_manager-1.0.0/lib/ -http_parser:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/http_parser-3.1.3/lib/ -meta:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/meta-1.1.7/lib/ -path:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/path-1.6.4/lib/ -source_span:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/source_span-1.5.5/lib/ -string_scanner:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.0.5/lib/ -term_glyph:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.1.0/lib/ -typed_data:file:///Users/eldadfux/.pub-cache/hosted/pub.dartlang.org/typed_data-1.1.6/lib/ -appwrite:lib/ diff --git a/app/sdks/dart/LICENSE b/app/sdks/dart/LICENSE deleted file mode 100644 index fc7c051a91..0000000000 --- a/app/sdks/dart/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/sdks/dart/README.md b/app/sdks/dart/README.md deleted file mode 100644 index db1082d9e7..0000000000 --- a/app/sdks/dart/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Appwrite SDK for Dart - -![License](https://img.shields.io/github/license/appwrite/sdk-for-dart.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) - -**WORK IN PROGRESS - NOT READY FOR USAGE - Want to help us improve this client SDK? Send a pull request to Appwrite [SDK generator repository](https://github.com/appwrite/sdk-generator).** - -Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) - - - -![Appwrite](https://appwrite.io/images/github.png) - -## Installation - -Add this to your package's pubspec.yaml file: - -```yml -dependencies: - appwrite: ^0.0.6 -``` - -You can install packages from the command line: - -```bash -pub get -``` - -## License - -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/dart/lib/appwrite.dart b/app/sdks/dart/lib/appwrite.dart deleted file mode 100644 index 01930e9b60..0000000000 --- a/app/sdks/dart/lib/appwrite.dart +++ /dev/null @@ -1,11 +0,0 @@ -export 'package:appwrite/services/account.dart'; -export 'package:appwrite/services/auth.dart'; -export 'package:appwrite/services/avatars.dart'; -export 'package:appwrite/services/database.dart'; -export 'package:appwrite/services/locale.dart'; -export 'package:appwrite/services/projects.dart'; -export 'package:appwrite/services/storage.dart'; -export 'package:appwrite/services/teams.dart'; -export 'package:appwrite/services/users.dart'; -export 'package:appwrite/client.dart'; -export 'package:dio/dio.dart' show Response; \ No newline at end of file diff --git a/app/sdks/dart/lib/client.dart b/app/sdks/dart/lib/client.dart deleted file mode 100644 index 05a5370651..0000000000 --- a/app/sdks/dart/lib/client.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'package:dio/dio.dart'; -import 'package:dio_cookie_manager/dio_cookie_manager.dart'; -import 'package:cookie_jar/cookie_jar.dart'; - -class Client { - String endPoint; - Map headers; - bool selfSigned; - Dio http; - - Client() { - this.endPoint = 'https://appwrite.io/v1'; - this.headers = { - 'content-type': 'application/json', - 'x-sdk-version': 'appwrite:dart:0.0.6', - }; - this.selfSigned = false; - - this.http = Dio(); - this.http.options.baseUrl = this.endPoint; - this.http.options.validateStatus = (status) => status != 404; - this.http.interceptors.add(CookieManager(CookieJar())); - } - - - /// Your Appwrite project ID - Client setProject(value) { - this.addHeader('X-Appwrite-Project', value); - - return this; - } - - - /// Your Appwrite project secret key - Client setKey(value) { - this.addHeader('X-Appwrite-Key', value); - - return this; - } - - - Client setLocale(value) { - this.addHeader('X-Appwrite-Locale', value); - - return this; - } - - - Client setMode(value) { - this.addHeader('X-Appwrite-Mode', value); - - return this; - } - - Client setSelfSigned({bool status = true}) { - this.selfSigned = status; - - return this; - } - - Client setEndpoint(String endPoint) - { - this.endPoint = endPoint; - this.http.options.baseUrl = this.endPoint; - return this; - } - - Client addHeader(String key, String value) { - this.headers[key.toLowerCase()] = value.toLowerCase(); - - return this; - } - - Future call(String method, {String path = '', Map headers = const {}, Map params = const {}}) { - if(this.selfSigned) { - // Allow self signed requests - } - - String reqPath = path; - bool isGet = method.toUpperCase() == "GET"; - - // Origin is hardcoded for testing - Options options = Options( - headers: {...this.headers, ...headers, "Origin": "http://localhost"}, - method: method.toUpperCase(), - ); - - if (isGet) { - path += "?"; - params.forEach((k, v) { - path += "${k}=${v}&"; - }); - } - - if (!isGet) - return http.request(reqPath, data: params, options: options); - else - return http.request(reqPath, options: options); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/service.dart b/app/sdks/dart/lib/service.dart deleted file mode 100644 index 81107c7803..0000000000 --- a/app/sdks/dart/lib/service.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:appwrite/client.dart'; - -class Service { - Client client; - - Service(Client client) { - this.client = client; - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/account.dart b/app/sdks/dart/lib/services/account.dart deleted file mode 100644 index 4d191232d2..0000000000 --- a/app/sdks/dart/lib/services/account.dart +++ /dev/null @@ -1,107 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Account extends Service { - - Account(Client client): super(client); - - /// Get currently logged in user data as JSON object. - Future get() async { - String path = '/account'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Delete a currently logged in user account. Behind the scene, the user - /// record is not deleted but permanently blocked from any access. This is done - /// to avoid deleted accounts being overtaken by new users with the same email - /// address. Any user-related resources like documents or storage files should - /// be deleted separately. - Future delete() async { - String path = '/account'; - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Update currently logged in user account email address. After changing user - /// address, user confirmation status is being reset and a new confirmation - /// mail is sent. For security measures, user password is required to complete - /// this request. - Future updateEmail({email, password}) async { - String path = '/account/email'; - - Map params = { - 'email': email, - 'password': password, - }; - - return await this.client.call('patch', path: path, params: params); - } - /// Update currently logged in user account name. - Future updateName({name}) async { - String path = '/account/name'; - - Map params = { - 'name': name, - }; - - return await this.client.call('patch', path: path, params: params); - } - /// Update currently logged in user password. For validation, user is required - /// to pass the password twice. - Future updatePassword({password, oldPassword}) async { - String path = '/account/password'; - - Map params = { - 'password': password, - 'old-password': oldPassword, - }; - - return await this.client.call('patch', path: path, params: params); - } - /// Get currently logged in user preferences key-value object. - Future getPrefs() async { - String path = '/account/prefs'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Update currently logged in user account preferences. You can pass only the - /// specific settings you wish to update. - Future updatePrefs({prefs}) async { - String path = '/account/prefs'; - - Map params = { - 'prefs': prefs, - }; - - return await this.client.call('patch', path: path, params: params); - } - /// Get currently logged in user list of latest security activity logs. Each - /// log returns user IP address, location and date and time of log. - Future getSecurity() async { - String path = '/account/security'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Get currently logged in user list of active sessions across different - /// devices. - Future getSessions() async { - String path = '/account/sessions'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/auth.dart b/app/sdks/dart/lib/services/auth.dart deleted file mode 100644 index 1fdb5aa134..0000000000 --- a/app/sdks/dart/lib/services/auth.dart +++ /dev/null @@ -1,173 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Auth extends Service { - - Auth(Client client): super(client); - - /// Allow the user to login into his account by providing a valid email and - /// password combination. Use the success and failure arguments to provide a - /// redirect URL\'s back to your app when login is completed. - /// - /// Please notice that in order to avoid a [Redirect - /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - /// the only valid redirect URLs are the ones from domains you have set when - /// adding your platforms in the console interface. - /// - /// When accessing this route using Javascript from the browser, success and - /// failure parameter URLs are required. Appwrite server will respond with a - /// 301 redirect status code and will set the user session cookie. This - /// behavior is enforced because modern browsers are limiting 3rd party cookies - /// in XHR of fetch requests to protect user privacy. - Future login({email, password, success = null, failure = null}) async { - String path = '/auth/login'; - - Map params = { - 'email': email, - 'password': password, - 'success': success, - 'failure': failure, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Allow the user to login to his account using the OAuth provider of his - /// choice. Each OAuth provider should be enabled from the Appwrite console - /// first. Use the success and failure arguments to provide a redirect URL's - /// back to your app when login is completed. - Future oauth({provider, success, failure}) async { - String path = '/auth/login/oauth/{provider}'.replaceAll(RegExp('{provider}'), provider); - - Map params = { - 'success': success, - 'failure': failure, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Use this endpoint to log out the currently logged in user from his account. - /// When successful this endpoint will delete the user session and remove the - /// session secret cookie from the user client. - Future logout() async { - String path = '/auth/logout'; - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Use this endpoint to log out the currently logged in user from all his - /// account sessions across all his different devices. When using the option id - /// argument, only the session unique ID provider will be deleted. - Future logoutBySession({id}) async { - String path = '/auth/logout/{id}'.replaceAll(RegExp('{id}'), id); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Sends the user an email with a temporary secret token for password reset. - /// When the user clicks the confirmation link he is redirected back to your - /// app password reset redirect URL with a secret token and email address - /// values attached to the URL query string. Use the query string params to - /// submit a request to the /auth/password/reset endpoint to complete the - /// process. - Future recovery({email, reset}) async { - String path = '/auth/recovery'; - - Map params = { - 'email': email, - 'reset': reset, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Use this endpoint to complete the user account password reset. Both the - /// **userId** and **token** arguments will be passed as query parameters to - /// the redirect URL you have provided when sending your request to the - /// /auth/recovery endpoint. - /// - /// Please notice that in order to avoid a [Redirect - /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - /// the only valid redirect URLs are the ones from domains you have set when - /// adding your platforms in the console interface. - Future recoveryReset({userId, token, passwordA, passwordB}) async { - String path = '/auth/recovery/reset'; - - Map params = { - 'userId': userId, - 'token': token, - 'password-a': passwordA, - 'password-b': passwordB, - }; - - return await this.client.call('put', path: path, params: params); - } - /// Use this endpoint to allow a new user to register an account in your - /// project. Use the success and failure URLs to redirect users back to your - /// application after signup completes. - /// - /// If registration completes successfully user will be sent with a - /// confirmation email in order to confirm he is the owner of the account email - /// address. Use the confirmation parameter to redirect the user from the - /// confirmation email back to your app. When the user is redirected, use the - /// /auth/confirm endpoint to complete the account confirmation. - /// - /// Please notice that in order to avoid a [Redirect - /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - /// the only valid redirect URLs are the ones from domains you have set when - /// adding your platforms in the console interface. - /// - /// When accessing this route using Javascript from the browser, success and - /// failure parameter URLs are required. Appwrite server will respond with a - /// 301 redirect status code and will set the user session cookie. This - /// behavior is enforced because modern browsers are limiting 3rd party cookies - /// in XHR of fetch requests to protect user privacy. - Future register({email, password, confirm, success = null, failure = null, name = null}) async { - String path = '/auth/register'; - - Map params = { - 'email': email, - 'password': password, - 'confirm': confirm, - 'success': success, - 'failure': failure, - 'name': name, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Use this endpoint to complete the confirmation of the user account email - /// address. Both the **userId** and **token** arguments will be passed as - /// query parameters to the redirect URL you have provided when sending your - /// request to the /auth/register endpoint. - Future confirm({userId, token}) async { - String path = '/auth/register/confirm'; - - Map params = { - 'userId': userId, - 'token': token, - }; - - return await this.client.call('post', path: path, params: params); - } - /// This endpoint allows the user to request your app to resend him his email - /// confirmation message. The redirect arguments act the same way as in - /// /auth/register endpoint. - /// - /// Please notice that in order to avoid a [Redirect - /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - /// the only valid redirect URLs are the ones from domains you have set when - /// adding your platforms in the console interface. - Future confirmResend({confirm}) async { - String path = '/auth/register/confirm/resend'; - - Map params = { - 'confirm': confirm, - }; - - return await this.client.call('post', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/avatars.dart b/app/sdks/dart/lib/services/avatars.dart deleted file mode 100644 index 4ffcc6aa15..0000000000 --- a/app/sdks/dart/lib/services/avatars.dart +++ /dev/null @@ -1,93 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Avatars extends Service { - - Avatars(Client client): super(client); - - /// You can use this endpoint to show different browser icons to your users. - /// The code argument receives the browser code as it appears in your user - /// /account/sessions endpoint. Use width, height and quality arguments to - /// change the output settings. - Future getBrowser({code, width = 100, height = 100, quality = 100}) async { - String path = '/avatars/browsers/{code}'.replaceAll(RegExp('{code}'), code); - - Map params = { - 'width': width, - 'height': height, - 'quality': quality, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Need to display your users with your billing method or their payment - /// methods? The credit card endpoint will return you the icon of the credit - /// card provider you need. Use width, height and quality arguments to change - /// the output settings. - Future getCreditCard({code, width = 100, height = 100, quality = 100}) async { - String path = '/avatars/credit-cards/{code}'.replaceAll(RegExp('{code}'), code); - - Map params = { - 'width': width, - 'height': height, - 'quality': quality, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote - /// website URL. - Future getFavicon({url}) async { - String path = '/avatars/favicon'; - - Map params = { - 'url': url, - }; - - return await this.client.call('get', path: path, params: params); - } - /// You can use this endpoint to show different country flags icons to your - /// users. The code argument receives the 2 letter country code. Use width, - /// height and quality arguments to change the output settings. - Future getFlag({code, width = 100, height = 100, quality = 100}) async { - String path = '/avatars/flags/{code}'.replaceAll(RegExp('{code}'), code); - - Map params = { - 'width': width, - 'height': height, - 'quality': quality, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Use this endpoint to fetch a remote image URL and crop it to any image size - /// you want. This endpoint is very useful if you need to crop and display - /// remote images in your app or in case you want to make sure a 3rd party - /// image is properly served using a TLS protocol. - Future getImage({url, width = 400, height = 400}) async { - String path = '/avatars/image'; - - Map params = { - 'url': url, - 'width': width, - 'height': height, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Converts a given plain text to a QR code image. You can use the query - /// parameters to change the size and style of the resulting image. - Future getQR({text, size = 400, margin = 1, download = null}) async { - String path = '/avatars/qr'; - - Map params = { - 'text': text, - 'size': size, - 'margin': margin, - 'download': download, - }; - - return await this.client.call('get', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/database.dart b/app/sdks/dart/lib/services/database.dart deleted file mode 100644 index 1c9a2a743a..0000000000 --- a/app/sdks/dart/lib/services/database.dart +++ /dev/null @@ -1,139 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Database extends Service { - - Database(Client client): super(client); - - /// Get a list of all the user collections. You can use the query params to - /// filter your results. On admin mode, this endpoint will return a list of all - /// of the project collections. [Learn more about different API - /// modes](/docs/admin). - Future listCollections({search = null, limit = 25, offset = null, orderType = 'ASC'}) async { - String path = '/database'; - - Map params = { - 'search': search, - 'limit': limit, - 'offset': offset, - 'orderType': orderType, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Create a new Collection. - Future createCollection({name, read, write, rules}) async { - String path = '/database'; - - Map params = { - 'name': name, - 'read': read, - 'write': write, - 'rules': rules, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Get collection by its unique ID. This endpoint response returns a JSON - /// object with the collection metadata. - Future getCollection({collectionId}) async { - String path = '/database/{collectionId}'.replaceAll(RegExp('{collectionId}'), collectionId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Update collection by its unique ID. - Future updateCollection({collectionId, name, read, write, rules = const []}) async { - String path = '/database/{collectionId}'.replaceAll(RegExp('{collectionId}'), collectionId); - - Map params = { - 'name': name, - 'read': read, - 'write': write, - 'rules': rules, - }; - - return await this.client.call('put', path: path, params: params); - } - /// Delete a collection by its unique ID. Only users with write permissions - /// have access to delete this resource. - Future deleteCollection({collectionId}) async { - String path = '/database/{collectionId}'.replaceAll(RegExp('{collectionId}'), collectionId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Get a list of all the user documents. You can use the query params to - /// filter your results. On admin mode, this endpoint will return a list of all - /// of the project documents. [Learn more about different API - /// modes](/docs/admin). - Future listDocuments({collectionId, filters = const [], offset = null, limit = 50, orderField = '\$uid', orderType = 'ASC', orderCast = 'string', search = null, first = null, last = null}) async { - String path = '/database/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId); - - Map params = { - 'filters': filters, - 'offset': offset, - 'limit': limit, - 'order-field': orderField, - 'order-type': orderType, - 'order-cast': orderCast, - 'search': search, - 'first': first, - 'last': last, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Create a new Document. - Future createDocument({collectionId, data, read, write, parentDocument = null, parentProperty = null, parentPropertyType = 'assign'}) async { - String path = '/database/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId); - - Map params = { - 'data': data, - 'read': read, - 'write': write, - 'parentDocument': parentDocument, - 'parentProperty': parentProperty, - 'parentPropertyType': parentPropertyType, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Get document by its unique ID. This endpoint response returns a JSON object - /// with the document data. - Future getDocument({collectionId, documentId}) async { - String path = '/database/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future updateDocument({collectionId, documentId, data, read, write}) async { - String path = '/database/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); - - Map params = { - 'data': data, - 'read': read, - 'write': write, - }; - - return await this.client.call('patch', path: path, params: params); - } - /// Delete document by its unique ID. This endpoint deletes only the parent - /// documents, his attributes and relations to other documents. Child documents - /// **will not** be deleted. - Future deleteDocument({collectionId, documentId}) async { - String path = '/database/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/locale.dart b/app/sdks/dart/lib/services/locale.dart deleted file mode 100644 index 6112ada3e3..0000000000 --- a/app/sdks/dart/lib/services/locale.dart +++ /dev/null @@ -1,73 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Locale extends Service { - - Locale(Client client): super(client); - - /// Get the current user location based on IP. Returns an object with user - /// country code, country name, continent name, continent code, ip address and - /// suggested currency. You can use the locale header to get the data in a - /// supported language. - Future getLocale() async { - String path = '/locale'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// List of all continents. You can use the locale header to get the data in a - /// supported language. - Future getContinents() async { - String path = '/locale/continents'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// List of all countries. You can use the locale header to get the data in a - /// supported language. - Future getCountries() async { - String path = '/locale/countries'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// List of all countries that are currently members of the EU. You can use the - /// locale header to get the data in a supported language. UK brexit date is - /// currently set to 2019-10-31 and will be updated if and when needed. - Future getCountriesEU() async { - String path = '/locale/countries/eu'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// List of all countries phone codes. You can use the locale header to get the - /// data in a supported language. - Future getCountriesPhones() async { - String path = '/locale/countries/phones'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// List of all currencies, including currency symol, name, plural, and decimal - /// digits for all major and minor currencies. You can use the locale header to - /// get the data in a supported language. - Future getCurrencies() async { - String path = '/locale/currencies'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/projects.dart b/app/sdks/dart/lib/services/projects.dart deleted file mode 100644 index d4f9df3639..0000000000 --- a/app/sdks/dart/lib/services/projects.dart +++ /dev/null @@ -1,292 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Projects extends Service { - - Projects(Client client): super(client); - - Future listProjects() async { - String path = '/projects'; - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future createProject({name, teamId, description = null, logo = null, url = null, legalName = null, legalCountry = null, legalState = null, legalCity = null, legalAddress = null, legalTaxId = null}) async { - String path = '/projects'; - - Map params = { - 'name': name, - 'teamId': teamId, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legalName, - 'legalCountry': legalCountry, - 'legalState': legalState, - 'legalCity': legalCity, - 'legalAddress': legalAddress, - 'legalTaxId': legalTaxId, - }; - - return await this.client.call('post', path: path, params: params); - } - Future getProject({projectId}) async { - String path = '/projects/{projectId}'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future updateProject({projectId, name, description = null, logo = null, url = null, legalName = null, legalCountry = null, legalState = null, legalCity = null, legalAddress = null, legalTaxId = null}) async { - String path = '/projects/{projectId}'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - 'name': name, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legalName, - 'legalCountry': legalCountry, - 'legalState': legalState, - 'legalCity': legalCity, - 'legalAddress': legalAddress, - 'legalTaxId': legalTaxId, - }; - - return await this.client.call('patch', path: path, params: params); - } - Future deleteProject({projectId}) async { - String path = '/projects/{projectId}'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - Future listKeys({projectId}) async { - String path = '/projects/{projectId}/keys'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future createKey({projectId, name, scopes}) async { - String path = '/projects/{projectId}/keys'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - 'name': name, - 'scopes': scopes, - }; - - return await this.client.call('post', path: path, params: params); - } - Future getKey({projectId, keyId}) async { - String path = '/projects/{projectId}/keys/{keyId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{keyId}'), keyId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future updateKey({projectId, keyId, name, scopes}) async { - String path = '/projects/{projectId}/keys/{keyId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{keyId}'), keyId); - - Map params = { - 'name': name, - 'scopes': scopes, - }; - - return await this.client.call('put', path: path, params: params); - } - Future deleteKey({projectId, keyId}) async { - String path = '/projects/{projectId}/keys/{keyId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{keyId}'), keyId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - Future updateProjectOAuth({projectId, provider, appId = null, secret = null}) async { - String path = '/projects/{projectId}/oauth'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - 'provider': provider, - 'appId': appId, - 'secret': secret, - }; - - return await this.client.call('patch', path: path, params: params); - } - Future listPlatforms({projectId}) async { - String path = '/projects/{projectId}/platforms'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future createPlatform({projectId, type, name, key = null, store = null, url = null}) async { - String path = '/projects/{projectId}/platforms'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - 'type': type, - 'name': name, - 'key': key, - 'store': store, - 'url': url, - }; - - return await this.client.call('post', path: path, params: params); - } - Future getPlatform({projectId, platformId}) async { - String path = '/projects/{projectId}/platforms/{platformId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{platformId}'), platformId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future updatePlatform({projectId, platformId, name, key = null, store = null, url = null}) async { - String path = '/projects/{projectId}/platforms/{platformId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{platformId}'), platformId); - - Map params = { - 'name': name, - 'key': key, - 'store': store, - 'url': url, - }; - - return await this.client.call('put', path: path, params: params); - } - Future deletePlatform({projectId, platformId}) async { - String path = '/projects/{projectId}/platforms/{platformId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{platformId}'), platformId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - Future listTasks({projectId}) async { - String path = '/projects/{projectId}/tasks'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future createTask({projectId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = null, httpUser = null, httpPass = null}) async { - String path = '/projects/{projectId}/tasks'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': httpMethod, - 'httpUrl': httpUrl, - 'httpHeaders': httpHeaders, - 'httpUser': httpUser, - 'httpPass': httpPass, - }; - - return await this.client.call('post', path: path, params: params); - } - Future getTask({projectId, taskId}) async { - String path = '/projects/{projectId}/tasks/{taskId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{taskId}'), taskId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future updateTask({projectId, taskId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = null, httpUser = null, httpPass = null}) async { - String path = '/projects/{projectId}/tasks/{taskId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{taskId}'), taskId); - - Map params = { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': httpMethod, - 'httpUrl': httpUrl, - 'httpHeaders': httpHeaders, - 'httpUser': httpUser, - 'httpPass': httpPass, - }; - - return await this.client.call('put', path: path, params: params); - } - Future deleteTask({projectId, taskId}) async { - String path = '/projects/{projectId}/tasks/{taskId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{taskId}'), taskId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - Future getProjectUsage({projectId}) async { - String path = '/projects/{projectId}/usage'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future listWebhooks({projectId}) async { - String path = '/projects/{projectId}/webhooks'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future createWebhook({projectId, name, events, url, security, httpUser = null, httpPass = null}) async { - String path = '/projects/{projectId}/webhooks'.replaceAll(RegExp('{projectId}'), projectId); - - Map params = { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': httpUser, - 'httpPass': httpPass, - }; - - return await this.client.call('post', path: path, params: params); - } - Future getWebhook({projectId, webhookId}) async { - String path = '/projects/{projectId}/webhooks/{webhookId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{webhookId}'), webhookId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - Future updateWebhook({projectId, webhookId, name, events, url, security, httpUser = null, httpPass = null}) async { - String path = '/projects/{projectId}/webhooks/{webhookId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{webhookId}'), webhookId); - - Map params = { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': httpUser, - 'httpPass': httpPass, - }; - - return await this.client.call('put', path: path, params: params); - } - Future deleteWebhook({projectId, webhookId}) async { - String path = '/projects/{projectId}/webhooks/{webhookId}'.replaceAll(RegExp('{projectId}'), projectId).replaceAll(RegExp('{webhookId}'), webhookId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/storage.dart b/app/sdks/dart/lib/services/storage.dart deleted file mode 100644 index c46dba5af6..0000000000 --- a/app/sdks/dart/lib/services/storage.dart +++ /dev/null @@ -1,109 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Storage extends Service { - - Storage(Client client): super(client); - - /// Get a list of all the user files. You can use the query params to filter - /// your results. On admin mode, this endpoint will return a list of all of the - /// project files. [Learn more about different API modes](/docs/admin). - Future listFiles({search = null, limit = 25, offset = null, orderType = 'ASC'}) async { - String path = '/storage/files'; - - Map params = { - 'search': search, - 'limit': limit, - 'offset': offset, - 'orderType': orderType, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Create a new file. The user who creates the file will automatically be - /// assigned to read and write access unless he has passed custom values for - /// read and write arguments. - Future createFile({files, read, write}) async { - String path = '/storage/files'; - - Map params = { - 'files': files, - 'read': read, - 'write': write, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Get file by its unique ID. This endpoint response returns a JSON object - /// with the file metadata. - Future getFile({fileId}) async { - String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Update file by its unique ID. Only users with write permissions have access - /// to update this resource. - Future updateFile({fileId, read, write}) async { - String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); - - Map params = { - 'read': read, - 'write': write, - }; - - return await this.client.call('put', path: path, params: params); - } - /// Delete a file by its unique ID. Only users with write permissions have - /// access to delete this resource. - Future deleteFile({fileId}) async { - String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Get file content by its unique ID. The endpoint response return with a - /// 'Content-Disposition: attachment' header that tells the browser to start - /// downloading the file to user downloads directory. - Future getFileDownload({fileId}) async { - String path = '/storage/files/{fileId}/download'.replaceAll(RegExp('{fileId}'), fileId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Get file preview image. Currently, this method supports preview for image - /// files (jpg, png, and gif), other supported formats, like pdf, docs, slides, - /// and spreadsheets will return file icon image. You can also pass query - /// string arguments for cutting and resizing your preview image. - Future getFilePreview({fileId, width = null, height = null, quality = 100, background = null, output = null}) async { - String path = '/storage/files/{fileId}/preview'.replaceAll(RegExp('{fileId}'), fileId); - - Map params = { - 'width': width, - 'height': height, - 'quality': quality, - 'background': background, - 'output': output, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Get file content by its unique ID. This endpoint is similar to the download - /// method but returns with no 'Content-Disposition: attachment' header. - Future getFileView({fileId, as = null}) async { - String path = '/storage/files/{fileId}/view'.replaceAll(RegExp('{fileId}'), fileId); - - Map params = { - 'as': as, - }; - - return await this.client.call('get', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/teams.dart b/app/sdks/dart/lib/services/teams.dart deleted file mode 100644 index ab91cc70d2..0000000000 --- a/app/sdks/dart/lib/services/teams.dart +++ /dev/null @@ -1,152 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Teams extends Service { - - Teams(Client client): super(client); - - /// Get a list of all the current user teams. You can use the query params to - /// filter your results. On admin mode, this endpoint will return a list of all - /// of the project teams. [Learn more about different API modes](/docs/admin). - Future listTeams({search = null, limit = 25, offset = null, orderType = 'ASC'}) async { - String path = '/teams'; - - Map params = { - 'search': search, - 'limit': limit, - 'offset': offset, - 'orderType': orderType, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Create a new team. The user who creates the team will automatically be - /// assigned as the owner of the team. The team owner can invite new members, - /// who will be able add new owners and update or delete the team from your - /// project. - Future createTeam({name, roles = const ["owner"]}) async { - String path = '/teams'; - - Map params = { - 'name': name, - 'roles': roles, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Get team by its unique ID. All team members have read access for this - /// resource. - Future getTeam({teamId}) async { - String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Update team by its unique ID. Only team owners have write access for this - /// resource. - Future updateTeam({teamId, name}) async { - String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); - - Map params = { - 'name': name, - }; - - return await this.client.call('put', path: path, params: params); - } - /// Delete team by its unique ID. Only team owners have write access for this - /// resource. - Future deleteTeam({teamId}) async { - String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Get team members by the team unique ID. All team members have read access - /// for this list of resources. - Future getTeamMembers({teamId}) async { - String path = '/teams/{teamId}/members'.replaceAll(RegExp('{teamId}'), teamId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Use this endpoint to invite a new member to your team. An email with a link - /// to join the team will be sent to the new member email address. If member - /// doesn't exists in the project it will be automatically created. - /// - /// Use the redirect parameter to redirect the user from the invitation email - /// back to your app. When the user is redirected, use the - /// /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the - /// user to the team. - /// - /// Please notice that in order to avoid a [Redirect - /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - /// the only valid redirect URL's are the once from domains you have set when - /// added your platforms in the console interface. - Future createTeamMembership({teamId, email, roles, redirect, name = null}) async { - String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId); - - Map params = { - 'email': email, - 'name': name, - 'roles': roles, - 'redirect': redirect, - }; - - return await this.client.call('post', path: path, params: params); - } - /// This endpoint allows a user to leave a team or for a team owner to delete - /// the membership of any other team member. - Future deleteTeamMembership({teamId, inviteId}) async { - String path = '/teams/{teamId}/memberships/{inviteId}'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Use this endpoint to resend your invitation email for a user to join a - /// team. - Future createTeamMembershipResend({teamId, inviteId, redirect}) async { - String path = '/teams/{teamId}/memberships/{inviteId}/resend'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId); - - Map params = { - 'redirect': redirect, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Use this endpoint to let user accept an invitation to join a team after he - /// is being redirect back to your app from the invitation email. Use the - /// success and failure URL's to redirect users back to your application after - /// the request completes. - /// - /// Please notice that in order to avoid a [Redirect - /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - /// the only valid redirect URL's are the once from domains you have set when - /// added your platforms in the console interface. - /// - /// When not using the success or failure redirect arguments this endpoint will - /// result with a 200 status code on success and with 401 status error on - /// failure. This behavior was applied to help the web clients deal with - /// browsers who don't allow to set 3rd party HTTP cookies needed for saving - /// the account session token. - Future updateTeamMembershipStatus({teamId, inviteId, userId, secret, success = null, failure = null}) async { - String path = '/teams/{teamId}/memberships/{inviteId}/status'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId); - - Map params = { - 'userId': userId, - 'secret': secret, - 'success': success, - 'failure': failure, - }; - - return await this.client.call('patch', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/users.dart b/app/sdks/dart/lib/services/users.dart deleted file mode 100644 index 3e84ddd287..0000000000 --- a/app/sdks/dart/lib/services/users.dart +++ /dev/null @@ -1,111 +0,0 @@ -import "package:appwrite/service.dart"; -import "package:appwrite/client.dart"; -import 'package:dio/dio.dart'; - -class Users extends Service { - - Users(Client client): super(client); - - /// Get a list of all the project users. You can use the query params to filter - /// your results. - Future listUsers({search = null, limit = 25, offset = null, orderType = 'ASC'}) async { - String path = '/users'; - - Map params = { - 'search': search, - 'limit': limit, - 'offset': offset, - 'orderType': orderType, - }; - - return await this.client.call('get', path: path, params: params); - } - /// Create a new user. - Future createUser({email, password, name = null}) async { - String path = '/users'; - - Map params = { - 'email': email, - 'password': password, - 'name': name, - }; - - return await this.client.call('post', path: path, params: params); - } - /// Get user by its unique ID. - Future getUser({userId}) async { - String path = '/users/{userId}'.replaceAll(RegExp('{userId}'), userId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Get user activity logs list by its unique ID. - Future getUserLogs({userId}) async { - String path = '/users/{userId}/logs'.replaceAll(RegExp('{userId}'), userId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Get user preferences by its unique ID. - Future getUserPrefs({userId}) async { - String path = '/users/{userId}/prefs'.replaceAll(RegExp('{userId}'), userId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Update user preferences by its unique ID. You can pass only the specific - /// settings you wish to update. - Future updateUserPrefs({userId, prefs}) async { - String path = '/users/{userId}/prefs'.replaceAll(RegExp('{userId}'), userId); - - Map params = { - 'prefs': prefs, - }; - - return await this.client.call('patch', path: path, params: params); - } - /// Get user sessions list by its unique ID. - Future getUserSessions({userId}) async { - String path = '/users/{userId}/sessions'.replaceAll(RegExp('{userId}'), userId); - - Map params = { - }; - - return await this.client.call('get', path: path, params: params); - } - /// Delete all user sessions by its unique ID. - Future deleteUserSessions({userId}) async { - String path = '/users/{userId}/sessions'.replaceAll(RegExp('{userId}'), userId); - - Map params = { - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Delete user sessions by its unique ID. - Future deleteUserSession({userId, sessionId}) async { - String path = '/users/{userId}/sessions/:session'.replaceAll(RegExp('{userId}'), userId); - - Map params = { - 'sessionId': sessionId, - }; - - return await this.client.call('delete', path: path, params: params); - } - /// Update user status by its unique ID. - Future updateUserStatus({userId, status}) async { - String path = '/users/{userId}/status'.replaceAll(RegExp('{userId}'), userId); - - Map params = { - 'status': status, - }; - - return await this.client.call('patch', path: path, params: params); - } -} \ No newline at end of file diff --git a/app/sdks/dart/pubspec.lock b/app/sdks/dart/pubspec.lock deleted file mode 100644 index 98d3035608..0000000000 --- a/app/sdks/dart/pubspec.lock +++ /dev/null @@ -1,89 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.14.12" - cookie_jar: - dependency: "direct main" - description: - name: cookie_jar - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" - dio: - dependency: "direct main" - description: - name: dio - url: "https://pub.dartlang.org" - source: hosted - version: "3.0.3" - dio_cookie_manager: - dependency: "direct main" - description: - name: dio_cookie_manager - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.0" - http_parser: - dependency: transitive - description: - name: http_parser - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.3" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.7" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.4" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.5" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.5" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.6" -sdks: - dart: ">2.4.0 <3.0.0" diff --git a/app/sdks/dart/pubspec.yaml b/app/sdks/dart/pubspec.yaml deleted file mode 100644 index 95225dfda5..0000000000 --- a/app/sdks/dart/pubspec.yaml +++ /dev/null @@ -1,11 +0,0 @@ -name: appwrite -version: 0.0.6 -description: Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) -author: Appwrite Team -homepage: https://github.com/appwrite/sdk-for-dart -environment: - sdk: '>=2.2.2 <3.0.0' -dependencies: - dio: ^3.0.0 - cookie_jar: ^1.0.0 - dio_cookie_manager: ^1.0.0 \ No newline at end of file diff --git a/app/sdks/go/account.go b/app/sdks/go/account.go deleted file mode 100644 index 90582ae0d8..0000000000 --- a/app/sdks/go/account.go +++ /dev/null @@ -1,307 +0,0 @@ -package appwrite - -import ( - "strings" -) - -// Account service -type Account struct { - client *Client -} - -// GetAccount get currently logged in user data as JSON object. -func (srv *Account) GetAccount() (map[string]interface{}, error) { - path := "/account" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateAccount use this endpoint to allow a new user to register an account -// in your project. Use the success and failure URLs to redirect users back to -// your application after signup completes. -// -// If registration completes successfully user will be sent with a -// confirmation email in order to confirm he is the owner of the account email -// address. Use the confirmation parameter to redirect the user from the -// confirmation email back to your app. When the user is redirected, use the -// /auth/confirm endpoint to complete the account confirmation. -// -// Please note that in order to avoid a [Redirect -// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URLs are the ones from domains you have set when -// adding your platforms in the console interface. -// -// When accessing this route using Javascript from the browser, success and -// failure parameter URLs are required. Appwrite server will respond with a -// 301 redirect status code and will set the user session cookie. This -// behavior is enforced because modern browsers are limiting 3rd party cookies -// in XHR of fetch requests to protect user privacy. -func (srv *Account) CreateAccount(Email string, Password string, Name string) (map[string]interface{}, error) { - path := "/account" - - params := map[string]interface{}{ - "email": Email, - "password": Password, - "name": Name, - } - - return srv.client.Call("POST", path, nil, params) -} - -// Delete delete a currently logged in user account. Behind the scene, the -// user record is not deleted but permanently blocked from any access. This is -// done to avoid deleted accounts being overtaken by new users with the same -// email address. Any user-related resources like documents or storage files -// should be deleted separately. -func (srv *Account) Delete() (map[string]interface{}, error) { - path := "/account" - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// UpdateEmail update currently logged in user account email address. After -// changing user address, user confirmation status is being reset and a new -// confirmation mail is sent. For security measures, user password is required -// to complete this request. -func (srv *Account) UpdateEmail(Email string, Password string) (map[string]interface{}, error) { - path := "/account/email" - - params := map[string]interface{}{ - "email": Email, - "password": Password, - } - - return srv.client.Call("PATCH", path, nil, params) -} - -// GetAccountLogs get currently logged in user list of latest security -// activity logs. Each log returns user IP address, location and date and time -// of log. -func (srv *Account) GetAccountLogs() (map[string]interface{}, error) { - path := "/account/logs" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateAccountName update currently logged in user account name. -func (srv *Account) UpdateAccountName(Name string) (map[string]interface{}, error) { - path := "/account/name" - - params := map[string]interface{}{ - "name": Name, - } - - return srv.client.Call("PATCH", path, nil, params) -} - -// UpdateAccountPassword update currently logged in user password. For -// validation, user is required to pass the password twice. -func (srv *Account) UpdateAccountPassword(Password string, OldPassword string) (map[string]interface{}, error) { - path := "/account/password" - - params := map[string]interface{}{ - "password": Password, - "old-password": OldPassword, - } - - return srv.client.Call("PATCH", path, nil, params) -} - -// GetAccountPrefs get currently logged in user preferences key-value object. -func (srv *Account) GetAccountPrefs() (map[string]interface{}, error) { - path := "/account/prefs" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdatePrefs update currently logged in user account preferences. You can -// pass only the specific settings you wish to update. -func (srv *Account) UpdatePrefs(Prefs string) (map[string]interface{}, error) { - path := "/account/prefs" - - params := map[string]interface{}{ - "prefs": Prefs, - } - - return srv.client.Call("PATCH", path, nil, params) -} - -// CreateAccountRecovery sends the user an email with a temporary secret key -// for password reset. When the user clicks the confirmation link he is -// redirected back to your app password reset URL with the secret key and -// email address values attached to the URL query string. Use the query string -// params to submit a request to the /auth/password/reset endpoint to complete -// the process. -func (srv *Account) CreateAccountRecovery(Email string, Url string) (map[string]interface{}, error) { - path := "/account/recovery" - - params := map[string]interface{}{ - "email": Email, - "url": Url, - } - - return srv.client.Call("POST", path, nil, params) -} - -// UpdateAccountRecovery use this endpoint to complete the user account -// password reset. Both the **userId** and **secret** arguments will be passed -// as query parameters to the redirect URL you have provided when sending your -// request to the /auth/recovery endpoint. -// -// Please note that in order to avoid a [Redirect -// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URLs are the ones from domains you have set when -// adding your platforms in the console interface. -func (srv *Account) UpdateAccountRecovery(UserId string, Secret string, PasswordA string, PasswordB string) (map[string]interface{}, error) { - path := "/account/recovery" - - params := map[string]interface{}{ - "userId": UserId, - "secret": Secret, - "password-a": PasswordA, - "password-b": PasswordB, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// GetAccountSessions get currently logged in user list of active sessions -// across different devices. -func (srv *Account) GetAccountSessions() (map[string]interface{}, error) { - path := "/account/sessions" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateAccountSession allow the user to login into his account by providing -// a valid email and password combination. Use the success and failure -// arguments to provide a redirect URL's back to your app when login is -// completed. -// -// Please note that in order to avoid a [Redirect -// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URLs are the ones from domains you have set when -// adding your platforms in the console interface. -// -// When accessing this route using Javascript from the browser, success and -// failure parameter URLs are required. Appwrite server will respond with a -// 301 redirect status code and will set the user session cookie. This -// behavior is enforced because modern browsers are limiting 3rd party cookies -// in XHR of fetch requests to protect user privacy. -func (srv *Account) CreateAccountSession(Email string, Password string) (map[string]interface{}, error) { - path := "/account/sessions" - - params := map[string]interface{}{ - "email": Email, - "password": Password, - } - - return srv.client.Call("POST", path, nil, params) -} - -// DeleteAccountSessions delete all sessions from the user account and remove -// any sessions cookies from the end client. -func (srv *Account) DeleteAccountSessions() (map[string]interface{}, error) { - path := "/account/sessions" - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// DeleteAccountCurrentSession use this endpoint to log out the currently -// logged in user from his account. When successful this endpoint will delete -// the user session and remove the session secret cookie from the user client. -func (srv *Account) DeleteAccountCurrentSession() (map[string]interface{}, error) { - path := "/account/sessions/current" - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// CreateAccountSessionOAuth allow the user to login to his account using the -// OAuth provider of his choice. Each OAuth provider should be enabled from -// the Appwrite console first. Use the success and failure arguments to -// provide a redirect URL's back to your app when login is completed. -func (srv *Account) CreateAccountSessionOAuth(Provider string, Success string, Failure string) (map[string]interface{}, error) { - r := strings.NewReplacer("{provider}", Provider) - path := r.Replace("/account/sessions/oauth/{provider}") - - params := map[string]interface{}{ - "success": Success, - "failure": Failure, - } - - return srv.client.Call("GET", path, nil, params) -} - -// DeleteAccountSession use this endpoint to log out the currently logged in -// user from all his account sessions across all his different devices. When -// using the option id argument, only the session unique ID provider will be -// deleted. -func (srv *Account) DeleteAccountSession(Id string) (map[string]interface{}, error) { - r := strings.NewReplacer("{id}", Id) - path := r.Replace("/account/sessions/{id}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// CreateAccountVerification use this endpoint to send a verification message -// to your user email address to confirm they are the valid owners of that -// address. Both the **userId** and **secret** arguments will be passed as -// query parameters to the URL you have provider to be attached to the -// verification email. The provided URL should redirect the user back for your -// app and allow you to complete the verification process by verifying both -// the **userId** and **secret** parameters. Learn more about how to [complete -// the verification process](/docs/account#updateAccountVerification). -// -// Please note that in order to avoid a [Redirect -// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URLs are the ones from domains you have set when -// adding your platforms in the console interface. -func (srv *Account) CreateAccountVerification(Url string) (map[string]interface{}, error) { - path := "/account/verification" - - params := map[string]interface{}{ - "url": Url, - } - - return srv.client.Call("POST", path, nil, params) -} - -// UpdateAccountVerification use this endpoint to complete the user email -// verification process. Use both the **userId** and **secret** parameters -// that were attached to your app URL to verify the user email ownership. If -// confirmed this route will return a 200 status code. -func (srv *Account) UpdateAccountVerification(UserId string, Secret string, PasswordB string) (map[string]interface{}, error) { - path := "/account/verification" - - params := map[string]interface{}{ - "userId": UserId, - "secret": Secret, - "password-b": PasswordB, - } - - return srv.client.Call("PUT", path, nil, params) -} diff --git a/app/sdks/go/auth.go b/app/sdks/go/auth.go deleted file mode 100644 index b869140bb8..0000000000 --- a/app/sdks/go/auth.go +++ /dev/null @@ -1,186 +0,0 @@ -package appwrite - -import ( - "strings" -) - -// Auth service -type Auth struct { - client *Client -} - -// Login allow the user to login into his account by providing a valid email -// and password combination. Use the success and failure arguments to provide -// a redirect URL\'s back to your app when login is completed. -// -// Please notice that in order to avoid a [Redirect -// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URLs are the ones from domains you have set when -// adding your platforms in the console interface. -// -// When accessing this route using Javascript from the browser, success and -// failure parameter URLs are required. Appwrite server will respond with a -// 301 redirect status code and will set the user session cookie. This -// behavior is enforced because modern browsers are limiting 3rd party cookies -// in XHR of fetch requests to protect user privacy. -func (srv *Auth) Login(Email string, Password string, Success string, Failure string) (map[string]interface{}, error) { - path := "/auth/login" - - params := map[string]interface{}{ - "email": Email, - "password": Password, - "success": Success, - "failure": Failure, - } - - return srv.client.Call("POST", path, nil, params) -} - -// Oauth allow the user to login to his account using the OAuth provider of -// his choice. Each OAuth provider should be enabled from the Appwrite console -// first. Use the success and failure arguments to provide a redirect URL's -// back to your app when login is completed. -func (srv *Auth) Oauth(Provider string, Success string, Failure string) (map[string]interface{}, error) { - r := strings.NewReplacer("{provider}", Provider) - path := r.Replace("/auth/login/oauth/{provider}") - - params := map[string]interface{}{ - "success": Success, - "failure": Failure, - } - - return srv.client.Call("GET", path, nil, params) -} - -// Logout use this endpoint to log out the currently logged in user from his -// account. When successful this endpoint will delete the user session and -// remove the session secret cookie from the user client. -func (srv *Auth) Logout() (map[string]interface{}, error) { - path := "/auth/logout" - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// LogoutBySession use this endpoint to log out the currently logged in user -// from all his account sessions across all his different devices. When using -// the option id argument, only the session unique ID provider will be -// deleted. -func (srv *Auth) LogoutBySession(Id string) (map[string]interface{}, error) { - r := strings.NewReplacer("{id}", Id) - path := r.Replace("/auth/logout/{id}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// Recovery sends the user an email with a temporary secret token for password -// reset. When the user clicks the confirmation link he is redirected back to -// your app password reset redirect URL with a secret token and email address -// values attached to the URL query string. Use the query string params to -// submit a request to the /auth/password/reset endpoint to complete the -// process. -func (srv *Auth) Recovery(Email string, Reset string) (map[string]interface{}, error) { - path := "/auth/recovery" - - params := map[string]interface{}{ - "email": Email, - "reset": Reset, - } - - return srv.client.Call("POST", path, nil, params) -} - -// RecoveryReset use this endpoint to complete the user account password -// reset. Both the **userId** and **token** arguments will be passed as query -// parameters to the redirect URL you have provided when sending your request -// to the /auth/recovery endpoint. -// -// Please notice that in order to avoid a [Redirect -// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URLs are the ones from domains you have set when -// adding your platforms in the console interface. -func (srv *Auth) RecoveryReset(UserId string, Token string, PasswordA string, PasswordB string) (map[string]interface{}, error) { - path := "/auth/recovery/reset" - - params := map[string]interface{}{ - "userId": UserId, - "token": Token, - "password-a": PasswordA, - "password-b": PasswordB, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// Register use this endpoint to allow a new user to register an account in -// your project. Use the success and failure URLs to redirect users back to -// your application after signup completes. -// -// If registration completes successfully user will be sent with a -// confirmation email in order to confirm he is the owner of the account email -// address. Use the confirmation parameter to redirect the user from the -// confirmation email back to your app. When the user is redirected, use the -// /auth/confirm endpoint to complete the account confirmation. -// -// Please notice that in order to avoid a [Redirect -// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URLs are the ones from domains you have set when -// adding your platforms in the console interface. -// -// When accessing this route using Javascript from the browser, success and -// failure parameter URLs are required. Appwrite server will respond with a -// 301 redirect status code and will set the user session cookie. This -// behavior is enforced because modern browsers are limiting 3rd party cookies -// in XHR of fetch requests to protect user privacy. -func (srv *Auth) Register(Email string, Password string, Confirm string, Success string, Failure string, Name string) (map[string]interface{}, error) { - path := "/auth/register" - - params := map[string]interface{}{ - "email": Email, - "password": Password, - "confirm": Confirm, - "success": Success, - "failure": Failure, - "name": Name, - } - - return srv.client.Call("POST", path, nil, params) -} - -// Confirm use this endpoint to complete the confirmation of the user account -// email address. Both the **userId** and **token** arguments will be passed -// as query parameters to the redirect URL you have provided when sending your -// request to the /auth/register endpoint. -func (srv *Auth) Confirm(UserId string, Token string) (map[string]interface{}, error) { - path := "/auth/register/confirm" - - params := map[string]interface{}{ - "userId": UserId, - "token": Token, - } - - return srv.client.Call("POST", path, nil, params) -} - -// ConfirmResend this endpoint allows the user to request your app to resend -// him his email confirmation message. The redirect arguments act the same way -// as in /auth/register endpoint. -// -// Please notice that in order to avoid a [Redirect -// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URLs are the ones from domains you have set when -// adding your platforms in the console interface. -func (srv *Auth) ConfirmResend(Confirm string) (map[string]interface{}, error) { - path := "/auth/register/confirm/resend" - - params := map[string]interface{}{ - "confirm": Confirm, - } - - return srv.client.Call("POST", path, nil, params) -} diff --git a/app/sdks/go/docs/examples/Account/Delete.md b/app/sdks/go/docs/examples/Account/Delete.md deleted file mode 100644 index 67ace9a461..0000000000 --- a/app/sdks/go/docs/examples/Account/Delete.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## Delete - -```go - package appwrite-delete - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call Delete method and handle results - var res, err := srv.Delete() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/Get.md b/app/sdks/go/docs/examples/Account/Get.md deleted file mode 100644 index a6dd237a5d..0000000000 --- a/app/sdks/go/docs/examples/Account/Get.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## Get - -```go - package appwrite-get - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call Get method and handle results - var res, err := srv.Get() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/GetPrefs.md b/app/sdks/go/docs/examples/Account/GetPrefs.md deleted file mode 100644 index 0e4cfea354..0000000000 --- a/app/sdks/go/docs/examples/Account/GetPrefs.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## GetPrefs - -```go - package appwrite-getprefs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetPrefs method and handle results - var res, err := srv.GetPrefs() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/GetSecurity.md b/app/sdks/go/docs/examples/Account/GetSecurity.md deleted file mode 100644 index 113eb16ae5..0000000000 --- a/app/sdks/go/docs/examples/Account/GetSecurity.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## GetSecurity - -```go - package appwrite-getsecurity - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetSecurity method and handle results - var res, err := srv.GetSecurity() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/GetSessions.md b/app/sdks/go/docs/examples/Account/GetSessions.md deleted file mode 100644 index 153b8e3fe9..0000000000 --- a/app/sdks/go/docs/examples/Account/GetSessions.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## GetSessions - -```go - package appwrite-getsessions - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetSessions method and handle results - var res, err := srv.GetSessions() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/UpdateEmail.md b/app/sdks/go/docs/examples/Account/UpdateEmail.md deleted file mode 100644 index 6f9895257e..0000000000 --- a/app/sdks/go/docs/examples/Account/UpdateEmail.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## UpdateEmail - -```go - package appwrite-updateemail - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdateEmail method and handle results - var res, err := srv.UpdateEmail("email@example.com", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/UpdateName.md b/app/sdks/go/docs/examples/Account/UpdateName.md deleted file mode 100644 index 3172a94fa6..0000000000 --- a/app/sdks/go/docs/examples/Account/UpdateName.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## UpdateName - -```go - package appwrite-updatename - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdateName method and handle results - var res, err := srv.UpdateName("[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/UpdatePassword.md b/app/sdks/go/docs/examples/Account/UpdatePassword.md deleted file mode 100644 index 2aa8543fcd..0000000000 --- a/app/sdks/go/docs/examples/Account/UpdatePassword.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## UpdatePassword - -```go - package appwrite-updatepassword - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdatePassword method and handle results - var res, err := srv.UpdatePassword("password", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/UpdatePrefs.md b/app/sdks/go/docs/examples/Account/UpdatePrefs.md deleted file mode 100644 index 869e12572d..0000000000 --- a/app/sdks/go/docs/examples/Account/UpdatePrefs.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## UpdatePrefs - -```go - package appwrite-updateprefs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdatePrefs method and handle results - var res, err := srv.UpdatePrefs("{}") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account-recovery.md b/app/sdks/go/docs/examples/Account/create-account-recovery.md deleted file mode 100644 index 9dfef57968..0000000000 --- a/app/sdks/go/docs/examples/Account/create-account-recovery.md +++ /dev/null @@ -1,33 +0,0 @@ -# Account Examples - -## CreateAccountRecovery - -```go - package appwrite-createaccountrecovery - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call CreateAccountRecovery method and handle results - var res, err := srv.CreateAccountRecovery("email@example.com", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account-session-o-auth.md b/app/sdks/go/docs/examples/Account/create-account-session-o-auth.md deleted file mode 100644 index 7bcf83b527..0000000000 --- a/app/sdks/go/docs/examples/Account/create-account-session-o-auth.md +++ /dev/null @@ -1,33 +0,0 @@ -# Account Examples - -## CreateAccountSessionOAuth - -```go - package appwrite-createaccountsessionoauth - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call CreateAccountSessionOAuth method and handle results - var res, err := srv.CreateAccountSessionOAuth("bitbucket", "https://example.com", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account-session.md b/app/sdks/go/docs/examples/Account/create-account-session.md deleted file mode 100644 index 979313a4bb..0000000000 --- a/app/sdks/go/docs/examples/Account/create-account-session.md +++ /dev/null @@ -1,33 +0,0 @@ -# Account Examples - -## CreateAccountSession - -```go - package appwrite-createaccountsession - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call CreateAccountSession method and handle results - var res, err := srv.CreateAccountSession("email@example.com", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account-verification.md b/app/sdks/go/docs/examples/Account/create-account-verification.md deleted file mode 100644 index ceda5fc3c8..0000000000 --- a/app/sdks/go/docs/examples/Account/create-account-verification.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## CreateAccountVerification - -```go - package appwrite-createaccountverification - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call CreateAccountVerification method and handle results - var res, err := srv.CreateAccountVerification("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/create-account.md b/app/sdks/go/docs/examples/Account/create-account.md deleted file mode 100644 index f942eed4bc..0000000000 --- a/app/sdks/go/docs/examples/Account/create-account.md +++ /dev/null @@ -1,33 +0,0 @@ -# Account Examples - -## CreateAccount - -```go - package appwrite-createaccount - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call CreateAccount method and handle results - var res, err := srv.CreateAccount("email@example.com", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/delete-account-current-session.md b/app/sdks/go/docs/examples/Account/delete-account-current-session.md deleted file mode 100644 index 4ba93be456..0000000000 --- a/app/sdks/go/docs/examples/Account/delete-account-current-session.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## DeleteAccountCurrentSession - -```go - package appwrite-deleteaccountcurrentsession - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call DeleteAccountCurrentSession method and handle results - var res, err := srv.DeleteAccountCurrentSession() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/delete-account-session.md b/app/sdks/go/docs/examples/Account/delete-account-session.md deleted file mode 100644 index 2ef9751568..0000000000 --- a/app/sdks/go/docs/examples/Account/delete-account-session.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## DeleteAccountSession - -```go - package appwrite-deleteaccountsession - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call DeleteAccountSession method and handle results - var res, err := srv.DeleteAccountSession("[ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/delete-account-sessions.md b/app/sdks/go/docs/examples/Account/delete-account-sessions.md deleted file mode 100644 index b1934ba852..0000000000 --- a/app/sdks/go/docs/examples/Account/delete-account-sessions.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## DeleteAccountSessions - -```go - package appwrite-deleteaccountsessions - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call DeleteAccountSessions method and handle results - var res, err := srv.DeleteAccountSessions() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-account-logs.md b/app/sdks/go/docs/examples/Account/get-account-logs.md deleted file mode 100644 index fe8a036959..0000000000 --- a/app/sdks/go/docs/examples/Account/get-account-logs.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## GetAccountLogs - -```go - package appwrite-getaccountlogs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetAccountLogs method and handle results - var res, err := srv.GetAccountLogs() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-account-prefs.md b/app/sdks/go/docs/examples/Account/get-account-prefs.md deleted file mode 100644 index a1483646f8..0000000000 --- a/app/sdks/go/docs/examples/Account/get-account-prefs.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## GetAccountPrefs - -```go - package appwrite-getaccountprefs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetAccountPrefs method and handle results - var res, err := srv.GetAccountPrefs() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-account-sessions.md b/app/sdks/go/docs/examples/Account/get-account-sessions.md deleted file mode 100644 index b6f9dd92ba..0000000000 --- a/app/sdks/go/docs/examples/Account/get-account-sessions.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## GetAccountSessions - -```go - package appwrite-getaccountsessions - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetAccountSessions method and handle results - var res, err := srv.GetAccountSessions() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-account.md b/app/sdks/go/docs/examples/Account/get-account.md deleted file mode 100644 index 5ece106aed..0000000000 --- a/app/sdks/go/docs/examples/Account/get-account.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## GetAccount - -```go - package appwrite-getaccount - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetAccount method and handle results - var res, err := srv.GetAccount() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-prefs.md b/app/sdks/go/docs/examples/Account/get-prefs.md deleted file mode 100644 index 0e4cfea354..0000000000 --- a/app/sdks/go/docs/examples/Account/get-prefs.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## GetPrefs - -```go - package appwrite-getprefs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetPrefs method and handle results - var res, err := srv.GetPrefs() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-security.md b/app/sdks/go/docs/examples/Account/get-security.md deleted file mode 100644 index 113eb16ae5..0000000000 --- a/app/sdks/go/docs/examples/Account/get-security.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## GetSecurity - -```go - package appwrite-getsecurity - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetSecurity method and handle results - var res, err := srv.GetSecurity() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/get-sessions.md b/app/sdks/go/docs/examples/Account/get-sessions.md deleted file mode 100644 index 153b8e3fe9..0000000000 --- a/app/sdks/go/docs/examples/Account/get-sessions.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## GetSessions - -```go - package appwrite-getsessions - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call GetSessions method and handle results - var res, err := srv.GetSessions() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-account-name.md b/app/sdks/go/docs/examples/Account/update-account-name.md deleted file mode 100644 index c5f47a0592..0000000000 --- a/app/sdks/go/docs/examples/Account/update-account-name.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## UpdateAccountName - -```go - package appwrite-updateaccountname - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdateAccountName method and handle results - var res, err := srv.UpdateAccountName("[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-account-password.md b/app/sdks/go/docs/examples/Account/update-account-password.md deleted file mode 100644 index 2025742290..0000000000 --- a/app/sdks/go/docs/examples/Account/update-account-password.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## UpdateAccountPassword - -```go - package appwrite-updateaccountpassword - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdateAccountPassword method and handle results - var res, err := srv.UpdateAccountPassword("password", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-account-recovery.md b/app/sdks/go/docs/examples/Account/update-account-recovery.md deleted file mode 100644 index 4463522761..0000000000 --- a/app/sdks/go/docs/examples/Account/update-account-recovery.md +++ /dev/null @@ -1,33 +0,0 @@ -# Account Examples - -## UpdateAccountRecovery - -```go - package appwrite-updateaccountrecovery - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdateAccountRecovery method and handle results - var res, err := srv.UpdateAccountRecovery("[USER_ID]", "[SECRET]", "password", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-account-verification.md b/app/sdks/go/docs/examples/Account/update-account-verification.md deleted file mode 100644 index 494db24089..0000000000 --- a/app/sdks/go/docs/examples/Account/update-account-verification.md +++ /dev/null @@ -1,33 +0,0 @@ -# Account Examples - -## UpdateAccountVerification - -```go - package appwrite-updateaccountverification - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdateAccountVerification method and handle results - var res, err := srv.UpdateAccountVerification("[USER_ID]", "[SECRET]", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-email.md b/app/sdks/go/docs/examples/Account/update-email.md deleted file mode 100644 index 5866aac613..0000000000 --- a/app/sdks/go/docs/examples/Account/update-email.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## UpdateEmail - -```go - package appwrite-updateemail - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdateEmail method and handle results - var res, err := srv.UpdateEmail("email@example.com", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-name.md b/app/sdks/go/docs/examples/Account/update-name.md deleted file mode 100644 index 3172a94fa6..0000000000 --- a/app/sdks/go/docs/examples/Account/update-name.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## UpdateName - -```go - package appwrite-updatename - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdateName method and handle results - var res, err := srv.UpdateName("[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-password.md b/app/sdks/go/docs/examples/Account/update-password.md deleted file mode 100644 index 2aa8543fcd..0000000000 --- a/app/sdks/go/docs/examples/Account/update-password.md +++ /dev/null @@ -1,35 +0,0 @@ -# Account Examples - -## UpdatePassword - -```go - package appwrite-updatepassword - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdatePassword method and handle results - var res, err := srv.UpdatePassword("password", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Account/update-prefs.md b/app/sdks/go/docs/examples/Account/update-prefs.md deleted file mode 100644 index 44cd77c898..0000000000 --- a/app/sdks/go/docs/examples/Account/update-prefs.md +++ /dev/null @@ -1,34 +0,0 @@ -# Account Examples - -## UpdatePrefs - -```go - package appwrite-updateprefs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Account service passing Client - var srv := appwrite.Account{ - client: &clt - } - - // Call UpdatePrefs method and handle results - var res, err := srv.UpdatePrefs("") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/Confirm.md b/app/sdks/go/docs/examples/Auth/Confirm.md deleted file mode 100644 index c7305d378a..0000000000 --- a/app/sdks/go/docs/examples/Auth/Confirm.md +++ /dev/null @@ -1,33 +0,0 @@ -# Auth Examples - -## Confirm - -```go - package appwrite-confirm - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call Confirm method and handle results - var res, err := srv.Confirm("[USER_ID]", "[TOKEN]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/ConfirmResend.md b/app/sdks/go/docs/examples/Auth/ConfirmResend.md deleted file mode 100644 index 42750db217..0000000000 --- a/app/sdks/go/docs/examples/Auth/ConfirmResend.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## ConfirmResend - -```go - package appwrite-confirmresend - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call ConfirmResend method and handle results - var res, err := srv.ConfirmResend("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/Login.md b/app/sdks/go/docs/examples/Auth/Login.md deleted file mode 100644 index 2f60a9ffd3..0000000000 --- a/app/sdks/go/docs/examples/Auth/Login.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## Login - -```go - package appwrite-login - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call Login method and handle results - var res, err := srv.Login("email@example.com", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/Logout.md b/app/sdks/go/docs/examples/Auth/Logout.md deleted file mode 100644 index 4a3d126e7e..0000000000 --- a/app/sdks/go/docs/examples/Auth/Logout.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## Logout - -```go - package appwrite-logout - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call Logout method and handle results - var res, err := srv.Logout() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/LogoutBySession.md b/app/sdks/go/docs/examples/Auth/LogoutBySession.md deleted file mode 100644 index 239e764b16..0000000000 --- a/app/sdks/go/docs/examples/Auth/LogoutBySession.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## LogoutBySession - -```go - package appwrite-logoutbysession - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call LogoutBySession method and handle results - var res, err := srv.LogoutBySession("[ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/Oauth.md b/app/sdks/go/docs/examples/Auth/Oauth.md deleted file mode 100644 index 0cfb46726d..0000000000 --- a/app/sdks/go/docs/examples/Auth/Oauth.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## Oauth - -```go - package appwrite-oauth - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call Oauth method and handle results - var res, err := srv.Oauth("bitbucket", "https://example.com", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/Recovery.md b/app/sdks/go/docs/examples/Auth/Recovery.md deleted file mode 100644 index 4e4e88093c..0000000000 --- a/app/sdks/go/docs/examples/Auth/Recovery.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## Recovery - -```go - package appwrite-recovery - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call Recovery method and handle results - var res, err := srv.Recovery("email@example.com", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/RecoveryReset.md b/app/sdks/go/docs/examples/Auth/RecoveryReset.md deleted file mode 100644 index d5922708aa..0000000000 --- a/app/sdks/go/docs/examples/Auth/RecoveryReset.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## RecoveryReset - -```go - package appwrite-recoveryreset - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call RecoveryReset method and handle results - var res, err := srv.RecoveryReset("[USER_ID]", "[TOKEN]", "password", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/Register.md b/app/sdks/go/docs/examples/Auth/Register.md deleted file mode 100644 index 8e64c96fcb..0000000000 --- a/app/sdks/go/docs/examples/Auth/Register.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## Register - -```go - package appwrite-register - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call Register method and handle results - var res, err := srv.Register("email@example.com", "password", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/confirm-resend.md b/app/sdks/go/docs/examples/Auth/confirm-resend.md deleted file mode 100644 index 42750db217..0000000000 --- a/app/sdks/go/docs/examples/Auth/confirm-resend.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## ConfirmResend - -```go - package appwrite-confirmresend - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call ConfirmResend method and handle results - var res, err := srv.ConfirmResend("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/logout-by-session.md b/app/sdks/go/docs/examples/Auth/logout-by-session.md deleted file mode 100644 index 239e764b16..0000000000 --- a/app/sdks/go/docs/examples/Auth/logout-by-session.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## LogoutBySession - -```go - package appwrite-logoutbysession - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call LogoutBySession method and handle results - var res, err := srv.LogoutBySession("[ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Auth/recovery-reset.md b/app/sdks/go/docs/examples/Auth/recovery-reset.md deleted file mode 100644 index d5922708aa..0000000000 --- a/app/sdks/go/docs/examples/Auth/recovery-reset.md +++ /dev/null @@ -1,35 +0,0 @@ -# Auth Examples - -## RecoveryReset - -```go - package appwrite-recoveryreset - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Auth service passing Client - var srv := appwrite.Auth{ - client: &clt - } - - // Call RecoveryReset method and handle results - var res, err := srv.RecoveryReset("[USER_ID]", "[TOKEN]", "password", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/GetBrowser.md b/app/sdks/go/docs/examples/Avatars/GetBrowser.md deleted file mode 100644 index 9628da910b..0000000000 --- a/app/sdks/go/docs/examples/Avatars/GetBrowser.md +++ /dev/null @@ -1,35 +0,0 @@ -# Avatars Examples - -## GetBrowser - -```go - package appwrite-getbrowser - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetBrowser method and handle results - var res, err := srv.GetBrowser("aa") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/GetCreditCard.md b/app/sdks/go/docs/examples/Avatars/GetCreditCard.md deleted file mode 100644 index 488077cfc3..0000000000 --- a/app/sdks/go/docs/examples/Avatars/GetCreditCard.md +++ /dev/null @@ -1,35 +0,0 @@ -# Avatars Examples - -## GetCreditCard - -```go - package appwrite-getcreditcard - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetCreditCard method and handle results - var res, err := srv.GetCreditCard("amex") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/GetFavicon.md b/app/sdks/go/docs/examples/Avatars/GetFavicon.md deleted file mode 100644 index c235967d6b..0000000000 --- a/app/sdks/go/docs/examples/Avatars/GetFavicon.md +++ /dev/null @@ -1,35 +0,0 @@ -# Avatars Examples - -## GetFavicon - -```go - package appwrite-getfavicon - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetFavicon method and handle results - var res, err := srv.GetFavicon("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/GetFlag.md b/app/sdks/go/docs/examples/Avatars/GetFlag.md deleted file mode 100644 index 955c96c530..0000000000 --- a/app/sdks/go/docs/examples/Avatars/GetFlag.md +++ /dev/null @@ -1,35 +0,0 @@ -# Avatars Examples - -## GetFlag - -```go - package appwrite-getflag - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetFlag method and handle results - var res, err := srv.GetFlag("af") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/GetImage.md b/app/sdks/go/docs/examples/Avatars/GetImage.md deleted file mode 100644 index 11d1c6523d..0000000000 --- a/app/sdks/go/docs/examples/Avatars/GetImage.md +++ /dev/null @@ -1,35 +0,0 @@ -# Avatars Examples - -## GetImage - -```go - package appwrite-getimage - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetImage method and handle results - var res, err := srv.GetImage("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/GetQR.md b/app/sdks/go/docs/examples/Avatars/GetQR.md deleted file mode 100644 index 0874c0e6be..0000000000 --- a/app/sdks/go/docs/examples/Avatars/GetQR.md +++ /dev/null @@ -1,35 +0,0 @@ -# Avatars Examples - -## GetQR - -```go - package appwrite-getqr - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetQR method and handle results - var res, err := srv.GetQR("[TEXT]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-browser.md b/app/sdks/go/docs/examples/Avatars/get-browser.md index f94c34aab4..9628da910b 100644 --- a/app/sdks/go/docs/examples/Avatars/get-browser.md +++ b/app/sdks/go/docs/examples/Avatars/get-browser.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-credit-card.md b/app/sdks/go/docs/examples/Avatars/get-credit-card.md index 4d3c60600a..488077cfc3 100644 --- a/app/sdks/go/docs/examples/Avatars/get-credit-card.md +++ b/app/sdks/go/docs/examples/Avatars/get-credit-card.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-favicon.md b/app/sdks/go/docs/examples/Avatars/get-favicon.md index 4cb5a5c5e3..c235967d6b 100644 --- a/app/sdks/go/docs/examples/Avatars/get-favicon.md +++ b/app/sdks/go/docs/examples/Avatars/get-favicon.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-flag.md b/app/sdks/go/docs/examples/Avatars/get-flag.md index 0428944e12..955c96c530 100644 --- a/app/sdks/go/docs/examples/Avatars/get-flag.md +++ b/app/sdks/go/docs/examples/Avatars/get-flag.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-image.md b/app/sdks/go/docs/examples/Avatars/get-image.md index 9fc5892c68..11d1c6523d 100644 --- a/app/sdks/go/docs/examples/Avatars/get-image.md +++ b/app/sdks/go/docs/examples/Avatars/get-image.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Avatars/get-q-r.md b/app/sdks/go/docs/examples/Avatars/get-q-r.md index 4d5b93ebdc..0874c0e6be 100644 --- a/app/sdks/go/docs/examples/Avatars/get-q-r.md +++ b/app/sdks/go/docs/examples/Avatars/get-q-r.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Avatars service passing Client var srv := appwrite.Avatars{ diff --git a/app/sdks/go/docs/examples/Database/CreateCollection.md b/app/sdks/go/docs/examples/Database/CreateCollection.md deleted file mode 100644 index f4f2ab1fc3..0000000000 --- a/app/sdks/go/docs/examples/Database/CreateCollection.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## CreateCollection - -```go - package appwrite-createcollection - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call CreateCollection method and handle results - var res, err := srv.CreateCollection("[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/CreateDocument.md b/app/sdks/go/docs/examples/Database/CreateDocument.md deleted file mode 100644 index ab9aa9e602..0000000000 --- a/app/sdks/go/docs/examples/Database/CreateDocument.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## CreateDocument - -```go - package appwrite-createdocument - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call CreateDocument method and handle results - var res, err := srv.CreateDocument("[COLLECTION_ID]", "{}") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/DeleteCollection.md b/app/sdks/go/docs/examples/Database/DeleteCollection.md deleted file mode 100644 index 85928bde3b..0000000000 --- a/app/sdks/go/docs/examples/Database/DeleteCollection.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## DeleteCollection - -```go - package appwrite-deletecollection - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call DeleteCollection method and handle results - var res, err := srv.DeleteCollection("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/DeleteDocument.md b/app/sdks/go/docs/examples/Database/DeleteDocument.md deleted file mode 100644 index 256a0abccb..0000000000 --- a/app/sdks/go/docs/examples/Database/DeleteDocument.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## DeleteDocument - -```go - package appwrite-deletedocument - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call DeleteDocument method and handle results - var res, err := srv.DeleteDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/GetCollection.md b/app/sdks/go/docs/examples/Database/GetCollection.md deleted file mode 100644 index 120ad0a19e..0000000000 --- a/app/sdks/go/docs/examples/Database/GetCollection.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## GetCollection - -```go - package appwrite-getcollection - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call GetCollection method and handle results - var res, err := srv.GetCollection("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/GetDocument.md b/app/sdks/go/docs/examples/Database/GetDocument.md deleted file mode 100644 index 8866442b6b..0000000000 --- a/app/sdks/go/docs/examples/Database/GetDocument.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## GetDocument - -```go - package appwrite-getdocument - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call GetDocument method and handle results - var res, err := srv.GetDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/ListCollections.md b/app/sdks/go/docs/examples/Database/ListCollections.md deleted file mode 100644 index 1db6530df7..0000000000 --- a/app/sdks/go/docs/examples/Database/ListCollections.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## ListCollections - -```go - package appwrite-listcollections - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call ListCollections method and handle results - var res, err := srv.ListCollections() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/ListDocuments.md b/app/sdks/go/docs/examples/Database/ListDocuments.md deleted file mode 100644 index 6c46ead8db..0000000000 --- a/app/sdks/go/docs/examples/Database/ListDocuments.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## ListDocuments - -```go - package appwrite-listdocuments - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call ListDocuments method and handle results - var res, err := srv.ListDocuments("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/UpdateCollection.md b/app/sdks/go/docs/examples/Database/UpdateCollection.md deleted file mode 100644 index f6ab2b17e1..0000000000 --- a/app/sdks/go/docs/examples/Database/UpdateCollection.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## UpdateCollection - -```go - package appwrite-updatecollection - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call UpdateCollection method and handle results - var res, err := srv.UpdateCollection("[COLLECTION_ID]", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/UpdateDocument.md b/app/sdks/go/docs/examples/Database/UpdateDocument.md deleted file mode 100644 index 6a2775e71a..0000000000 --- a/app/sdks/go/docs/examples/Database/UpdateDocument.md +++ /dev/null @@ -1,35 +0,0 @@ -# Database Examples - -## UpdateDocument - -```go - package appwrite-updatedocument - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call UpdateDocument method and handle results - var res, err := srv.UpdateDocument("[COLLECTION_ID]", "[DOCUMENT_ID]", "{}") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/create-collection.md b/app/sdks/go/docs/examples/Database/create-collection.md index 3c940b0f8f..48e5977c60 100644 --- a/app/sdks/go/docs/examples/Database/create-collection.md +++ b/app/sdks/go/docs/examples/Database/create-collection.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/create-document.md b/app/sdks/go/docs/examples/Database/create-document.md index b6411c0638..ccaa02f578 100644 --- a/app/sdks/go/docs/examples/Database/create-document.md +++ b/app/sdks/go/docs/examples/Database/create-document.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/delete-collection.md b/app/sdks/go/docs/examples/Database/delete-collection.md index 574fc498d1..85928bde3b 100644 --- a/app/sdks/go/docs/examples/Database/delete-collection.md +++ b/app/sdks/go/docs/examples/Database/delete-collection.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/delete-document.md b/app/sdks/go/docs/examples/Database/delete-document.md index 4a8442861e..256a0abccb 100644 --- a/app/sdks/go/docs/examples/Database/delete-document.md +++ b/app/sdks/go/docs/examples/Database/delete-document.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/get-collection.md b/app/sdks/go/docs/examples/Database/get-collection.md index 46b70412e7..120ad0a19e 100644 --- a/app/sdks/go/docs/examples/Database/get-collection.md +++ b/app/sdks/go/docs/examples/Database/get-collection.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/get-document.md b/app/sdks/go/docs/examples/Database/get-document.md index 2c7a6fdb60..8866442b6b 100644 --- a/app/sdks/go/docs/examples/Database/get-document.md +++ b/app/sdks/go/docs/examples/Database/get-document.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/list-collections.md b/app/sdks/go/docs/examples/Database/list-collections.md index f4fe864615..1db6530df7 100644 --- a/app/sdks/go/docs/examples/Database/list-collections.md +++ b/app/sdks/go/docs/examples/Database/list-collections.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/list-documents.md b/app/sdks/go/docs/examples/Database/list-documents.md index 5542d89b9a..6c46ead8db 100644 --- a/app/sdks/go/docs/examples/Database/list-documents.md +++ b/app/sdks/go/docs/examples/Database/list-documents.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/update-collection.md b/app/sdks/go/docs/examples/Database/update-collection.md index 1fd860d466..7cf07ac2c0 100644 --- a/app/sdks/go/docs/examples/Database/update-collection.md +++ b/app/sdks/go/docs/examples/Database/update-collection.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Database/update-document.md b/app/sdks/go/docs/examples/Database/update-document.md index 5b225d62f3..88f57eefa9 100644 --- a/app/sdks/go/docs/examples/Database/update-document.md +++ b/app/sdks/go/docs/examples/Database/update-document.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Database service passing Client var srv := appwrite.Database{ diff --git a/app/sdks/go/docs/examples/Locale/GetCountries.md b/app/sdks/go/docs/examples/Locale/GetCountries.md deleted file mode 100644 index be286c1979..0000000000 --- a/app/sdks/go/docs/examples/Locale/GetCountries.md +++ /dev/null @@ -1,35 +0,0 @@ -# Locale Examples - -## GetCountries - -```go - package appwrite-getcountries - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetCountries method and handle results - var res, err := srv.GetCountries() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/GetCountriesEU.md b/app/sdks/go/docs/examples/Locale/GetCountriesEU.md deleted file mode 100644 index ca8ed7ca48..0000000000 --- a/app/sdks/go/docs/examples/Locale/GetCountriesEU.md +++ /dev/null @@ -1,35 +0,0 @@ -# Locale Examples - -## GetCountriesEU - -```go - package appwrite-getcountrieseu - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetCountriesEU method and handle results - var res, err := srv.GetCountriesEU() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/GetCountriesPhones.md b/app/sdks/go/docs/examples/Locale/GetCountriesPhones.md deleted file mode 100644 index 8847258258..0000000000 --- a/app/sdks/go/docs/examples/Locale/GetCountriesPhones.md +++ /dev/null @@ -1,35 +0,0 @@ -# Locale Examples - -## GetCountriesPhones - -```go - package appwrite-getcountriesphones - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetCountriesPhones method and handle results - var res, err := srv.GetCountriesPhones() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/GetCurrencies.md b/app/sdks/go/docs/examples/Locale/GetCurrencies.md deleted file mode 100644 index fcbb679fd3..0000000000 --- a/app/sdks/go/docs/examples/Locale/GetCurrencies.md +++ /dev/null @@ -1,35 +0,0 @@ -# Locale Examples - -## GetCurrencies - -```go - package appwrite-getcurrencies - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetCurrencies method and handle results - var res, err := srv.GetCurrencies() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/GetLocale.md b/app/sdks/go/docs/examples/Locale/GetLocale.md deleted file mode 100644 index 67cfcdccc9..0000000000 --- a/app/sdks/go/docs/examples/Locale/GetLocale.md +++ /dev/null @@ -1,35 +0,0 @@ -# Locale Examples - -## GetLocale - -```go - package appwrite-getlocale - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetLocale method and handle results - var res, err := srv.GetLocale() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-continents.md b/app/sdks/go/docs/examples/Locale/get-continents.md index ee76b8f574..faeab3a977 100644 --- a/app/sdks/go/docs/examples/Locale/get-continents.md +++ b/app/sdks/go/docs/examples/Locale/get-continents.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-countries-e-u.md b/app/sdks/go/docs/examples/Locale/get-countries-e-u.md index b79057d7e7..ca8ed7ca48 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries-e-u.md +++ b/app/sdks/go/docs/examples/Locale/get-countries-e-u.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-countries-phones.md b/app/sdks/go/docs/examples/Locale/get-countries-phones.md index aaa02a6585..8847258258 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries-phones.md +++ b/app/sdks/go/docs/examples/Locale/get-countries-phones.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-countries.md b/app/sdks/go/docs/examples/Locale/get-countries.md index f206e66ea6..be286c1979 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries.md +++ b/app/sdks/go/docs/examples/Locale/get-countries.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-currencies.md b/app/sdks/go/docs/examples/Locale/get-currencies.md index 69fba7c7bd..fcbb679fd3 100644 --- a/app/sdks/go/docs/examples/Locale/get-currencies.md +++ b/app/sdks/go/docs/examples/Locale/get-currencies.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Locale/get-locale.md b/app/sdks/go/docs/examples/Locale/get-locale.md index 002b841f2a..67cfcdccc9 100644 --- a/app/sdks/go/docs/examples/Locale/get-locale.md +++ b/app/sdks/go/docs/examples/Locale/get-locale.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Locale service passing Client var srv := appwrite.Locale{ diff --git a/app/sdks/go/docs/examples/Projects/CreateKey.md b/app/sdks/go/docs/examples/Projects/CreateKey.md deleted file mode 100644 index 7fa69e4b67..0000000000 --- a/app/sdks/go/docs/examples/Projects/CreateKey.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## CreateKey - -```go - package appwrite-createkey - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreateKey method and handle results - var res, err := srv.CreateKey("[PROJECT_ID]", "[NAME]", []) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/CreatePlatform.md b/app/sdks/go/docs/examples/Projects/CreatePlatform.md deleted file mode 100644 index 7f2d247741..0000000000 --- a/app/sdks/go/docs/examples/Projects/CreatePlatform.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## CreatePlatform - -```go - package appwrite-createplatform - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreatePlatform method and handle results - var res, err := srv.CreatePlatform("[PROJECT_ID]", "web", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/CreateProject.md b/app/sdks/go/docs/examples/Projects/CreateProject.md deleted file mode 100644 index 44525bdcd2..0000000000 --- a/app/sdks/go/docs/examples/Projects/CreateProject.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## CreateProject - -```go - package appwrite-createproject - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreateProject method and handle results - var res, err := srv.CreateProject("[NAME]", "[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/CreateTask.md b/app/sdks/go/docs/examples/Projects/CreateTask.md deleted file mode 100644 index 25c617ec9b..0000000000 --- a/app/sdks/go/docs/examples/Projects/CreateTask.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## CreateTask - -```go - package appwrite-createtask - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreateTask method and handle results - var res, err := srv.CreateTask("[PROJECT_ID]", "[NAME]", "play", "", 0, "GET", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/CreateWebhook.md b/app/sdks/go/docs/examples/Projects/CreateWebhook.md deleted file mode 100644 index 58e5dc548f..0000000000 --- a/app/sdks/go/docs/examples/Projects/CreateWebhook.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## CreateWebhook - -```go - package appwrite-createwebhook - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreateWebhook method and handle results - var res, err := srv.CreateWebhook("[PROJECT_ID]", "[NAME]", [], "[URL]", 0) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/DeleteKey.md b/app/sdks/go/docs/examples/Projects/DeleteKey.md deleted file mode 100644 index 3160b37d1c..0000000000 --- a/app/sdks/go/docs/examples/Projects/DeleteKey.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## DeleteKey - -```go - package appwrite-deletekey - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeleteKey method and handle results - var res, err := srv.DeleteKey("[PROJECT_ID]", "[KEY_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/DeletePlatform.md b/app/sdks/go/docs/examples/Projects/DeletePlatform.md deleted file mode 100644 index a9e3f0d3b9..0000000000 --- a/app/sdks/go/docs/examples/Projects/DeletePlatform.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## DeletePlatform - -```go - package appwrite-deleteplatform - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeletePlatform method and handle results - var res, err := srv.DeletePlatform("[PROJECT_ID]", "[PLATFORM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/DeleteProject.md b/app/sdks/go/docs/examples/Projects/DeleteProject.md deleted file mode 100644 index 446f640c0d..0000000000 --- a/app/sdks/go/docs/examples/Projects/DeleteProject.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## DeleteProject - -```go - package appwrite-deleteproject - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeleteProject method and handle results - var res, err := srv.DeleteProject("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/DeleteTask.md b/app/sdks/go/docs/examples/Projects/DeleteTask.md deleted file mode 100644 index a5275e3b04..0000000000 --- a/app/sdks/go/docs/examples/Projects/DeleteTask.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## DeleteTask - -```go - package appwrite-deletetask - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeleteTask method and handle results - var res, err := srv.DeleteTask("[PROJECT_ID]", "[TASK_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/DeleteWebhook.md b/app/sdks/go/docs/examples/Projects/DeleteWebhook.md deleted file mode 100644 index 377708f6a3..0000000000 --- a/app/sdks/go/docs/examples/Projects/DeleteWebhook.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## DeleteWebhook - -```go - package appwrite-deletewebhook - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeleteWebhook method and handle results - var res, err := srv.DeleteWebhook("[PROJECT_ID]", "[WEBHOOK_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/GetKey.md b/app/sdks/go/docs/examples/Projects/GetKey.md deleted file mode 100644 index abe636ba31..0000000000 --- a/app/sdks/go/docs/examples/Projects/GetKey.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## GetKey - -```go - package appwrite-getkey - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetKey method and handle results - var res, err := srv.GetKey("[PROJECT_ID]", "[KEY_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/GetPlatform.md b/app/sdks/go/docs/examples/Projects/GetPlatform.md deleted file mode 100644 index 14a9d3bda5..0000000000 --- a/app/sdks/go/docs/examples/Projects/GetPlatform.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## GetPlatform - -```go - package appwrite-getplatform - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetPlatform method and handle results - var res, err := srv.GetPlatform("[PROJECT_ID]", "[PLATFORM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/GetProject.md b/app/sdks/go/docs/examples/Projects/GetProject.md deleted file mode 100644 index 8e0986f592..0000000000 --- a/app/sdks/go/docs/examples/Projects/GetProject.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## GetProject - -```go - package appwrite-getproject - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetProject method and handle results - var res, err := srv.GetProject("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/GetProjectUsage.md b/app/sdks/go/docs/examples/Projects/GetProjectUsage.md deleted file mode 100644 index 2bb6bc4dc5..0000000000 --- a/app/sdks/go/docs/examples/Projects/GetProjectUsage.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## GetProjectUsage - -```go - package appwrite-getprojectusage - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetProjectUsage method and handle results - var res, err := srv.GetProjectUsage("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/GetTask.md b/app/sdks/go/docs/examples/Projects/GetTask.md deleted file mode 100644 index c6efdf553b..0000000000 --- a/app/sdks/go/docs/examples/Projects/GetTask.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## GetTask - -```go - package appwrite-gettask - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetTask method and handle results - var res, err := srv.GetTask("[PROJECT_ID]", "[TASK_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/GetWebhook.md b/app/sdks/go/docs/examples/Projects/GetWebhook.md deleted file mode 100644 index b46bf392b5..0000000000 --- a/app/sdks/go/docs/examples/Projects/GetWebhook.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## GetWebhook - -```go - package appwrite-getwebhook - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetWebhook method and handle results - var res, err := srv.GetWebhook("[PROJECT_ID]", "[WEBHOOK_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/ListKeys.md b/app/sdks/go/docs/examples/Projects/ListKeys.md deleted file mode 100644 index e084035bb5..0000000000 --- a/app/sdks/go/docs/examples/Projects/ListKeys.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## ListKeys - -```go - package appwrite-listkeys - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListKeys method and handle results - var res, err := srv.ListKeys("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/ListPlatforms.md b/app/sdks/go/docs/examples/Projects/ListPlatforms.md deleted file mode 100644 index ecce7449e1..0000000000 --- a/app/sdks/go/docs/examples/Projects/ListPlatforms.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## ListPlatforms - -```go - package appwrite-listplatforms - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListPlatforms method and handle results - var res, err := srv.ListPlatforms("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/ListProjects.md b/app/sdks/go/docs/examples/Projects/ListProjects.md deleted file mode 100644 index f17ea76beb..0000000000 --- a/app/sdks/go/docs/examples/Projects/ListProjects.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## ListProjects - -```go - package appwrite-listprojects - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListProjects method and handle results - var res, err := srv.ListProjects() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/ListTasks.md b/app/sdks/go/docs/examples/Projects/ListTasks.md deleted file mode 100644 index 84f5356c34..0000000000 --- a/app/sdks/go/docs/examples/Projects/ListTasks.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## ListTasks - -```go - package appwrite-listtasks - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListTasks method and handle results - var res, err := srv.ListTasks("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/ListWebhooks.md b/app/sdks/go/docs/examples/Projects/ListWebhooks.md deleted file mode 100644 index aee6b8da62..0000000000 --- a/app/sdks/go/docs/examples/Projects/ListWebhooks.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## ListWebhooks - -```go - package appwrite-listwebhooks - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListWebhooks method and handle results - var res, err := srv.ListWebhooks("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/UpdateKey.md b/app/sdks/go/docs/examples/Projects/UpdateKey.md deleted file mode 100644 index 205caef8c8..0000000000 --- a/app/sdks/go/docs/examples/Projects/UpdateKey.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## UpdateKey - -```go - package appwrite-updatekey - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateKey method and handle results - var res, err := srv.UpdateKey("[PROJECT_ID]", "[KEY_ID]", "[NAME]", []) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/UpdatePlatform.md b/app/sdks/go/docs/examples/Projects/UpdatePlatform.md deleted file mode 100644 index bc966f73a8..0000000000 --- a/app/sdks/go/docs/examples/Projects/UpdatePlatform.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## UpdatePlatform - -```go - package appwrite-updateplatform - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdatePlatform method and handle results - var res, err := srv.UpdatePlatform("[PROJECT_ID]", "[PLATFORM_ID]", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/UpdateProject.md b/app/sdks/go/docs/examples/Projects/UpdateProject.md deleted file mode 100644 index 7663ec4c4e..0000000000 --- a/app/sdks/go/docs/examples/Projects/UpdateProject.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## UpdateProject - -```go - package appwrite-updateproject - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateProject method and handle results - var res, err := srv.UpdateProject("[PROJECT_ID]", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/UpdateProjectOAuth.md b/app/sdks/go/docs/examples/Projects/UpdateProjectOAuth.md deleted file mode 100644 index 58f23b698b..0000000000 --- a/app/sdks/go/docs/examples/Projects/UpdateProjectOAuth.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## UpdateProjectOAuth - -```go - package appwrite-updateprojectoauth - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateProjectOAuth method and handle results - var res, err := srv.UpdateProjectOAuth("[PROJECT_ID]", "bitbucket") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/UpdateTask.md b/app/sdks/go/docs/examples/Projects/UpdateTask.md deleted file mode 100644 index f977fd5540..0000000000 --- a/app/sdks/go/docs/examples/Projects/UpdateTask.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## UpdateTask - -```go - package appwrite-updatetask - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateTask method and handle results - var res, err := srv.UpdateTask("[PROJECT_ID]", "[TASK_ID]", "[NAME]", "play", "", 0, "GET", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/UpdateWebhook.md b/app/sdks/go/docs/examples/Projects/UpdateWebhook.md deleted file mode 100644 index 0120707ad5..0000000000 --- a/app/sdks/go/docs/examples/Projects/UpdateWebhook.md +++ /dev/null @@ -1,35 +0,0 @@ -# Projects Examples - -## UpdateWebhook - -```go - package appwrite-updatewebhook - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateWebhook method and handle results - var res, err := srv.UpdateWebhook("[PROJECT_ID]", "[WEBHOOK_ID]", "[NAME]", [], "[URL]", 0) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/create-key.md b/app/sdks/go/docs/examples/Projects/create-key.md deleted file mode 100644 index d5197d2a1e..0000000000 --- a/app/sdks/go/docs/examples/Projects/create-key.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## CreateKey - -```go - package appwrite-createkey - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreateKey method and handle results - var res, err := srv.CreateKey("[PROJECT_ID]", "[NAME]", []) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/create-platform.md b/app/sdks/go/docs/examples/Projects/create-platform.md deleted file mode 100644 index fd4a61884d..0000000000 --- a/app/sdks/go/docs/examples/Projects/create-platform.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## CreatePlatform - -```go - package appwrite-createplatform - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreatePlatform method and handle results - var res, err := srv.CreatePlatform("[PROJECT_ID]", "web", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/create-project.md b/app/sdks/go/docs/examples/Projects/create-project.md deleted file mode 100644 index 74ffc04444..0000000000 --- a/app/sdks/go/docs/examples/Projects/create-project.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## CreateProject - -```go - package appwrite-createproject - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreateProject method and handle results - var res, err := srv.CreateProject("[NAME]", "[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/create-task.md b/app/sdks/go/docs/examples/Projects/create-task.md deleted file mode 100644 index aa642b536a..0000000000 --- a/app/sdks/go/docs/examples/Projects/create-task.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## CreateTask - -```go - package appwrite-createtask - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreateTask method and handle results - var res, err := srv.CreateTask("[PROJECT_ID]", "[NAME]", "play", "", 0, "GET", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/create-webhook.md b/app/sdks/go/docs/examples/Projects/create-webhook.md deleted file mode 100644 index 60b62ed828..0000000000 --- a/app/sdks/go/docs/examples/Projects/create-webhook.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## CreateWebhook - -```go - package appwrite-createwebhook - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call CreateWebhook method and handle results - var res, err := srv.CreateWebhook("[PROJECT_ID]", "[NAME]", [], "[URL]", 0) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/delete-key.md b/app/sdks/go/docs/examples/Projects/delete-key.md deleted file mode 100644 index b4929842f0..0000000000 --- a/app/sdks/go/docs/examples/Projects/delete-key.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## DeleteKey - -```go - package appwrite-deletekey - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeleteKey method and handle results - var res, err := srv.DeleteKey("[PROJECT_ID]", "[KEY_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/delete-platform.md b/app/sdks/go/docs/examples/Projects/delete-platform.md deleted file mode 100644 index 1f04f26bd2..0000000000 --- a/app/sdks/go/docs/examples/Projects/delete-platform.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## DeletePlatform - -```go - package appwrite-deleteplatform - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeletePlatform method and handle results - var res, err := srv.DeletePlatform("[PROJECT_ID]", "[PLATFORM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/delete-project.md b/app/sdks/go/docs/examples/Projects/delete-project.md deleted file mode 100644 index b8b7f2d60d..0000000000 --- a/app/sdks/go/docs/examples/Projects/delete-project.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## DeleteProject - -```go - package appwrite-deleteproject - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeleteProject method and handle results - var res, err := srv.DeleteProject("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/delete-task.md b/app/sdks/go/docs/examples/Projects/delete-task.md deleted file mode 100644 index 934a80f405..0000000000 --- a/app/sdks/go/docs/examples/Projects/delete-task.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## DeleteTask - -```go - package appwrite-deletetask - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeleteTask method and handle results - var res, err := srv.DeleteTask("[PROJECT_ID]", "[TASK_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/delete-webhook.md b/app/sdks/go/docs/examples/Projects/delete-webhook.md deleted file mode 100644 index f30e3906e6..0000000000 --- a/app/sdks/go/docs/examples/Projects/delete-webhook.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## DeleteWebhook - -```go - package appwrite-deletewebhook - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call DeleteWebhook method and handle results - var res, err := srv.DeleteWebhook("[PROJECT_ID]", "[WEBHOOK_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/get-key.md b/app/sdks/go/docs/examples/Projects/get-key.md deleted file mode 100644 index d58e13d211..0000000000 --- a/app/sdks/go/docs/examples/Projects/get-key.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## GetKey - -```go - package appwrite-getkey - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetKey method and handle results - var res, err := srv.GetKey("[PROJECT_ID]", "[KEY_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/get-platform.md b/app/sdks/go/docs/examples/Projects/get-platform.md deleted file mode 100644 index 1a0d3fc29f..0000000000 --- a/app/sdks/go/docs/examples/Projects/get-platform.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## GetPlatform - -```go - package appwrite-getplatform - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetPlatform method and handle results - var res, err := srv.GetPlatform("[PROJECT_ID]", "[PLATFORM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/get-project-usage.md b/app/sdks/go/docs/examples/Projects/get-project-usage.md deleted file mode 100644 index 89f87f3345..0000000000 --- a/app/sdks/go/docs/examples/Projects/get-project-usage.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## GetProjectUsage - -```go - package appwrite-getprojectusage - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetProjectUsage method and handle results - var res, err := srv.GetProjectUsage("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/get-project.md b/app/sdks/go/docs/examples/Projects/get-project.md deleted file mode 100644 index b942ba7249..0000000000 --- a/app/sdks/go/docs/examples/Projects/get-project.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## GetProject - -```go - package appwrite-getproject - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetProject method and handle results - var res, err := srv.GetProject("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/get-task.md b/app/sdks/go/docs/examples/Projects/get-task.md deleted file mode 100644 index 1168f7ab6f..0000000000 --- a/app/sdks/go/docs/examples/Projects/get-task.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## GetTask - -```go - package appwrite-gettask - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetTask method and handle results - var res, err := srv.GetTask("[PROJECT_ID]", "[TASK_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/get-webhook.md b/app/sdks/go/docs/examples/Projects/get-webhook.md deleted file mode 100644 index 349f0fea47..0000000000 --- a/app/sdks/go/docs/examples/Projects/get-webhook.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## GetWebhook - -```go - package appwrite-getwebhook - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call GetWebhook method and handle results - var res, err := srv.GetWebhook("[PROJECT_ID]", "[WEBHOOK_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/list-keys.md b/app/sdks/go/docs/examples/Projects/list-keys.md deleted file mode 100644 index cd405846b3..0000000000 --- a/app/sdks/go/docs/examples/Projects/list-keys.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## ListKeys - -```go - package appwrite-listkeys - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListKeys method and handle results - var res, err := srv.ListKeys("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/list-platforms.md b/app/sdks/go/docs/examples/Projects/list-platforms.md deleted file mode 100644 index c0aa3adda9..0000000000 --- a/app/sdks/go/docs/examples/Projects/list-platforms.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## ListPlatforms - -```go - package appwrite-listplatforms - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListPlatforms method and handle results - var res, err := srv.ListPlatforms("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/list-projects.md b/app/sdks/go/docs/examples/Projects/list-projects.md deleted file mode 100644 index 14c283306d..0000000000 --- a/app/sdks/go/docs/examples/Projects/list-projects.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## ListProjects - -```go - package appwrite-listprojects - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListProjects method and handle results - var res, err := srv.ListProjects() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/list-tasks.md b/app/sdks/go/docs/examples/Projects/list-tasks.md deleted file mode 100644 index 37dd64fa1a..0000000000 --- a/app/sdks/go/docs/examples/Projects/list-tasks.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## ListTasks - -```go - package appwrite-listtasks - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListTasks method and handle results - var res, err := srv.ListTasks("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/list-webhooks.md b/app/sdks/go/docs/examples/Projects/list-webhooks.md deleted file mode 100644 index 2e277cc6d6..0000000000 --- a/app/sdks/go/docs/examples/Projects/list-webhooks.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## ListWebhooks - -```go - package appwrite-listwebhooks - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call ListWebhooks method and handle results - var res, err := srv.ListWebhooks("[PROJECT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/update-key.md b/app/sdks/go/docs/examples/Projects/update-key.md deleted file mode 100644 index 7a34cfd090..0000000000 --- a/app/sdks/go/docs/examples/Projects/update-key.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## UpdateKey - -```go - package appwrite-updatekey - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateKey method and handle results - var res, err := srv.UpdateKey("[PROJECT_ID]", "[KEY_ID]", "[NAME]", []) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/update-platform.md b/app/sdks/go/docs/examples/Projects/update-platform.md deleted file mode 100644 index d85b5b04d6..0000000000 --- a/app/sdks/go/docs/examples/Projects/update-platform.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## UpdatePlatform - -```go - package appwrite-updateplatform - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdatePlatform method and handle results - var res, err := srv.UpdatePlatform("[PROJECT_ID]", "[PLATFORM_ID]", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/update-project-o-auth.md b/app/sdks/go/docs/examples/Projects/update-project-o-auth.md deleted file mode 100644 index a402bed516..0000000000 --- a/app/sdks/go/docs/examples/Projects/update-project-o-auth.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## UpdateProjectOAuth - -```go - package appwrite-updateprojectoauth - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateProjectOAuth method and handle results - var res, err := srv.UpdateProjectOAuth("[PROJECT_ID]", "bitbucket") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/update-project.md b/app/sdks/go/docs/examples/Projects/update-project.md deleted file mode 100644 index b4f8e90090..0000000000 --- a/app/sdks/go/docs/examples/Projects/update-project.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## UpdateProject - -```go - package appwrite-updateproject - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateProject method and handle results - var res, err := srv.UpdateProject("[PROJECT_ID]", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/update-task.md b/app/sdks/go/docs/examples/Projects/update-task.md deleted file mode 100644 index 31ca901e94..0000000000 --- a/app/sdks/go/docs/examples/Projects/update-task.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## UpdateTask - -```go - package appwrite-updatetask - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateTask method and handle results - var res, err := srv.UpdateTask("[PROJECT_ID]", "[TASK_ID]", "[NAME]", "play", "", 0, "GET", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Projects/update-webhook.md b/app/sdks/go/docs/examples/Projects/update-webhook.md deleted file mode 100644 index fde81679cc..0000000000 --- a/app/sdks/go/docs/examples/Projects/update-webhook.md +++ /dev/null @@ -1,34 +0,0 @@ -# Projects Examples - -## UpdateWebhook - -```go - package appwrite-updatewebhook - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - - // Create a new Projects service passing Client - var srv := appwrite.Projects{ - client: &clt - } - - // Call UpdateWebhook method and handle results - var res, err := srv.UpdateWebhook("[PROJECT_ID]", "[WEBHOOK_ID]", "[NAME]", [], "[URL]", 0) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/CreateFile.md b/app/sdks/go/docs/examples/Storage/CreateFile.md deleted file mode 100644 index 2b33879f54..0000000000 --- a/app/sdks/go/docs/examples/Storage/CreateFile.md +++ /dev/null @@ -1,35 +0,0 @@ -# Storage Examples - -## CreateFile - -```go - package appwrite-createfile - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call CreateFile method and handle results - var res, err := srv.CreateFile(file) - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/DeleteFile.md b/app/sdks/go/docs/examples/Storage/DeleteFile.md deleted file mode 100644 index c6ecabdf99..0000000000 --- a/app/sdks/go/docs/examples/Storage/DeleteFile.md +++ /dev/null @@ -1,35 +0,0 @@ -# Storage Examples - -## DeleteFile - -```go - package appwrite-deletefile - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call DeleteFile method and handle results - var res, err := srv.DeleteFile("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/GetFile.md b/app/sdks/go/docs/examples/Storage/GetFile.md deleted file mode 100644 index 0e7bff0952..0000000000 --- a/app/sdks/go/docs/examples/Storage/GetFile.md +++ /dev/null @@ -1,35 +0,0 @@ -# Storage Examples - -## GetFile - -```go - package appwrite-getfile - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call GetFile method and handle results - var res, err := srv.GetFile("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/GetFileDownload.md b/app/sdks/go/docs/examples/Storage/GetFileDownload.md deleted file mode 100644 index 4513337425..0000000000 --- a/app/sdks/go/docs/examples/Storage/GetFileDownload.md +++ /dev/null @@ -1,35 +0,0 @@ -# Storage Examples - -## GetFileDownload - -```go - package appwrite-getfiledownload - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call GetFileDownload method and handle results - var res, err := srv.GetFileDownload("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/GetFilePreview.md b/app/sdks/go/docs/examples/Storage/GetFilePreview.md deleted file mode 100644 index a30a271d93..0000000000 --- a/app/sdks/go/docs/examples/Storage/GetFilePreview.md +++ /dev/null @@ -1,35 +0,0 @@ -# Storage Examples - -## GetFilePreview - -```go - package appwrite-getfilepreview - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call GetFilePreview method and handle results - var res, err := srv.GetFilePreview("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/GetFileView.md b/app/sdks/go/docs/examples/Storage/GetFileView.md deleted file mode 100644 index 7782cb3b1e..0000000000 --- a/app/sdks/go/docs/examples/Storage/GetFileView.md +++ /dev/null @@ -1,35 +0,0 @@ -# Storage Examples - -## GetFileView - -```go - package appwrite-getfileview - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call GetFileView method and handle results - var res, err := srv.GetFileView("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/ListFiles.md b/app/sdks/go/docs/examples/Storage/ListFiles.md deleted file mode 100644 index 7c5d800f6e..0000000000 --- a/app/sdks/go/docs/examples/Storage/ListFiles.md +++ /dev/null @@ -1,35 +0,0 @@ -# Storage Examples - -## ListFiles - -```go - package appwrite-listfiles - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call ListFiles method and handle results - var res, err := srv.ListFiles() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/UpdateFile.md b/app/sdks/go/docs/examples/Storage/UpdateFile.md deleted file mode 100644 index 157d44b7a4..0000000000 --- a/app/sdks/go/docs/examples/Storage/UpdateFile.md +++ /dev/null @@ -1,35 +0,0 @@ -# Storage Examples - -## UpdateFile - -```go - package appwrite-updatefile - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call UpdateFile method and handle results - var res, err := srv.UpdateFile("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/create-file.md b/app/sdks/go/docs/examples/Storage/create-file.md index 72f5ca8da9..1d0bf35af8 100644 --- a/app/sdks/go/docs/examples/Storage/create-file.md +++ b/app/sdks/go/docs/examples/Storage/create-file.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/delete-file.md b/app/sdks/go/docs/examples/Storage/delete-file.md index 420814abb0..c6ecabdf99 100644 --- a/app/sdks/go/docs/examples/Storage/delete-file.md +++ b/app/sdks/go/docs/examples/Storage/delete-file.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/get-file-download.md b/app/sdks/go/docs/examples/Storage/get-file-download.md index 8c90942705..4513337425 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-download.md +++ b/app/sdks/go/docs/examples/Storage/get-file-download.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/get-file-preview.md b/app/sdks/go/docs/examples/Storage/get-file-preview.md index 4c24617095..a30a271d93 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-preview.md +++ b/app/sdks/go/docs/examples/Storage/get-file-preview.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/get-file-view.md b/app/sdks/go/docs/examples/Storage/get-file-view.md index 712ab69ab3..7782cb3b1e 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-view.md +++ b/app/sdks/go/docs/examples/Storage/get-file-view.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/get-file.md b/app/sdks/go/docs/examples/Storage/get-file.md index fccfbbc793..0e7bff0952 100644 --- a/app/sdks/go/docs/examples/Storage/get-file.md +++ b/app/sdks/go/docs/examples/Storage/get-file.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/list-files.md b/app/sdks/go/docs/examples/Storage/list-files.md index e8058befc5..7c5d800f6e 100644 --- a/app/sdks/go/docs/examples/Storage/list-files.md +++ b/app/sdks/go/docs/examples/Storage/list-files.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Storage/update-file.md b/app/sdks/go/docs/examples/Storage/update-file.md index bf73435ca6..01b44bc620 100644 --- a/app/sdks/go/docs/examples/Storage/update-file.md +++ b/app/sdks/go/docs/examples/Storage/update-file.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Storage service passing Client var srv := appwrite.Storage{ diff --git a/app/sdks/go/docs/examples/Teams/CreateTeam.md b/app/sdks/go/docs/examples/Teams/CreateTeam.md deleted file mode 100644 index 7922f904f8..0000000000 --- a/app/sdks/go/docs/examples/Teams/CreateTeam.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## CreateTeam - -```go - package appwrite-createteam - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call CreateTeam method and handle results - var res, err := srv.CreateTeam("[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/CreateTeamMembership.md b/app/sdks/go/docs/examples/Teams/CreateTeamMembership.md deleted file mode 100644 index 9d74105ec5..0000000000 --- a/app/sdks/go/docs/examples/Teams/CreateTeamMembership.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## CreateTeamMembership - -```go - package appwrite-createteammembership - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call CreateTeamMembership method and handle results - var res, err := srv.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/CreateTeamMembershipResend.md b/app/sdks/go/docs/examples/Teams/CreateTeamMembershipResend.md deleted file mode 100644 index 9925df6e95..0000000000 --- a/app/sdks/go/docs/examples/Teams/CreateTeamMembershipResend.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## CreateTeamMembershipResend - -```go - package appwrite-createteammembershipresend - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call CreateTeamMembershipResend method and handle results - var res, err := srv.CreateTeamMembershipResend("[TEAM_ID]", "[INVITE_ID]", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/DeleteTeam.md b/app/sdks/go/docs/examples/Teams/DeleteTeam.md deleted file mode 100644 index fa15cce6d6..0000000000 --- a/app/sdks/go/docs/examples/Teams/DeleteTeam.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## DeleteTeam - -```go - package appwrite-deleteteam - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call DeleteTeam method and handle results - var res, err := srv.DeleteTeam("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/DeleteTeamMembership.md b/app/sdks/go/docs/examples/Teams/DeleteTeamMembership.md deleted file mode 100644 index 80cdc936b0..0000000000 --- a/app/sdks/go/docs/examples/Teams/DeleteTeamMembership.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## DeleteTeamMembership - -```go - package appwrite-deleteteammembership - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call DeleteTeamMembership method and handle results - var res, err := srv.DeleteTeamMembership("[TEAM_ID]", "[INVITE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/GetTeam.md b/app/sdks/go/docs/examples/Teams/GetTeam.md deleted file mode 100644 index 8418da4d14..0000000000 --- a/app/sdks/go/docs/examples/Teams/GetTeam.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## GetTeam - -```go - package appwrite-getteam - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call GetTeam method and handle results - var res, err := srv.GetTeam("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/GetTeamMembers.md b/app/sdks/go/docs/examples/Teams/GetTeamMembers.md deleted file mode 100644 index 35dd4aa047..0000000000 --- a/app/sdks/go/docs/examples/Teams/GetTeamMembers.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## GetTeamMembers - -```go - package appwrite-getteammembers - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call GetTeamMembers method and handle results - var res, err := srv.GetTeamMembers("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/ListTeams.md b/app/sdks/go/docs/examples/Teams/ListTeams.md deleted file mode 100644 index 089daf4697..0000000000 --- a/app/sdks/go/docs/examples/Teams/ListTeams.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## ListTeams - -```go - package appwrite-listteams - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call ListTeams method and handle results - var res, err := srv.ListTeams() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/UpdateTeam.md b/app/sdks/go/docs/examples/Teams/UpdateTeam.md deleted file mode 100644 index d32a67800a..0000000000 --- a/app/sdks/go/docs/examples/Teams/UpdateTeam.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## UpdateTeam - -```go - package appwrite-updateteam - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call UpdateTeam method and handle results - var res, err := srv.UpdateTeam("[TEAM_ID]", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/UpdateTeamMembershipStatus.md b/app/sdks/go/docs/examples/Teams/UpdateTeamMembershipStatus.md deleted file mode 100644 index 7d4346d2a3..0000000000 --- a/app/sdks/go/docs/examples/Teams/UpdateTeamMembershipStatus.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## UpdateTeamMembershipStatus - -```go - package appwrite-updateteammembershipstatus - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call UpdateTeamMembershipStatus method and handle results - var res, err := srv.UpdateTeamMembershipStatus("[TEAM_ID]", "[INVITE_ID]", "[USER_ID]", "[SECRET]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/create-team-membership-resend.md b/app/sdks/go/docs/examples/Teams/create-team-membership-resend.md deleted file mode 100644 index 9925df6e95..0000000000 --- a/app/sdks/go/docs/examples/Teams/create-team-membership-resend.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## CreateTeamMembershipResend - -```go - package appwrite-createteammembershipresend - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call CreateTeamMembershipResend method and handle results - var res, err := srv.CreateTeamMembershipResend("[TEAM_ID]", "[INVITE_ID]", "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/create-team-membership.md b/app/sdks/go/docs/examples/Teams/create-team-membership.md index 5b9b53494a..9d74105ec5 100644 --- a/app/sdks/go/docs/examples/Teams/create-team-membership.md +++ b/app/sdks/go/docs/examples/Teams/create-team-membership.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/create-team.md b/app/sdks/go/docs/examples/Teams/create-team.md index 79c8fa0daf..7922f904f8 100644 --- a/app/sdks/go/docs/examples/Teams/create-team.md +++ b/app/sdks/go/docs/examples/Teams/create-team.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/delete-team-membership.md b/app/sdks/go/docs/examples/Teams/delete-team-membership.md index 5f545111dd..80cdc936b0 100644 --- a/app/sdks/go/docs/examples/Teams/delete-team-membership.md +++ b/app/sdks/go/docs/examples/Teams/delete-team-membership.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/delete-team.md b/app/sdks/go/docs/examples/Teams/delete-team.md index 34f5dac131..fa15cce6d6 100644 --- a/app/sdks/go/docs/examples/Teams/delete-team.md +++ b/app/sdks/go/docs/examples/Teams/delete-team.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/get-team-members.md b/app/sdks/go/docs/examples/Teams/get-team-members.md deleted file mode 100644 index 35dd4aa047..0000000000 --- a/app/sdks/go/docs/examples/Teams/get-team-members.md +++ /dev/null @@ -1,35 +0,0 @@ -# Teams Examples - -## GetTeamMembers - -```go - package appwrite-getteammembers - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call GetTeamMembers method and handle results - var res, err := srv.GetTeamMembers("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/get-team-memberships.md b/app/sdks/go/docs/examples/Teams/get-team-memberships.md index ab17cdcd08..b945ec493e 100644 --- a/app/sdks/go/docs/examples/Teams/get-team-memberships.md +++ b/app/sdks/go/docs/examples/Teams/get-team-memberships.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/get-team.md b/app/sdks/go/docs/examples/Teams/get-team.md index ed75792881..8418da4d14 100644 --- a/app/sdks/go/docs/examples/Teams/get-team.md +++ b/app/sdks/go/docs/examples/Teams/get-team.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/list-teams.md b/app/sdks/go/docs/examples/Teams/list-teams.md index 8a132ef97e..089daf4697 100644 --- a/app/sdks/go/docs/examples/Teams/list-teams.md +++ b/app/sdks/go/docs/examples/Teams/list-teams.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Teams/update-team-membership-status.md b/app/sdks/go/docs/examples/Teams/update-team-membership-status.md deleted file mode 100644 index effb5eed67..0000000000 --- a/app/sdks/go/docs/examples/Teams/update-team-membership-status.md +++ /dev/null @@ -1,33 +0,0 @@ -# Teams Examples - -## UpdateTeamMembershipStatus - -```go - package appwrite-updateteammembershipstatus - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call UpdateTeamMembershipStatus method and handle results - var res, err := srv.UpdateTeamMembershipStatus("[TEAM_ID]", "[INVITE_ID]", "[USER_ID]", "[SECRET]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/update-team.md b/app/sdks/go/docs/examples/Teams/update-team.md index 4635d3068e..d32a67800a 100644 --- a/app/sdks/go/docs/examples/Teams/update-team.md +++ b/app/sdks/go/docs/examples/Teams/update-team.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Teams service passing Client var srv := appwrite.Teams{ diff --git a/app/sdks/go/docs/examples/Users/CreateUser.md b/app/sdks/go/docs/examples/Users/CreateUser.md deleted file mode 100644 index b790840277..0000000000 --- a/app/sdks/go/docs/examples/Users/CreateUser.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## CreateUser - -```go - package appwrite-createuser - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call CreateUser method and handle results - var res, err := srv.CreateUser("email@example.com", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/DeleteUserSession.md b/app/sdks/go/docs/examples/Users/DeleteUserSession.md deleted file mode 100644 index 6bc880b88a..0000000000 --- a/app/sdks/go/docs/examples/Users/DeleteUserSession.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## DeleteUserSession - -```go - package appwrite-deleteusersession - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call DeleteUserSession method and handle results - var res, err := srv.DeleteUserSession("[USER_ID]", "[SESSION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/DeleteUserSessions.md b/app/sdks/go/docs/examples/Users/DeleteUserSessions.md deleted file mode 100644 index 8d36d951d5..0000000000 --- a/app/sdks/go/docs/examples/Users/DeleteUserSessions.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## DeleteUserSessions - -```go - package appwrite-deleteusersessions - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call DeleteUserSessions method and handle results - var res, err := srv.DeleteUserSessions("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/GetUser.md b/app/sdks/go/docs/examples/Users/GetUser.md deleted file mode 100644 index d61430718b..0000000000 --- a/app/sdks/go/docs/examples/Users/GetUser.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## GetUser - -```go - package appwrite-getuser - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call GetUser method and handle results - var res, err := srv.GetUser("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/GetUserLogs.md b/app/sdks/go/docs/examples/Users/GetUserLogs.md deleted file mode 100644 index 227d123413..0000000000 --- a/app/sdks/go/docs/examples/Users/GetUserLogs.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## GetUserLogs - -```go - package appwrite-getuserlogs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call GetUserLogs method and handle results - var res, err := srv.GetUserLogs("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/GetUserPrefs.md b/app/sdks/go/docs/examples/Users/GetUserPrefs.md deleted file mode 100644 index fc9515a4af..0000000000 --- a/app/sdks/go/docs/examples/Users/GetUserPrefs.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## GetUserPrefs - -```go - package appwrite-getuserprefs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call GetUserPrefs method and handle results - var res, err := srv.GetUserPrefs("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/GetUserSessions.md b/app/sdks/go/docs/examples/Users/GetUserSessions.md deleted file mode 100644 index 99dd8b3fff..0000000000 --- a/app/sdks/go/docs/examples/Users/GetUserSessions.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## GetUserSessions - -```go - package appwrite-getusersessions - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call GetUserSessions method and handle results - var res, err := srv.GetUserSessions("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/ListUsers.md b/app/sdks/go/docs/examples/Users/ListUsers.md deleted file mode 100644 index 8332347ba8..0000000000 --- a/app/sdks/go/docs/examples/Users/ListUsers.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## ListUsers - -```go - package appwrite-listusers - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call ListUsers method and handle results - var res, err := srv.ListUsers() - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/UpdateUserPrefs.md b/app/sdks/go/docs/examples/Users/UpdateUserPrefs.md deleted file mode 100644 index 50614f238e..0000000000 --- a/app/sdks/go/docs/examples/Users/UpdateUserPrefs.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## UpdateUserPrefs - -```go - package appwrite-updateuserprefs - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call UpdateUserPrefs method and handle results - var res, err := srv.UpdateUserPrefs("[USER_ID]", "{}") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/UpdateUserStatus.md b/app/sdks/go/docs/examples/Users/UpdateUserStatus.md deleted file mode 100644 index d5570ca041..0000000000 --- a/app/sdks/go/docs/examples/Users/UpdateUserStatus.md +++ /dev/null @@ -1,35 +0,0 @@ -# Users Examples - -## UpdateUserStatus - -```go - package appwrite-updateuserstatus - - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) - - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call UpdateUserStatus method and handle results - var res, err := srv.UpdateUserStatus("[USER_ID]", "1") - if err != nil { - panic(err) - } - - fmt.Println(res) - } -``` \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/create-user.md b/app/sdks/go/docs/examples/Users/create-user.md index 17b770577f..b790840277 100644 --- a/app/sdks/go/docs/examples/Users/create-user.md +++ b/app/sdks/go/docs/examples/Users/create-user.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/delete-user-session.md b/app/sdks/go/docs/examples/Users/delete-user-session.md index c583cf1ea1..6bc880b88a 100644 --- a/app/sdks/go/docs/examples/Users/delete-user-session.md +++ b/app/sdks/go/docs/examples/Users/delete-user-session.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/delete-user-sessions.md b/app/sdks/go/docs/examples/Users/delete-user-sessions.md index 61e0d255b2..8d36d951d5 100644 --- a/app/sdks/go/docs/examples/Users/delete-user-sessions.md +++ b/app/sdks/go/docs/examples/Users/delete-user-sessions.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/get-user-logs.md b/app/sdks/go/docs/examples/Users/get-user-logs.md index 02c484f58f..227d123413 100644 --- a/app/sdks/go/docs/examples/Users/get-user-logs.md +++ b/app/sdks/go/docs/examples/Users/get-user-logs.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/get-user-prefs.md b/app/sdks/go/docs/examples/Users/get-user-prefs.md index fb94dc1f1c..fc9515a4af 100644 --- a/app/sdks/go/docs/examples/Users/get-user-prefs.md +++ b/app/sdks/go/docs/examples/Users/get-user-prefs.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/get-user-sessions.md b/app/sdks/go/docs/examples/Users/get-user-sessions.md index c5c6deb9c8..99dd8b3fff 100644 --- a/app/sdks/go/docs/examples/Users/get-user-sessions.md +++ b/app/sdks/go/docs/examples/Users/get-user-sessions.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/get-user.md b/app/sdks/go/docs/examples/Users/get-user.md index 0d3fbc760c..d61430718b 100644 --- a/app/sdks/go/docs/examples/Users/get-user.md +++ b/app/sdks/go/docs/examples/Users/get-user.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/list-users.md b/app/sdks/go/docs/examples/Users/list-users.md index 71fc3c0bfc..8332347ba8 100644 --- a/app/sdks/go/docs/examples/Users/list-users.md +++ b/app/sdks/go/docs/examples/Users/list-users.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/update-user-prefs.md b/app/sdks/go/docs/examples/Users/update-user-prefs.md index 2315287fbb..e48384abbf 100644 --- a/app/sdks/go/docs/examples/Users/update-user-prefs.md +++ b/app/sdks/go/docs/examples/Users/update-user-prefs.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/docs/examples/Users/update-user-status.md b/app/sdks/go/docs/examples/Users/update-user-status.md index 23ea9afc1c..d5570ca041 100644 --- a/app/sdks/go/docs/examples/Users/update-user-status.md +++ b/app/sdks/go/docs/examples/Users/update-user-status.md @@ -17,6 +17,7 @@ // Set Client required headers clt.SetProject("") + clt.SetKey("") // Create a new Users service passing Client var srv := appwrite.Users{ diff --git a/app/sdks/go/projects.go b/app/sdks/go/projects.go deleted file mode 100644 index d3a425a52c..0000000000 --- a/app/sdks/go/projects.go +++ /dev/null @@ -1,372 +0,0 @@ -package appwrite - -import ( - "strings" -) - -// Projects service -type Projects struct { - client *Client -} - -// ListProjects -func (srv *Projects) ListProjects() (map[string]interface{}, error) { - path := "/projects" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateProject -func (srv *Projects) CreateProject(Name string, TeamId string, Description string, Logo string, Url string, LegalName string, LegalCountry string, LegalState string, LegalCity string, LegalAddress string, LegalTaxId string) (map[string]interface{}, error) { - path := "/projects" - - params := map[string]interface{}{ - "name": Name, - "teamId": TeamId, - "description": Description, - "logo": Logo, - "url": Url, - "legalName": LegalName, - "legalCountry": LegalCountry, - "legalState": LegalState, - "legalCity": LegalCity, - "legalAddress": LegalAddress, - "legalTaxId": LegalTaxId, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetProject -func (srv *Projects) GetProject(ProjectId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateProject -func (srv *Projects) UpdateProject(ProjectId string, Name string, Description string, Logo string, Url string, LegalName string, LegalCountry string, LegalState string, LegalCity string, LegalAddress string, LegalTaxId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}") - - params := map[string]interface{}{ - "name": Name, - "description": Description, - "logo": Logo, - "url": Url, - "legalName": LegalName, - "legalCountry": LegalCountry, - "legalState": LegalState, - "legalCity": LegalCity, - "legalAddress": LegalAddress, - "legalTaxId": LegalTaxId, - } - - return srv.client.Call("PATCH", path, nil, params) -} - -// DeleteProject -func (srv *Projects) DeleteProject(ProjectId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// ListKeys -func (srv *Projects) ListKeys(ProjectId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/keys") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateKey -func (srv *Projects) CreateKey(ProjectId string, Name string, Scopes []interface{}) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/keys") - - params := map[string]interface{}{ - "name": Name, - "scopes": Scopes, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetKey -func (srv *Projects) GetKey(ProjectId string, KeyId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{keyId}", KeyId) - path := r.Replace("/projects/{projectId}/keys/{keyId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateKey -func (srv *Projects) UpdateKey(ProjectId string, KeyId string, Name string, Scopes []interface{}) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{keyId}", KeyId) - path := r.Replace("/projects/{projectId}/keys/{keyId}") - - params := map[string]interface{}{ - "name": Name, - "scopes": Scopes, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// DeleteKey -func (srv *Projects) DeleteKey(ProjectId string, KeyId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{keyId}", KeyId) - path := r.Replace("/projects/{projectId}/keys/{keyId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// UpdateProjectOAuth -func (srv *Projects) UpdateProjectOAuth(ProjectId string, Provider string, AppId string, Secret string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/oauth") - - params := map[string]interface{}{ - "provider": Provider, - "appId": AppId, - "secret": Secret, - } - - return srv.client.Call("PATCH", path, nil, params) -} - -// ListPlatforms -func (srv *Projects) ListPlatforms(ProjectId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/platforms") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreatePlatform -func (srv *Projects) CreatePlatform(ProjectId string, Type string, Name string, Key string, Store string, Url string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/platforms") - - params := map[string]interface{}{ - "type": Type, - "name": Name, - "key": Key, - "store": Store, - "url": Url, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetPlatform -func (srv *Projects) GetPlatform(ProjectId string, PlatformId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{platformId}", PlatformId) - path := r.Replace("/projects/{projectId}/platforms/{platformId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdatePlatform -func (srv *Projects) UpdatePlatform(ProjectId string, PlatformId string, Name string, Key string, Store string, Url string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{platformId}", PlatformId) - path := r.Replace("/projects/{projectId}/platforms/{platformId}") - - params := map[string]interface{}{ - "name": Name, - "key": Key, - "store": Store, - "url": Url, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// DeletePlatform -func (srv *Projects) DeletePlatform(ProjectId string, PlatformId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{platformId}", PlatformId) - path := r.Replace("/projects/{projectId}/platforms/{platformId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// ListTasks -func (srv *Projects) ListTasks(ProjectId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/tasks") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateTask -func (srv *Projects) CreateTask(ProjectId string, Name string, Status string, Schedule string, Security int, HttpMethod string, HttpUrl string, HttpHeaders []interface{}, HttpUser string, HttpPass string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/tasks") - - params := map[string]interface{}{ - "name": Name, - "status": Status, - "schedule": Schedule, - "security": Security, - "httpMethod": HttpMethod, - "httpUrl": HttpUrl, - "httpHeaders": HttpHeaders, - "httpUser": HttpUser, - "httpPass": HttpPass, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetTask -func (srv *Projects) GetTask(ProjectId string, TaskId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{taskId}", TaskId) - path := r.Replace("/projects/{projectId}/tasks/{taskId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateTask -func (srv *Projects) UpdateTask(ProjectId string, TaskId string, Name string, Status string, Schedule string, Security int, HttpMethod string, HttpUrl string, HttpHeaders []interface{}, HttpUser string, HttpPass string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{taskId}", TaskId) - path := r.Replace("/projects/{projectId}/tasks/{taskId}") - - params := map[string]interface{}{ - "name": Name, - "status": Status, - "schedule": Schedule, - "security": Security, - "httpMethod": HttpMethod, - "httpUrl": HttpUrl, - "httpHeaders": HttpHeaders, - "httpUser": HttpUser, - "httpPass": HttpPass, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// DeleteTask -func (srv *Projects) DeleteTask(ProjectId string, TaskId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{taskId}", TaskId) - path := r.Replace("/projects/{projectId}/tasks/{taskId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// GetProjectUsage -func (srv *Projects) GetProjectUsage(ProjectId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/usage") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// ListWebhooks -func (srv *Projects) ListWebhooks(ProjectId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/webhooks") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateWebhook -func (srv *Projects) CreateWebhook(ProjectId string, Name string, Events []interface{}, Url string, Security int, HttpUser string, HttpPass string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId) - path := r.Replace("/projects/{projectId}/webhooks") - - params := map[string]interface{}{ - "name": Name, - "events": Events, - "url": Url, - "security": Security, - "httpUser": HttpUser, - "httpPass": HttpPass, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetWebhook -func (srv *Projects) GetWebhook(ProjectId string, WebhookId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{webhookId}", WebhookId) - path := r.Replace("/projects/{projectId}/webhooks/{webhookId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateWebhook -func (srv *Projects) UpdateWebhook(ProjectId string, WebhookId string, Name string, Events []interface{}, Url string, Security int, HttpUser string, HttpPass string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{webhookId}", WebhookId) - path := r.Replace("/projects/{projectId}/webhooks/{webhookId}") - - params := map[string]interface{}{ - "name": Name, - "events": Events, - "url": Url, - "security": Security, - "httpUser": HttpUser, - "httpPass": HttpPass, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// DeleteWebhook -func (srv *Projects) DeleteWebhook(ProjectId string, WebhookId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{projectId}", ProjectId, "{webhookId}", WebhookId) - path := r.Replace("/projects/{projectId}/webhooks/{webhookId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index 996d9ed4bc..925275f733 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -130,30 +130,3 @@ func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[stri return srv.client.Call("DELETE", path, nil, params) } - -// UpdateTeamMembershipStatus use this endpoint to let user accept an -// invitation to join a team after he is being redirect back to your app from -// the invitation email. Use the success and failure URL's to redirect users -// back to your application after the request completes. -// -// Please note that in order to avoid a [Redirect -// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URL's are the once from domains you have set when -// added your platforms in the console interface. -// -// When not using the success or failure redirect arguments this endpoint will -// result with a 200 status code on success and with 401 status error on -// failure. This behavior was applied to help the web clients deal with -// browsers who don't allow to set 3rd party HTTP cookies needed for saving -// the account session key. -func (srv *Teams) UpdateTeamMembershipStatus(TeamId string, InviteId string, UserId string, Secret string) (map[string]interface{}, error) { - r := strings.NewReplacer("{teamId}", TeamId, "{inviteId}", InviteId) - path := r.Replace("/teams/{teamId}/memberships/{inviteId}/status") - - params := map[string]interface{}{ - "userId": UserId, - "secret": Secret, - } - - return srv.client.Call("PATCH", path, nil, params) -} diff --git a/app/sdks/javascript/docs/examples/account/create-account-verification.md b/app/sdks/javascript/docs/examples/account/create-account-verification.md deleted file mode 100644 index 1f3191732e..0000000000 --- a/app/sdks/javascript/docs/examples/account/create-account-verification.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.createAccountVerification('https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-key.md b/app/sdks/javascript/docs/examples/projects/create-key.md deleted file mode 100644 index 3c12c8a8c2..0000000000 --- a/app/sdks/javascript/docs/examples/projects/create-key.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createKey('[PROJECT_ID]', '[NAME]', []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-platform.md b/app/sdks/javascript/docs/examples/projects/create-platform.md deleted file mode 100644 index b67b84ba56..0000000000 --- a/app/sdks/javascript/docs/examples/projects/create-platform.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createPlatform('[PROJECT_ID]', 'web', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-project.md b/app/sdks/javascript/docs/examples/projects/create-project.md deleted file mode 100644 index a1b6922fed..0000000000 --- a/app/sdks/javascript/docs/examples/projects/create-project.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createProject('[NAME]', '[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-task.md b/app/sdks/javascript/docs/examples/projects/create-task.md deleted file mode 100644 index 3262b4d9fe..0000000000 --- a/app/sdks/javascript/docs/examples/projects/create-task.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/create-webhook.md b/app/sdks/javascript/docs/examples/projects/create-webhook.md deleted file mode 100644 index 66a76c26c2..0000000000 --- a/app/sdks/javascript/docs/examples/projects/create-webhook.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-key.md b/app/sdks/javascript/docs/examples/projects/delete-key.md deleted file mode 100644 index e5ae8e426c..0000000000 --- a/app/sdks/javascript/docs/examples/projects/delete-key.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deleteKey('[PROJECT_ID]', '[KEY_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-platform.md b/app/sdks/javascript/docs/examples/projects/delete-platform.md deleted file mode 100644 index 450f9cd0a6..0000000000 --- a/app/sdks/javascript/docs/examples/projects/delete-platform.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deletePlatform('[PROJECT_ID]', '[PLATFORM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-project.md b/app/sdks/javascript/docs/examples/projects/delete-project.md deleted file mode 100644 index b60d4de3c9..0000000000 --- a/app/sdks/javascript/docs/examples/projects/delete-project.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deleteProject('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-task.md b/app/sdks/javascript/docs/examples/projects/delete-task.md deleted file mode 100644 index 3208d38bf8..0000000000 --- a/app/sdks/javascript/docs/examples/projects/delete-task.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deleteTask('[PROJECT_ID]', '[TASK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/delete-webhook.md b/app/sdks/javascript/docs/examples/projects/delete-webhook.md deleted file mode 100644 index 030a3b77f1..0000000000 --- a/app/sdks/javascript/docs/examples/projects/delete-webhook.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deleteWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-key.md b/app/sdks/javascript/docs/examples/projects/get-key.md deleted file mode 100644 index 7207b33bf7..0000000000 --- a/app/sdks/javascript/docs/examples/projects/get-key.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getKey('[PROJECT_ID]', '[KEY_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-platform.md b/app/sdks/javascript/docs/examples/projects/get-platform.md deleted file mode 100644 index 6f353f3aca..0000000000 --- a/app/sdks/javascript/docs/examples/projects/get-platform.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getPlatform('[PROJECT_ID]', '[PLATFORM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-project-usage.md b/app/sdks/javascript/docs/examples/projects/get-project-usage.md deleted file mode 100644 index 87a2e3148a..0000000000 --- a/app/sdks/javascript/docs/examples/projects/get-project-usage.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getProjectUsage('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-project.md b/app/sdks/javascript/docs/examples/projects/get-project.md deleted file mode 100644 index 084e48c253..0000000000 --- a/app/sdks/javascript/docs/examples/projects/get-project.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getProject('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-task.md b/app/sdks/javascript/docs/examples/projects/get-task.md deleted file mode 100644 index e5195bce8c..0000000000 --- a/app/sdks/javascript/docs/examples/projects/get-task.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getTask('[PROJECT_ID]', '[TASK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/get-webhook.md b/app/sdks/javascript/docs/examples/projects/get-webhook.md deleted file mode 100644 index a2b6089c3e..0000000000 --- a/app/sdks/javascript/docs/examples/projects/get-webhook.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-keys.md b/app/sdks/javascript/docs/examples/projects/list-keys.md deleted file mode 100644 index 14ef64fb6f..0000000000 --- a/app/sdks/javascript/docs/examples/projects/list-keys.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listKeys('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-platforms.md b/app/sdks/javascript/docs/examples/projects/list-platforms.md deleted file mode 100644 index 7cfd9341a7..0000000000 --- a/app/sdks/javascript/docs/examples/projects/list-platforms.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listPlatforms('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-projects.md b/app/sdks/javascript/docs/examples/projects/list-projects.md deleted file mode 100644 index 3ba3afc41e..0000000000 --- a/app/sdks/javascript/docs/examples/projects/list-projects.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listProjects(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-tasks.md b/app/sdks/javascript/docs/examples/projects/list-tasks.md deleted file mode 100644 index fd8ab61ffa..0000000000 --- a/app/sdks/javascript/docs/examples/projects/list-tasks.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listTasks('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/list-webhooks.md b/app/sdks/javascript/docs/examples/projects/list-webhooks.md deleted file mode 100644 index b19851c8b1..0000000000 --- a/app/sdks/javascript/docs/examples/projects/list-webhooks.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listWebhooks('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-key.md b/app/sdks/javascript/docs/examples/projects/update-key.md deleted file mode 100644 index 063f4daea4..0000000000 --- a/app/sdks/javascript/docs/examples/projects/update-key.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateKey('[PROJECT_ID]', '[KEY_ID]', '[NAME]', []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-platform.md b/app/sdks/javascript/docs/examples/projects/update-platform.md deleted file mode 100644 index e28846f050..0000000000 --- a/app/sdks/javascript/docs/examples/projects/update-platform.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updatePlatform('[PROJECT_ID]', '[PLATFORM_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-project-o-auth.md b/app/sdks/javascript/docs/examples/projects/update-project-o-auth.md deleted file mode 100644 index 9ab78a4ea9..0000000000 --- a/app/sdks/javascript/docs/examples/projects/update-project-o-auth.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateProjectOAuth('[PROJECT_ID]', 'bitbucket'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-project.md b/app/sdks/javascript/docs/examples/projects/update-project.md deleted file mode 100644 index 6fcaa49f37..0000000000 --- a/app/sdks/javascript/docs/examples/projects/update-project.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateProject('[PROJECT_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-task.md b/app/sdks/javascript/docs/examples/projects/update-task.md deleted file mode 100644 index 54116a41d0..0000000000 --- a/app/sdks/javascript/docs/examples/projects/update-task.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/projects/update-webhook.md b/app/sdks/javascript/docs/examples/projects/update-webhook.md deleted file mode 100644 index ce876d5a64..0000000000 --- a/app/sdks/javascript/docs/examples/projects/update-webhook.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/create-user.md b/app/sdks/javascript/docs/examples/users/create-user.md deleted file mode 100644 index 1242fe70c2..0000000000 --- a/app/sdks/javascript/docs/examples/users/create-user.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.createUser('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/delete-user-session.md b/app/sdks/javascript/docs/examples/users/delete-user-session.md deleted file mode 100644 index 4b5df53439..0000000000 --- a/app/sdks/javascript/docs/examples/users/delete-user-session.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.deleteUserSession('[USER_ID]', '[SESSION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/delete-user-sessions.md b/app/sdks/javascript/docs/examples/users/delete-user-sessions.md deleted file mode 100644 index 1a6851ce15..0000000000 --- a/app/sdks/javascript/docs/examples/users/delete-user-sessions.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.deleteUserSessions('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/get-user-logs.md b/app/sdks/javascript/docs/examples/users/get-user-logs.md deleted file mode 100644 index 85175b0e1e..0000000000 --- a/app/sdks/javascript/docs/examples/users/get-user-logs.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.getUserLogs('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/get-user-prefs.md b/app/sdks/javascript/docs/examples/users/get-user-prefs.md deleted file mode 100644 index 0d9c8dbb22..0000000000 --- a/app/sdks/javascript/docs/examples/users/get-user-prefs.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.getUserPrefs('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/get-user-sessions.md b/app/sdks/javascript/docs/examples/users/get-user-sessions.md deleted file mode 100644 index 8cc7b1f85b..0000000000 --- a/app/sdks/javascript/docs/examples/users/get-user-sessions.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.getUserSessions('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/get-user.md b/app/sdks/javascript/docs/examples/users/get-user.md deleted file mode 100644 index feb40dff2d..0000000000 --- a/app/sdks/javascript/docs/examples/users/get-user.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.getUser('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/list-users.md b/app/sdks/javascript/docs/examples/users/list-users.md deleted file mode 100644 index 561826cbd1..0000000000 --- a/app/sdks/javascript/docs/examples/users/list-users.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.listUsers(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/update-user-prefs.md b/app/sdks/javascript/docs/examples/users/update-user-prefs.md deleted file mode 100644 index 7c9918cc07..0000000000 --- a/app/sdks/javascript/docs/examples/users/update-user-prefs.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.updateUserPrefs('[USER_ID]', ''); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/users/update-user-status.md b/app/sdks/javascript/docs/examples/users/update-user-status.md deleted file mode 100644 index 15b7376ca7..0000000000 --- a/app/sdks/javascript/docs/examples/users/update-user-status.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.updateUserStatus('[USER_ID]', '1'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/src/sdk.js b/app/sdks/javascript/src/sdk.js index de45c183cc..cd3fe716c4 100644 --- a/app/sdks/javascript/src/sdk.js +++ b/app/sdks/javascript/src/sdk.js @@ -862,46 +862,6 @@ }, payload); }, - /** - * Create Verification - * - * Use this endpoint to send a verification message to your user email address - * to confirm they are the valid owners of that address. Both the **userId** - * and **secret** arguments will be passed as query parameters to the URL you - * have provider to be attached to the verification email. The provided URL - * should redirect the user back for your app and allow you to complete the - * verification process by verifying both the **userId** and **secret** - * parameters. Learn more about how to [complete the verification - * process](/docs/account#updateAccountVerification). - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param {string} url - * @throws {Error} - * @return {Promise} - */ - createAccountVerification: function(url) { - if(url === undefined) { - throw new Error('Missing required parameter: "url"'); - } - - let path = '/account/verification'; - - let payload = {}; - - if(url) { - payload['url'] = url; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - /** * Updated Verification * @@ -1782,1139 +1742,6 @@ } }; - let projects = { - - /** - * List Projects - * - * - * @throws {Error} - * @return {Promise} - */ - listProjects: function() { - let path = '/projects'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Project - * - * - * @param {string} name - * @param {string} teamId - * @param {string} description - * @param {string} logo - * @param {string} url - * @param {string} legalName - * @param {string} legalCountry - * @param {string} legalState - * @param {string} legalCity - * @param {string} legalAddress - * @param {string} legalTaxId - * @throws {Error} - * @return {Promise} - */ - createProject: function(name, teamId, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - let path = '/projects'; - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(teamId) { - payload['teamId'] = teamId; - } - - if(description) { - payload['description'] = description; - } - - if(logo) { - payload['logo'] = logo; - } - - if(url) { - payload['url'] = url; - } - - if(legalName) { - payload['legalName'] = legalName; - } - - if(legalCountry) { - payload['legalCountry'] = legalCountry; - } - - if(legalState) { - payload['legalState'] = legalState; - } - - if(legalCity) { - payload['legalCity'] = legalCity; - } - - if(legalAddress) { - payload['legalAddress'] = legalAddress; - } - - if(legalTaxId) { - payload['legalTaxId'] = legalTaxId; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Project - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - getProject: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Project - * - * - * @param {string} projectId - * @param {string} name - * @param {string} description - * @param {string} logo - * @param {string} url - * @param {string} legalName - * @param {string} legalCountry - * @param {string} legalState - * @param {string} legalCity - * @param {string} legalAddress - * @param {string} legalTaxId - * @throws {Error} - * @return {Promise} - */ - updateProject: function(projectId, name, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(description) { - payload['description'] = description; - } - - if(logo) { - payload['logo'] = logo; - } - - if(url) { - payload['url'] = url; - } - - if(legalName) { - payload['legalName'] = legalName; - } - - if(legalCountry) { - payload['legalCountry'] = legalCountry; - } - - if(legalState) { - payload['legalState'] = legalState; - } - - if(legalCity) { - payload['legalCity'] = legalCity; - } - - if(legalAddress) { - payload['legalAddress'] = legalAddress; - } - - if(legalTaxId) { - payload['legalTaxId'] = legalTaxId; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Project - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - deleteProject: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Keys - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - listKeys: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Key - * - * - * @param {string} projectId - * @param {string} name - * @param {array} scopes - * @throws {Error} - * @return {Promise} - */ - createKey: function(projectId, name, scopes) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(scopes === undefined) { - throw new Error('Missing required parameter: "scopes"'); - } - - let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(scopes) { - payload['scopes'] = scopes; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Key - * - * - * @param {string} projectId - * @param {string} keyId - * @throws {Error} - * @return {Promise} - */ - getKey: function(projectId, keyId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(keyId === undefined) { - throw new Error('Missing required parameter: "keyId"'); - } - - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Key - * - * - * @param {string} projectId - * @param {string} keyId - * @param {string} name - * @param {array} scopes - * @throws {Error} - * @return {Promise} - */ - updateKey: function(projectId, keyId, name, scopes) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(keyId === undefined) { - throw new Error('Missing required parameter: "keyId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(scopes === undefined) { - throw new Error('Missing required parameter: "scopes"'); - } - - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(scopes) { - payload['scopes'] = scopes; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Key - * - * - * @param {string} projectId - * @param {string} keyId - * @throws {Error} - * @return {Promise} - */ - deleteKey: function(projectId, keyId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(keyId === undefined) { - throw new Error('Missing required parameter: "keyId"'); - } - - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Project OAuth - * - * - * @param {string} projectId - * @param {string} provider - * @param {string} appId - * @param {string} secret - * @throws {Error} - * @return {Promise} - */ - updateProjectOAuth: function(projectId, provider, appId = '', secret = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(provider === undefined) { - throw new Error('Missing required parameter: "provider"'); - } - - let path = '/projects/{projectId}/oauth'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(provider) { - payload['provider'] = provider; - } - - if(appId) { - payload['appId'] = appId; - } - - if(secret) { - payload['secret'] = secret; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Platforms - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - listPlatforms: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Platform - * - * - * @param {string} projectId - * @param {string} type - * @param {string} name - * @param {string} key - * @param {string} store - * @param {string} url - * @throws {Error} - * @return {Promise} - */ - createPlatform: function(projectId, type, name, key = '', store = '', url = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(type === undefined) { - throw new Error('Missing required parameter: "type"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(type) { - payload['type'] = type; - } - - if(name) { - payload['name'] = name; - } - - if(key) { - payload['key'] = key; - } - - if(store) { - payload['store'] = store; - } - - if(url) { - payload['url'] = url; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Platform - * - * - * @param {string} projectId - * @param {string} platformId - * @throws {Error} - * @return {Promise} - */ - getPlatform: function(projectId, platformId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(platformId === undefined) { - throw new Error('Missing required parameter: "platformId"'); - } - - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Platform - * - * - * @param {string} projectId - * @param {string} platformId - * @param {string} name - * @param {string} key - * @param {string} store - * @param {string} url - * @throws {Error} - * @return {Promise} - */ - updatePlatform: function(projectId, platformId, name, key = '', store = '', url = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(platformId === undefined) { - throw new Error('Missing required parameter: "platformId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(key) { - payload['key'] = key; - } - - if(store) { - payload['store'] = store; - } - - if(url) { - payload['url'] = url; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Platform - * - * - * @param {string} projectId - * @param {string} platformId - * @throws {Error} - * @return {Promise} - */ - deletePlatform: function(projectId, platformId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(platformId === undefined) { - throw new Error('Missing required parameter: "platformId"'); - } - - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Tasks - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - listTasks: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Task - * - * - * @param {string} projectId - * @param {string} name - * @param {string} status - * @param {string} schedule - * @param {number} security - * @param {string} httpMethod - * @param {string} httpUrl - * @param {array} httpHeaders - * @param {string} httpUser - * @param {string} httpPass - * @throws {Error} - * @return {Promise} - */ - createTask: function(projectId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(status === undefined) { - throw new Error('Missing required parameter: "status"'); - } - - if(schedule === undefined) { - throw new Error('Missing required parameter: "schedule"'); - } - - if(security === undefined) { - throw new Error('Missing required parameter: "security"'); - } - - if(httpMethod === undefined) { - throw new Error('Missing required parameter: "httpMethod"'); - } - - if(httpUrl === undefined) { - throw new Error('Missing required parameter: "httpUrl"'); - } - - let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(status) { - payload['status'] = status; - } - - if(schedule) { - payload['schedule'] = schedule; - } - - if(security) { - payload['security'] = security; - } - - if(httpMethod) { - payload['httpMethod'] = httpMethod; - } - - if(httpUrl) { - payload['httpUrl'] = httpUrl; - } - - if(httpHeaders) { - payload['httpHeaders'] = httpHeaders; - } - - if(httpUser) { - payload['httpUser'] = httpUser; - } - - if(httpPass) { - payload['httpPass'] = httpPass; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Task - * - * - * @param {string} projectId - * @param {string} taskId - * @throws {Error} - * @return {Promise} - */ - getTask: function(projectId, taskId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(taskId === undefined) { - throw new Error('Missing required parameter: "taskId"'); - } - - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Task - * - * - * @param {string} projectId - * @param {string} taskId - * @param {string} name - * @param {string} status - * @param {string} schedule - * @param {number} security - * @param {string} httpMethod - * @param {string} httpUrl - * @param {array} httpHeaders - * @param {string} httpUser - * @param {string} httpPass - * @throws {Error} - * @return {Promise} - */ - updateTask: function(projectId, taskId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(taskId === undefined) { - throw new Error('Missing required parameter: "taskId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(status === undefined) { - throw new Error('Missing required parameter: "status"'); - } - - if(schedule === undefined) { - throw new Error('Missing required parameter: "schedule"'); - } - - if(security === undefined) { - throw new Error('Missing required parameter: "security"'); - } - - if(httpMethod === undefined) { - throw new Error('Missing required parameter: "httpMethod"'); - } - - if(httpUrl === undefined) { - throw new Error('Missing required parameter: "httpUrl"'); - } - - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(status) { - payload['status'] = status; - } - - if(schedule) { - payload['schedule'] = schedule; - } - - if(security) { - payload['security'] = security; - } - - if(httpMethod) { - payload['httpMethod'] = httpMethod; - } - - if(httpUrl) { - payload['httpUrl'] = httpUrl; - } - - if(httpHeaders) { - payload['httpHeaders'] = httpHeaders; - } - - if(httpUser) { - payload['httpUser'] = httpUser; - } - - if(httpPass) { - payload['httpPass'] = httpPass; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Task - * - * - * @param {string} projectId - * @param {string} taskId - * @throws {Error} - * @return {Promise} - */ - deleteTask: function(projectId, taskId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(taskId === undefined) { - throw new Error('Missing required parameter: "taskId"'); - } - - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Project - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - getProjectUsage: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/usage'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Webhooks - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - listWebhooks: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Webhook - * - * - * @param {string} projectId - * @param {string} name - * @param {array} events - * @param {string} url - * @param {number} security - * @param {string} httpUser - * @param {string} httpPass - * @throws {Error} - * @return {Promise} - */ - createWebhook: function(projectId, name, events, url, security, httpUser = '', httpPass = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(events === undefined) { - throw new Error('Missing required parameter: "events"'); - } - - if(url === undefined) { - throw new Error('Missing required parameter: "url"'); - } - - if(security === undefined) { - throw new Error('Missing required parameter: "security"'); - } - - let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(events) { - payload['events'] = events; - } - - if(url) { - payload['url'] = url; - } - - if(security) { - payload['security'] = security; - } - - if(httpUser) { - payload['httpUser'] = httpUser; - } - - if(httpPass) { - payload['httpPass'] = httpPass; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Webhook - * - * - * @param {string} projectId - * @param {string} webhookId - * @throws {Error} - * @return {Promise} - */ - getWebhook: function(projectId, webhookId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(webhookId === undefined) { - throw new Error('Missing required parameter: "webhookId"'); - } - - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Webhook - * - * - * @param {string} projectId - * @param {string} webhookId - * @param {string} name - * @param {array} events - * @param {string} url - * @param {number} security - * @param {string} httpUser - * @param {string} httpPass - * @throws {Error} - * @return {Promise} - */ - updateWebhook: function(projectId, webhookId, name, events, url, security, httpUser = '', httpPass = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(webhookId === undefined) { - throw new Error('Missing required parameter: "webhookId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(events === undefined) { - throw new Error('Missing required parameter: "events"'); - } - - if(url === undefined) { - throw new Error('Missing required parameter: "url"'); - } - - if(security === undefined) { - throw new Error('Missing required parameter: "security"'); - } - - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(events) { - payload['events'] = events; - } - - if(url) { - payload['url'] = url; - } - - if(security) { - payload['security'] = security; - } - - if(httpUser) { - payload['httpUser'] = httpUser; - } - - if(httpPass) { - payload['httpPass'] = httpPass; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Webhook - * - * - * @param {string} projectId - * @param {string} webhookId - * @throws {Error} - * @return {Promise} - */ - deleteWebhook: function(projectId, webhookId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(webhookId === undefined) { - throw new Error('Missing required parameter: "webhookId"'); - } - - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - } - }; - let storage = { /** @@ -3556,311 +2383,6 @@ } }; - let users = { - - /** - * List Users - * - * Get a list of all the project users. You can use the query params to filter - * your results. - * - * @param {string} search - * @param {number} limit - * @param {number} offset - * @param {string} orderType - * @throws {Error} - * @return {Promise} - */ - listUsers: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/users'; - - let payload = {}; - - if(search) { - payload['search'] = search; - } - - if(limit) { - payload['limit'] = limit; - } - - if(offset) { - payload['offset'] = offset; - } - - if(orderType) { - payload['orderType'] = orderType; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create User - * - * Create a new user. - * - * @param {string} email - * @param {string} password - * @param {string} name - * @throws {Error} - * @return {Promise} - */ - createUser: function(email, password, name = '') { - if(email === undefined) { - throw new Error('Missing required parameter: "email"'); - } - - if(password === undefined) { - throw new Error('Missing required parameter: "password"'); - } - - let path = '/users'; - - let payload = {}; - - if(email) { - payload['email'] = email; - } - - if(password) { - payload['password'] = password; - } - - if(name) { - payload['name'] = name; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get User - * - * Get user by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - getUser: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get User Logs - * - * Get user activity logs list by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - getUserLogs: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}/logs'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get User Preferences - * - * Get user preferences by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - getUserPrefs: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update User Preferences - * - * Update user preferences by its unique ID. You can pass only the specific - * settings you wish to update. - * - * @param {string} userId - * @param {string} prefs - * @throws {Error} - * @return {Promise} - */ - updateUserPrefs: function(userId, prefs) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(prefs === undefined) { - throw new Error('Missing required parameter: "prefs"'); - } - - let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - if(prefs) { - payload['prefs'] = prefs; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get User Sessions - * - * Get user sessions list by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - getUserSessions: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete User Sessions - * - * Delete all user sessions by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - deleteUserSessions: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete User Session - * - * Delete user sessions by its unique ID. - * - * @param {string} userId - * @param {string} sessionId - * @throws {Error} - * @return {Promise} - */ - deleteUserSession: function(userId, sessionId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(sessionId === undefined) { - throw new Error('Missing required parameter: "sessionId"'); - } - - let path = '/users/{userId}/sessions/:session'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - if(sessionId) { - payload['sessionId'] = sessionId; - } - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update User Status - * - * Update user status by its unique ID. - * - * @param {string} userId - * @param {string} status - * @throws {Error} - * @return {Promise} - */ - updateUserStatus: function(userId, status) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(status === undefined) { - throw new Error('Missing required parameter: "status"'); - } - - let path = '/users/{userId}/status'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - if(status) { - payload['status'] = status; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - } - }; - return { setEndpoint: setEndpoint, setProject: setProject, @@ -3871,10 +2393,8 @@ avatars: avatars, database: database, locale: locale, - projects: projects, storage: storage, - teams: teams, - users: users + teams: teams }; }; diff --git a/app/sdks/javascript/src/sdk.min.js b/app/sdks/javascript/src/sdk.min.js index 493765dd7c..223eb1fcd2 100644 --- a/app/sdks/javascript/src/sdk.min.js +++ b/app/sdks/javascript/src/sdk.min.js @@ -50,9 +50,7 @@ if(failure===undefined){throw new Error('Missing required parameter: "failure"') let path='/account/sessions/oauth/{provider}'.replace(new RegExp('{provider}','g'),provider);let payload={};if(success){payload.success=success} if(failure){payload.failure=failure} return http.get(path,{'content-type':'application/json',},payload)},deleteAccountSession:function(id){if(id===undefined){throw new Error('Missing required parameter: "id"')} -let path='/account/sessions/{id}'.replace(new RegExp('{id}','g'),id);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createAccountVerification:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"')} -let path='/account/verification';let payload={};if(url){payload.url=url} -return http.post(path,{'content-type':'application/json',},payload)},updateAccountVerification:function(userId,secret,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +let path='/account/sessions/{id}'.replace(new RegExp('{id}','g'),id);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateAccountVerification:function(userId,secret,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} if(secret===undefined){throw new Error('Missing required parameter: "secret"')} if(passwordB===undefined){throw new Error('Missing required parameter: "passwordB"')} let path='/account/verification';let payload={};if(userId){payload.userId=userId} @@ -135,142 +133,7 @@ if(read){payload.read=read} if(write){payload.write=write} return http.patch(path,{'content-type':'application/json',},payload)},deleteDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let locale={getLocale:function(){let path='/locale';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getContinents:function(){let path='/locale/continents';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountries:function(){let path='/locale/countries';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesEU:function(){let path='/locale/countries/eu';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesPhones:function(){let path='/locale/countries/phones';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCurrencies:function(){let path='/locale/currencies';let payload={};return http.get(path,{'content-type':'application/json',},payload)}};let projects={listProjects:function(){let path='/projects';let payload={};return http.get(path,{'content-type':'application/json',},payload)},createProject:function(name,teamId,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -let path='/projects';let payload={};if(name){payload.name=name} -if(teamId){payload.teamId=teamId} -if(description){payload.description=description} -if(logo){payload.logo=logo} -if(url){payload.url=url} -if(legalName){payload.legalName=legalName} -if(legalCountry){payload.legalCountry=legalCountry} -if(legalState){payload.legalState=legalState} -if(legalCity){payload.legalCity=legalCity} -if(legalAddress){payload.legalAddress=legalAddress} -if(legalTaxId){payload.legalTaxId=legalTaxId} -return http.post(path,{'content-type':'application/json',},payload)},getProject:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateProject:function(projectId,name,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} -if(description){payload.description=description} -if(logo){payload.logo=logo} -if(url){payload.url=url} -if(legalName){payload.legalName=legalName} -if(legalCountry){payload.legalCountry=legalCountry} -if(legalState){payload.legalState=legalState} -if(legalCity){payload.legalCity=legalCity} -if(legalAddress){payload.legalAddress=legalAddress} -if(legalTaxId){payload.legalTaxId=legalTaxId} -return http.patch(path,{'content-type':'application/json',},payload)},deleteProject:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listKeys:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createKey:function(projectId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(scopes===undefined){throw new Error('Missing required parameter: "scopes"')} -let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} -if(scopes){payload.scopes=scopes} -return http.post(path,{'content-type':'application/json',},payload)},getKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} -let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateKey:function(projectId,keyId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(scopes===undefined){throw new Error('Missing required parameter: "scopes"')} -let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};if(name){payload.name=name} -if(scopes){payload.scopes=scopes} -return http.put(path,{'content-type':'application/json',},payload)},deleteKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} -let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateProjectOAuth:function(projectId,provider,appId='',secret=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(provider===undefined){throw new Error('Missing required parameter: "provider"')} -let path='/projects/{projectId}/oauth'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(provider){payload.provider=provider} -if(appId){payload.appId=appId} -if(secret){payload.secret=secret} -return http.patch(path,{'content-type':'application/json',},payload)},listPlatforms:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createPlatform:function(projectId,type,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(type===undefined){throw new Error('Missing required parameter: "type"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(type){payload.type=type} -if(name){payload.name=name} -if(key){payload.key=key} -if(store){payload.store=store} -if(url){payload.url=url} -return http.post(path,{'content-type':'application/json',},payload)},getPlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} -let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updatePlatform:function(projectId,platformId,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};if(name){payload.name=name} -if(key){payload.key=key} -if(store){payload.store=store} -if(url){payload.url=url} -return http.put(path,{'content-type':'application/json',},payload)},deletePlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} -let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listTasks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/tasks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createTask:function(projectId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(status===undefined){throw new Error('Missing required parameter: "status"')} -if(schedule===undefined){throw new Error('Missing required parameter: "schedule"')} -if(security===undefined){throw new Error('Missing required parameter: "security"')} -if(httpMethod===undefined){throw new Error('Missing required parameter: "httpMethod"')} -if(httpUrl===undefined){throw new Error('Missing required parameter: "httpUrl"')} -let path='/projects/{projectId}/tasks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} -if(status){payload.status=status} -if(schedule){payload.schedule=schedule} -if(security){payload.security=security} -if(httpMethod){payload.httpMethod=httpMethod} -if(httpUrl){payload.httpUrl=httpUrl} -if(httpHeaders){payload.httpHeaders=httpHeaders} -if(httpUser){payload.httpUser=httpUser} -if(httpPass){payload.httpPass=httpPass} -return http.post(path,{'content-type':'application/json',},payload)},getTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} -let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateTask:function(projectId,taskId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(status===undefined){throw new Error('Missing required parameter: "status"')} -if(schedule===undefined){throw new Error('Missing required parameter: "schedule"')} -if(security===undefined){throw new Error('Missing required parameter: "security"')} -if(httpMethod===undefined){throw new Error('Missing required parameter: "httpMethod"')} -if(httpUrl===undefined){throw new Error('Missing required parameter: "httpUrl"')} -let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};if(name){payload.name=name} -if(status){payload.status=status} -if(schedule){payload.schedule=schedule} -if(security){payload.security=security} -if(httpMethod){payload.httpMethod=httpMethod} -if(httpUrl){payload.httpUrl=httpUrl} -if(httpHeaders){payload.httpHeaders=httpHeaders} -if(httpUser){payload.httpUser=httpUser} -if(httpPass){payload.httpPass=httpPass} -return http.put(path,{'content-type':'application/json',},payload)},deleteTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} -let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getProjectUsage:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/usage'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},listWebhooks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createWebhook:function(projectId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(events===undefined){throw new Error('Missing required parameter: "events"')} -if(url===undefined){throw new Error('Missing required parameter: "url"')} -if(security===undefined){throw new Error('Missing required parameter: "security"')} -let path='/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} -if(events){payload.events=events} -if(url){payload.url=url} -if(security){payload.security=security} -if(httpUser){payload.httpUser=httpUser} -if(httpPass){payload.httpPass=httpPass} -return http.post(path,{'content-type':'application/json',},payload)},getWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateWebhook:function(projectId,webhookId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(events===undefined){throw new Error('Missing required parameter: "events"')} -if(url===undefined){throw new Error('Missing required parameter: "url"')} -if(security===undefined){throw new Error('Missing required parameter: "security"')} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};if(name){payload.name=name} -if(events){payload.events=events} -if(url){payload.url=url} -if(security){payload.security=security} -if(httpUser){payload.httpUser=httpUser} -if(httpPass){payload.httpPass=httpPass} -return http.put(path,{'content-type':'application/json',},payload)},deleteWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let storage={listFiles:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';let payload={};if(search){payload.search=search} +let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let locale={getLocale:function(){let path='/locale';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getContinents:function(){let path='/locale/continents';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountries:function(){let path='/locale/countries';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesEU:function(){let path='/locale/countries/eu';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesPhones:function(){let path='/locale/countries/phones';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCurrencies:function(){let path='/locale/currencies';let payload={};return http.get(path,{'content-type':'application/json',},payload)}};let storage={listFiles:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';let payload={};if(search){payload.search=search} if(limit){payload.limit=limit} if(offset){payload.offset=offset} if(orderType){payload.orderType=orderType} @@ -325,27 +188,4 @@ if(userId===undefined){throw new Error('Missing required parameter: "userId"')} if(secret===undefined){throw new Error('Missing required parameter: "secret"')} let path='/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};if(userId){payload.userId=userId} if(secret){payload.secret=secret} -payload.project=config.project;return iframe('patch',path,payload)}};let users={listUsers:function(search='',limit=25,offset=0,orderType='ASC'){let path='/users';let payload={};if(search){payload.search=search} -if(limit){payload.limit=limit} -if(offset){payload.offset=offset} -if(orderType){payload.orderType=orderType} -return http.get(path,{'content-type':'application/json',},payload)},createUser:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} -if(password===undefined){throw new Error('Missing required parameter: "password"')} -let path='/users';let payload={};if(email){payload.email=email} -if(password){payload.password=password} -if(name){payload.name=name} -return http.post(path,{'content-type':'application/json',},payload)},getUser:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getUserLogs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}/logs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getUserPrefs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateUserPrefs:function(userId,prefs){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(prefs===undefined){throw new Error('Missing required parameter: "prefs"')} -let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};if(prefs){payload.prefs=prefs} -return http.patch(path,{'content-type':'application/json',},payload)},getUserSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},deleteUserSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},deleteUserSession:function(userId,sessionId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(sessionId===undefined){throw new Error('Missing required parameter: "sessionId"')} -let path='/users/{userId}/sessions/:session'.replace(new RegExp('{userId}','g'),userId);let payload={};if(sessionId){payload.sessionId=sessionId} -return http.delete(path,{'content-type':'application/json',},payload)},updateUserStatus:function(userId,status){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(status===undefined){throw new Error('Missing required parameter: "status"')} -let path='/users/{userId}/status'.replace(new RegExp('{userId}','g'),userId);let payload={};if(status){payload.status=status} -return http.patch(path,{'content-type':'application/json',},payload)}};return{setEndpoint:setEndpoint,setProject:setProject,setKey:setKey,setLocale:setLocale,setMode:setMode,account:account,avatars:avatars,database:database,locale:locale,projects:projects,storage:storage,teams:teams,users:users}};if(typeof module!=="undefined"){module.exports=window.Appwrite}})((typeof window!=="undefined")?window:{}) \ No newline at end of file +payload.project=config.project;return iframe('patch',path,payload)}};return{setEndpoint:setEndpoint,setProject:setProject,setKey:setKey,setLocale:setLocale,setMode:setMode,account:account,avatars:avatars,database:database,locale:locale,storage:storage,teams:teams}};if(typeof module!=="undefined"){module.exports=window.Appwrite}})((typeof window!=="undefined")?window:{}) \ No newline at end of file diff --git a/app/sdks/js/LICENSE b/app/sdks/js/LICENSE deleted file mode 100644 index fc7c051a91..0000000000 --- a/app/sdks/js/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/sdks/js/README.md b/app/sdks/js/README.md deleted file mode 100644 index f104da6caa..0000000000 --- a/app/sdks/js/README.md +++ /dev/null @@ -1,55 +0,0 @@ -# Appwrite SDK for JavaScript - -![License](https://img.shields.io/github/license/appwrite/sdk-for-js.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) - -**This SDK is compatible with Appwrite server version 0.4.0. For older versions, please check previous releases.** - -Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) - -![Appwrite](https://appwrite.io/images/github.png) - -## Installation - -### NPM - -To install via [NPM](https://www.npmjs.com/): - -```bash -npm install appwrite --save -``` - -If you're using a bundler (like [Browserify](http://browserify.org/) or [webpack](https://webpack.js.org/)), you can import the Appwrite module when you need it: - -```js -import * as Appwrite from "appwrite"; -``` - -### CDN - -To install with a CDN (content delivery network) add the following scripts to the bottom of your tag, but before you use any Appwrite services: - -```html - -``` - -## Getting Started - -Initialise the Appwrite SDK in your code, and setup your API credentials: - -```js - -// Init your JS SDK -var appwrite = new Appwrite(); - -appwrite - .setEndpoint('http://localhost/v1') // Set only when using self-hosted solution - .setProject('455x34dfkj') // Your Appwrite Project UID -; - -``` - - -## License - -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/delete.md b/app/sdks/js/docs/examples/account/delete.md deleted file mode 100644 index c199f0f719..0000000000 --- a/app/sdks/js/docs/examples/account/delete.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.delete(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/get-prefs.md b/app/sdks/js/docs/examples/account/get-prefs.md deleted file mode 100644 index 39f8950138..0000000000 --- a/app/sdks/js/docs/examples/account/get-prefs.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.getPrefs(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/get-security.md b/app/sdks/js/docs/examples/account/get-security.md deleted file mode 100644 index ab0671da8a..0000000000 --- a/app/sdks/js/docs/examples/account/get-security.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.getSecurity(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/get-sessions.md b/app/sdks/js/docs/examples/account/get-sessions.md deleted file mode 100644 index 963400deeb..0000000000 --- a/app/sdks/js/docs/examples/account/get-sessions.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.getSessions(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/get.md b/app/sdks/js/docs/examples/account/get.md deleted file mode 100644 index 682e09fbd8..0000000000 --- a/app/sdks/js/docs/examples/account/get.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.get(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/update-email.md b/app/sdks/js/docs/examples/account/update-email.md deleted file mode 100644 index e9fb9c9ed2..0000000000 --- a/app/sdks/js/docs/examples/account/update-email.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.updateEmail('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/update-name.md b/app/sdks/js/docs/examples/account/update-name.md deleted file mode 100644 index 2e5531e4c3..0000000000 --- a/app/sdks/js/docs/examples/account/update-name.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.updateName('[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/update-password.md b/app/sdks/js/docs/examples/account/update-password.md deleted file mode 100644 index e4ddc7fc49..0000000000 --- a/app/sdks/js/docs/examples/account/update-password.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.updatePassword('password', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/account/update-prefs.md b/app/sdks/js/docs/examples/account/update-prefs.md deleted file mode 100644 index da37ceff8e..0000000000 --- a/app/sdks/js/docs/examples/account/update-prefs.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.updatePrefs('{}'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/confirm-resend.md b/app/sdks/js/docs/examples/auth/confirm-resend.md deleted file mode 100644 index 4c66e71d93..0000000000 --- a/app/sdks/js/docs/examples/auth/confirm-resend.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.auth.confirmResend('https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/confirm.md b/app/sdks/js/docs/examples/auth/confirm.md deleted file mode 100644 index 4313e94f23..0000000000 --- a/app/sdks/js/docs/examples/auth/confirm.md +++ /dev/null @@ -1,12 +0,0 @@ -let sdk = new Appwrite(); - -sdk -; - -let promise = sdk.auth.confirm('[USER_ID]', '[TOKEN]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/login.md b/app/sdks/js/docs/examples/auth/login.md deleted file mode 100644 index 99ffaa8df7..0000000000 --- a/app/sdks/js/docs/examples/auth/login.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.auth.login('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/logout-by-session.md b/app/sdks/js/docs/examples/auth/logout-by-session.md deleted file mode 100644 index ba03feff4a..0000000000 --- a/app/sdks/js/docs/examples/auth/logout-by-session.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.auth.logoutBySession('[ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/logout.md b/app/sdks/js/docs/examples/auth/logout.md deleted file mode 100644 index 90f5ff4b18..0000000000 --- a/app/sdks/js/docs/examples/auth/logout.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.auth.logout(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/oauth-callback.md b/app/sdks/js/docs/examples/auth/oauth-callback.md deleted file mode 100644 index f5412deea6..0000000000 --- a/app/sdks/js/docs/examples/auth/oauth-callback.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - setProject('') -; - -let promise = sdk.auth.oauthCallback('[PROJECT_ID]', 'bitbucket', '[CODE]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/oauth.md b/app/sdks/js/docs/examples/auth/oauth.md deleted file mode 100644 index eeffd40b57..0000000000 --- a/app/sdks/js/docs/examples/auth/oauth.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.auth.oauth('bitbucket', 'https://example.com', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/recovery-reset.md b/app/sdks/js/docs/examples/auth/recovery-reset.md deleted file mode 100644 index 7830eba1d6..0000000000 --- a/app/sdks/js/docs/examples/auth/recovery-reset.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.auth.recoveryReset('[USER_ID]', '[TOKEN]', 'password', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/recovery.md b/app/sdks/js/docs/examples/auth/recovery.md deleted file mode 100644 index a313e192f8..0000000000 --- a/app/sdks/js/docs/examples/auth/recovery.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.auth.recovery('email@example.com', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/auth/register.md b/app/sdks/js/docs/examples/auth/register.md deleted file mode 100644 index c5205f90cd..0000000000 --- a/app/sdks/js/docs/examples/auth/register.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.auth.register('email@example.com', 'password', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/avatars/get-browser.md b/app/sdks/js/docs/examples/avatars/get-browser.md deleted file mode 100644 index 84c992621e..0000000000 --- a/app/sdks/js/docs/examples/avatars/get-browser.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.avatars.getBrowser('aa'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/avatars/get-credit-card.md b/app/sdks/js/docs/examples/avatars/get-credit-card.md deleted file mode 100644 index c9fb87edc7..0000000000 --- a/app/sdks/js/docs/examples/avatars/get-credit-card.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.avatars.getCreditCard('amex'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/avatars/get-favicon.md b/app/sdks/js/docs/examples/avatars/get-favicon.md deleted file mode 100644 index 5876eb2b5a..0000000000 --- a/app/sdks/js/docs/examples/avatars/get-favicon.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.avatars.getFavicon('https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/avatars/get-flag.md b/app/sdks/js/docs/examples/avatars/get-flag.md deleted file mode 100644 index 694c6b399e..0000000000 --- a/app/sdks/js/docs/examples/avatars/get-flag.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.avatars.getFlag('af'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/avatars/get-image.md b/app/sdks/js/docs/examples/avatars/get-image.md deleted file mode 100644 index b807ff734e..0000000000 --- a/app/sdks/js/docs/examples/avatars/get-image.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.avatars.getImage('https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/avatars/get-q-r.md b/app/sdks/js/docs/examples/avatars/get-q-r.md deleted file mode 100644 index e64d83a5c4..0000000000 --- a/app/sdks/js/docs/examples/avatars/get-q-r.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.avatars.getQR('[TEXT]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/create-collection.md b/app/sdks/js/docs/examples/database/create-collection.md deleted file mode 100644 index a93fe45778..0000000000 --- a/app/sdks/js/docs/examples/database/create-collection.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.createCollection('[NAME]', [], [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/create-document.md b/app/sdks/js/docs/examples/database/create-document.md deleted file mode 100644 index aa251ae2b2..0000000000 --- a/app/sdks/js/docs/examples/database/create-document.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.createDocument('[COLLECTION_ID]', '{}', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/delete-collection.md b/app/sdks/js/docs/examples/database/delete-collection.md deleted file mode 100644 index 1a116c58b9..0000000000 --- a/app/sdks/js/docs/examples/database/delete-collection.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.deleteCollection('[COLLECTION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/delete-document.md b/app/sdks/js/docs/examples/database/delete-document.md deleted file mode 100644 index 7dd7fc4db4..0000000000 --- a/app/sdks/js/docs/examples/database/delete-document.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.deleteDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/get-collection.md b/app/sdks/js/docs/examples/database/get-collection.md deleted file mode 100644 index abe8d482d4..0000000000 --- a/app/sdks/js/docs/examples/database/get-collection.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.getCollection('[COLLECTION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/get-document.md b/app/sdks/js/docs/examples/database/get-document.md deleted file mode 100644 index 1bcb5b00ac..0000000000 --- a/app/sdks/js/docs/examples/database/get-document.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.getDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/list-collections.md b/app/sdks/js/docs/examples/database/list-collections.md deleted file mode 100644 index 3160903309..0000000000 --- a/app/sdks/js/docs/examples/database/list-collections.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.listCollections(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/list-documents.md b/app/sdks/js/docs/examples/database/list-documents.md deleted file mode 100644 index 68ce8d6c23..0000000000 --- a/app/sdks/js/docs/examples/database/list-documents.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.listDocuments('[COLLECTION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/update-collection.md b/app/sdks/js/docs/examples/database/update-collection.md deleted file mode 100644 index 726c244c79..0000000000 --- a/app/sdks/js/docs/examples/database/update-collection.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.updateCollection('[COLLECTION_ID]', '[NAME]', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/database/update-document.md b/app/sdks/js/docs/examples/database/update-document.md deleted file mode 100644 index 7809b97bfd..0000000000 --- a/app/sdks/js/docs/examples/database/update-document.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.database.updateDocument('[COLLECTION_ID]', '[DOCUMENT_ID]', '{}', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/locale/get-continents.md b/app/sdks/js/docs/examples/locale/get-continents.md deleted file mode 100644 index a8de63eb91..0000000000 --- a/app/sdks/js/docs/examples/locale/get-continents.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.locale.getContinents(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/locale/get-countries-e-u.md b/app/sdks/js/docs/examples/locale/get-countries-e-u.md deleted file mode 100644 index 44ceffd7e7..0000000000 --- a/app/sdks/js/docs/examples/locale/get-countries-e-u.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.locale.getCountriesEU(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/locale/get-countries-phones.md b/app/sdks/js/docs/examples/locale/get-countries-phones.md deleted file mode 100644 index afd084f5d4..0000000000 --- a/app/sdks/js/docs/examples/locale/get-countries-phones.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.locale.getCountriesPhones(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/locale/get-countries.md b/app/sdks/js/docs/examples/locale/get-countries.md deleted file mode 100644 index 521195bfaa..0000000000 --- a/app/sdks/js/docs/examples/locale/get-countries.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.locale.getCountries(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/locale/get-currencies.md b/app/sdks/js/docs/examples/locale/get-currencies.md deleted file mode 100644 index 8032307f86..0000000000 --- a/app/sdks/js/docs/examples/locale/get-currencies.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.locale.getCurrencies(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/locale/get-locale.md b/app/sdks/js/docs/examples/locale/get-locale.md deleted file mode 100644 index 4cc5a3f3b2..0000000000 --- a/app/sdks/js/docs/examples/locale/get-locale.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.locale.getLocale(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/create-key.md b/app/sdks/js/docs/examples/projects/create-key.md deleted file mode 100644 index 3c12c8a8c2..0000000000 --- a/app/sdks/js/docs/examples/projects/create-key.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createKey('[PROJECT_ID]', '[NAME]', []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/create-platform.md b/app/sdks/js/docs/examples/projects/create-platform.md deleted file mode 100644 index b67b84ba56..0000000000 --- a/app/sdks/js/docs/examples/projects/create-platform.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createPlatform('[PROJECT_ID]', 'web', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/create-project.md b/app/sdks/js/docs/examples/projects/create-project.md deleted file mode 100644 index a1b6922fed..0000000000 --- a/app/sdks/js/docs/examples/projects/create-project.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createProject('[NAME]', '[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/create-task.md b/app/sdks/js/docs/examples/projects/create-task.md deleted file mode 100644 index 3262b4d9fe..0000000000 --- a/app/sdks/js/docs/examples/projects/create-task.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/create-webhook.md b/app/sdks/js/docs/examples/projects/create-webhook.md deleted file mode 100644 index 66a76c26c2..0000000000 --- a/app/sdks/js/docs/examples/projects/create-webhook.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/delete-key.md b/app/sdks/js/docs/examples/projects/delete-key.md deleted file mode 100644 index e5ae8e426c..0000000000 --- a/app/sdks/js/docs/examples/projects/delete-key.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deleteKey('[PROJECT_ID]', '[KEY_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/delete-platform.md b/app/sdks/js/docs/examples/projects/delete-platform.md deleted file mode 100644 index 450f9cd0a6..0000000000 --- a/app/sdks/js/docs/examples/projects/delete-platform.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deletePlatform('[PROJECT_ID]', '[PLATFORM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/delete-project.md b/app/sdks/js/docs/examples/projects/delete-project.md deleted file mode 100644 index b60d4de3c9..0000000000 --- a/app/sdks/js/docs/examples/projects/delete-project.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deleteProject('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/delete-task.md b/app/sdks/js/docs/examples/projects/delete-task.md deleted file mode 100644 index 3208d38bf8..0000000000 --- a/app/sdks/js/docs/examples/projects/delete-task.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deleteTask('[PROJECT_ID]', '[TASK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/delete-webhook.md b/app/sdks/js/docs/examples/projects/delete-webhook.md deleted file mode 100644 index 030a3b77f1..0000000000 --- a/app/sdks/js/docs/examples/projects/delete-webhook.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.deleteWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/get-key.md b/app/sdks/js/docs/examples/projects/get-key.md deleted file mode 100644 index 7207b33bf7..0000000000 --- a/app/sdks/js/docs/examples/projects/get-key.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getKey('[PROJECT_ID]', '[KEY_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/get-platform.md b/app/sdks/js/docs/examples/projects/get-platform.md deleted file mode 100644 index 6f353f3aca..0000000000 --- a/app/sdks/js/docs/examples/projects/get-platform.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getPlatform('[PROJECT_ID]', '[PLATFORM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/get-project-usage.md b/app/sdks/js/docs/examples/projects/get-project-usage.md deleted file mode 100644 index 87a2e3148a..0000000000 --- a/app/sdks/js/docs/examples/projects/get-project-usage.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getProjectUsage('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/get-project.md b/app/sdks/js/docs/examples/projects/get-project.md deleted file mode 100644 index 084e48c253..0000000000 --- a/app/sdks/js/docs/examples/projects/get-project.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getProject('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/get-task.md b/app/sdks/js/docs/examples/projects/get-task.md deleted file mode 100644 index e5195bce8c..0000000000 --- a/app/sdks/js/docs/examples/projects/get-task.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getTask('[PROJECT_ID]', '[TASK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/get-webhook.md b/app/sdks/js/docs/examples/projects/get-webhook.md deleted file mode 100644 index a2b6089c3e..0000000000 --- a/app/sdks/js/docs/examples/projects/get-webhook.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.getWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/list-keys.md b/app/sdks/js/docs/examples/projects/list-keys.md deleted file mode 100644 index 14ef64fb6f..0000000000 --- a/app/sdks/js/docs/examples/projects/list-keys.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listKeys('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/list-platforms.md b/app/sdks/js/docs/examples/projects/list-platforms.md deleted file mode 100644 index 7cfd9341a7..0000000000 --- a/app/sdks/js/docs/examples/projects/list-platforms.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listPlatforms('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/list-projects.md b/app/sdks/js/docs/examples/projects/list-projects.md deleted file mode 100644 index 3ba3afc41e..0000000000 --- a/app/sdks/js/docs/examples/projects/list-projects.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listProjects(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/list-tasks.md b/app/sdks/js/docs/examples/projects/list-tasks.md deleted file mode 100644 index fd8ab61ffa..0000000000 --- a/app/sdks/js/docs/examples/projects/list-tasks.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listTasks('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/list-webhooks.md b/app/sdks/js/docs/examples/projects/list-webhooks.md deleted file mode 100644 index b19851c8b1..0000000000 --- a/app/sdks/js/docs/examples/projects/list-webhooks.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.listWebhooks('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/update-key.md b/app/sdks/js/docs/examples/projects/update-key.md deleted file mode 100644 index 063f4daea4..0000000000 --- a/app/sdks/js/docs/examples/projects/update-key.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateKey('[PROJECT_ID]', '[KEY_ID]', '[NAME]', []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/update-platform.md b/app/sdks/js/docs/examples/projects/update-platform.md deleted file mode 100644 index e28846f050..0000000000 --- a/app/sdks/js/docs/examples/projects/update-platform.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updatePlatform('[PROJECT_ID]', '[PLATFORM_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/update-project-o-auth.md b/app/sdks/js/docs/examples/projects/update-project-o-auth.md deleted file mode 100644 index 9ab78a4ea9..0000000000 --- a/app/sdks/js/docs/examples/projects/update-project-o-auth.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateProjectOAuth('[PROJECT_ID]', 'bitbucket'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/update-project.md b/app/sdks/js/docs/examples/projects/update-project.md deleted file mode 100644 index 6fcaa49f37..0000000000 --- a/app/sdks/js/docs/examples/projects/update-project.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateProject('[PROJECT_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/update-task.md b/app/sdks/js/docs/examples/projects/update-task.md deleted file mode 100644 index 54116a41d0..0000000000 --- a/app/sdks/js/docs/examples/projects/update-task.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/projects/update-webhook.md b/app/sdks/js/docs/examples/projects/update-webhook.md deleted file mode 100644 index ce876d5a64..0000000000 --- a/app/sdks/js/docs/examples/projects/update-webhook.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/storage/create-file.md b/app/sdks/js/docs/examples/storage/create-file.md deleted file mode 100644 index 53157d19a3..0000000000 --- a/app/sdks/js/docs/examples/storage/create-file.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.createFile(document.getElementById('uploader').files[0], [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/storage/delete-file.md b/app/sdks/js/docs/examples/storage/delete-file.md deleted file mode 100644 index 4e39bd9811..0000000000 --- a/app/sdks/js/docs/examples/storage/delete-file.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.deleteFile('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/storage/get-file-download.md b/app/sdks/js/docs/examples/storage/get-file-download.md deleted file mode 100644 index a53142184c..0000000000 --- a/app/sdks/js/docs/examples/storage/get-file-download.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.getFileDownload('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/storage/get-file-preview.md b/app/sdks/js/docs/examples/storage/get-file-preview.md deleted file mode 100644 index 1cce3acd24..0000000000 --- a/app/sdks/js/docs/examples/storage/get-file-preview.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.getFilePreview('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/storage/get-file-view.md b/app/sdks/js/docs/examples/storage/get-file-view.md deleted file mode 100644 index 4844b22ce3..0000000000 --- a/app/sdks/js/docs/examples/storage/get-file-view.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.getFileView('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/storage/get-file.md b/app/sdks/js/docs/examples/storage/get-file.md deleted file mode 100644 index 32b11a2175..0000000000 --- a/app/sdks/js/docs/examples/storage/get-file.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.getFile('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/storage/list-files.md b/app/sdks/js/docs/examples/storage/list-files.md deleted file mode 100644 index 0033bb254d..0000000000 --- a/app/sdks/js/docs/examples/storage/list-files.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.listFiles(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/storage/update-file.md b/app/sdks/js/docs/examples/storage/update-file.md deleted file mode 100644 index 72d6ee3166..0000000000 --- a/app/sdks/js/docs/examples/storage/update-file.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.updateFile('[FILE_ID]', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/create-team-membership-resend.md b/app/sdks/js/docs/examples/teams/create-team-membership-resend.md deleted file mode 100644 index 03ac8240a9..0000000000 --- a/app/sdks/js/docs/examples/teams/create-team-membership-resend.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.createTeamMembershipResend('[TEAM_ID]', '[INVITE_ID]', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/create-team-membership.md b/app/sdks/js/docs/examples/teams/create-team-membership.md deleted file mode 100644 index 60f996c209..0000000000 --- a/app/sdks/js/docs/examples/teams/create-team-membership.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.createTeamMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/create-team.md b/app/sdks/js/docs/examples/teams/create-team.md deleted file mode 100644 index 2dafeac2ab..0000000000 --- a/app/sdks/js/docs/examples/teams/create-team.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.createTeam('[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/delete-team-membership.md b/app/sdks/js/docs/examples/teams/delete-team-membership.md deleted file mode 100644 index 551dfd7dbb..0000000000 --- a/app/sdks/js/docs/examples/teams/delete-team-membership.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.deleteTeamMembership('[TEAM_ID]', '[INVITE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/delete-team.md b/app/sdks/js/docs/examples/teams/delete-team.md deleted file mode 100644 index 3f9cd8b6f5..0000000000 --- a/app/sdks/js/docs/examples/teams/delete-team.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.deleteTeam('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/get-team-members.md b/app/sdks/js/docs/examples/teams/get-team-members.md deleted file mode 100644 index f1ba5d9f4a..0000000000 --- a/app/sdks/js/docs/examples/teams/get-team-members.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.getTeamMembers('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/get-team.md b/app/sdks/js/docs/examples/teams/get-team.md deleted file mode 100644 index 7e1f8254fe..0000000000 --- a/app/sdks/js/docs/examples/teams/get-team.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.getTeam('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/list-teams.md b/app/sdks/js/docs/examples/teams/list-teams.md deleted file mode 100644 index abd4fa420b..0000000000 --- a/app/sdks/js/docs/examples/teams/list-teams.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.listTeams(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/update-team-membership-status.md b/app/sdks/js/docs/examples/teams/update-team-membership-status.md deleted file mode 100644 index 15eb72524b..0000000000 --- a/app/sdks/js/docs/examples/teams/update-team-membership-status.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.updateTeamMembershipStatus('[TEAM_ID]', '[INVITE_ID]', '[USER_ID]', '[SECRET]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/teams/update-team.md b/app/sdks/js/docs/examples/teams/update-team.md deleted file mode 100644 index 2ec35ec906..0000000000 --- a/app/sdks/js/docs/examples/teams/update-team.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.updateTeam('[TEAM_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/create-user.md b/app/sdks/js/docs/examples/users/create-user.md deleted file mode 100644 index 1242fe70c2..0000000000 --- a/app/sdks/js/docs/examples/users/create-user.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.createUser('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/delete-user-session.md b/app/sdks/js/docs/examples/users/delete-user-session.md deleted file mode 100644 index 4b5df53439..0000000000 --- a/app/sdks/js/docs/examples/users/delete-user-session.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.deleteUserSession('[USER_ID]', '[SESSION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/delete-user-sessions.md b/app/sdks/js/docs/examples/users/delete-user-sessions.md deleted file mode 100644 index 1a6851ce15..0000000000 --- a/app/sdks/js/docs/examples/users/delete-user-sessions.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.deleteUserSessions('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/delete-users-session.md b/app/sdks/js/docs/examples/users/delete-users-session.md deleted file mode 100644 index 5eac7e2236..0000000000 --- a/app/sdks/js/docs/examples/users/delete-users-session.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.deleteUsersSession('[USER_ID]', '[SESSION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/get-user-logs.md b/app/sdks/js/docs/examples/users/get-user-logs.md deleted file mode 100644 index 85175b0e1e..0000000000 --- a/app/sdks/js/docs/examples/users/get-user-logs.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.getUserLogs('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/get-user-prefs.md b/app/sdks/js/docs/examples/users/get-user-prefs.md deleted file mode 100644 index 0d9c8dbb22..0000000000 --- a/app/sdks/js/docs/examples/users/get-user-prefs.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.getUserPrefs('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/get-user-sessions.md b/app/sdks/js/docs/examples/users/get-user-sessions.md deleted file mode 100644 index 8cc7b1f85b..0000000000 --- a/app/sdks/js/docs/examples/users/get-user-sessions.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.getUserSessions('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/get-user.md b/app/sdks/js/docs/examples/users/get-user.md deleted file mode 100644 index feb40dff2d..0000000000 --- a/app/sdks/js/docs/examples/users/get-user.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.getUser('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/list-users.md b/app/sdks/js/docs/examples/users/list-users.md deleted file mode 100644 index 561826cbd1..0000000000 --- a/app/sdks/js/docs/examples/users/list-users.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.listUsers(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/update-user-prefs.md b/app/sdks/js/docs/examples/users/update-user-prefs.md deleted file mode 100644 index 54208f5f96..0000000000 --- a/app/sdks/js/docs/examples/users/update-user-prefs.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.updateUserPrefs('[USER_ID]', '{}'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/docs/examples/users/update-user-status.md b/app/sdks/js/docs/examples/users/update-user-status.md deleted file mode 100644 index 15b7376ca7..0000000000 --- a/app/sdks/js/docs/examples/users/update-user-status.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.users.updateUserStatus('[USER_ID]', '1'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/js/package.json b/app/sdks/js/package.json deleted file mode 100644 index 0c3d5e7b03..0000000000 --- a/app/sdks/js/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "appwrite", - "homepage": "https://appwrite.io/support", - "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)", - "version": "1.0.28", - "license": "BSD-3-Clause", - "main": "src/sdk.js", - "repository": { - "type": "git", - "url": "https://github.com/appwrite/sdk-for-js.git" - }, - "devDependencies": {}, - "dependencies": {} -} \ No newline at end of file diff --git a/app/sdks/js/src/sdk.js b/app/sdks/js/src/sdk.js deleted file mode 100644 index b64f08c92b..0000000000 --- a/app/sdks/js/src/sdk.js +++ /dev/null @@ -1,3929 +0,0 @@ -(function (window) { - - 'use strict'; - - window.Appwrite = function () { - - let config = { - endpoint: 'https://appwrite.io/v1', - project: '', - key: '', - locale: '', - mode: '', - }; - - /** - * @param {string} endpoint - * @returns {this} - */ - let setEndpoint = function(endpoint) { - config.endpoint = endpoint; - - return this; - }; - - /** - * Set Project - * - * Your Appwrite project ID - * - * @param value string - * - * @return this - */ - let setProject = function (value) - { - http.addGlobalHeader('X-Appwrite-Project', value); - - config.project = value; - - return this; - }; - - /** - * Set Key - * - * Your Appwrite project secret key - * - * @param value string - * - * @return this - */ - let setKey = function (value) - { - http.addGlobalHeader('X-Appwrite-Key', value); - - config.key = value; - - return this; - }; - - /** - * Set Locale - * - * @param value string - * - * @return this - */ - let setLocale = function (value) - { - http.addGlobalHeader('X-Appwrite-Locale', value); - - config.locale = value; - - return this; - }; - - /** - * Set Mode - * - * @param value string - * - * @return this - */ - let setMode = function (value) - { - http.addGlobalHeader('X-Appwrite-Mode', value); - - config.mode = value; - - return this; - }; - - let http = function(document) { - let globalParams = [], - globalHeaders = []; - - let addParam = function (url, param, value) { - let a = document.createElement('a'), regex = /(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g; - let match, str = []; - a.href = url; - param = encodeURIComponent(param); - - while (match = regex.exec(a.search)) if (param !== match[1]) str.push(match[1] + (match[2] ? "=" + match[2] : "")); - - str.push(param + (value ? "=" + encodeURIComponent(value) : "")); - - a.search = str.join("&"); - - return a.href; - }; - - /** - * @param {Object} params - * @returns {string} - */ - let buildQuery = function(params) { - let str = []; - - for (let p in params) { - if(Array.isArray(params[p])) { - for (let index = 0; index < params[p].length; index++) { - let param = params[p][index]; - str.push(encodeURIComponent(p + '[]') + "=" + encodeURIComponent(param)); - } - } - else { - str.push(encodeURIComponent(p) + "=" + encodeURIComponent(params[p])); - } - } - - return str.join("&"); - }; - - let addGlobalHeader = function(key, value) { - globalHeaders[key] = {key: key.toLowerCase(), value: value.toLowerCase()}; - }; - - let addGlobalParam = function(key, value) { - globalParams.push({key: key, value: value}); - }; - - addGlobalHeader('x-sdk-version', 'appwrite:javascript:1.0.28'); - addGlobalHeader('content-type', ''); - - /** - * @param {string} method - * @param {string} path string - * @param {Object} headers - * @param {Object} params - * @param {function} progress - * @returns {Promise} - */ - let call = function (method, path, headers = {}, params = {}, progress = null) { - let i; - - path = config.endpoint + path; - - if (-1 === ['GET', 'POST', 'PUT', 'DELETE', 'TRACE', 'HEAD', 'OPTIONS', 'CONNECT', 'PATCH'].indexOf(method)) { - throw new Error('var method must contain a valid HTTP method name'); - } - - if (typeof path !== 'string') { - throw new Error('var path must be of type string'); - } - - if (typeof headers !== 'object') { - throw new Error('var headers must be of type object'); - } - - for (i = 0; i < globalParams.length; i++) { // Add global params to URL - path = addParam(path, globalParams[i].key, globalParams[i].value); - } - - for (let key in globalHeaders) { // Add Global Headers - if (globalHeaders.hasOwnProperty(key)) { - if (!headers[globalHeaders[key].key]) { - headers[globalHeaders[key].key] = globalHeaders[key].value; - } - } - } - - if(method === 'GET') { - for (let param in params) { - if (param.hasOwnProperty(key)) { - path = addParam(path, key + (Array.isArray(param) ? '[]' : ''), params[key]); - } - } - } - - switch (headers['content-type']) { // Parse request by content type - case 'application/json': - params = JSON.stringify(params); - break; - - case 'multipart/form-data': - let formData = new FormData(); - - Object.keys(params).forEach(function(key) { - let param = params[key]; - formData.append(key + (Array.isArray(param) ? '[]' : ''), param); - }); - - params = formData; - break; - } - - return new Promise(function (resolve, reject) { - - let request = new XMLHttpRequest(), key; - - request.withCredentials = true; - request.open(method, path, true); - - for (key in headers) { // Set Headers - if (headers.hasOwnProperty(key)) { - if (key === 'content-type' && headers[key] === 'multipart/form-data') { // Skip to avoid missing boundary - continue; - } - - request.setRequestHeader(key, headers[key]); - } - } - - request.onload = function () { - if (4 === request.readyState && 399 >= request.status) { - let data = request.response; - let contentType = this.getResponseHeader('content-type') || ''; - contentType = contentType.substring(0, contentType.indexOf(';')); - - switch (contentType) { - case 'application/json': - data = JSON.parse(data); - break; - } - - resolve(data); - - } else { - reject(new Error(request.statusText)); - } - }; - - if (progress) { - request.addEventListener('progress', progress); - request.upload.addEventListener('progress', progress, false); - } - - // Handle network errors - request.onerror = function () { - reject(new Error("Network Error")); - }; - - request.send(params); - }) - }; - - return { - 'get': function(path, headers = {}, params = {}) { - return call('GET', path + ((Object.keys(params).length > 0) ? '?' + buildQuery(params) : ''), headers, {}); - }, - 'post': function(path, headers = {}, params = {}, progress = null) { - return call('POST', path, headers, params, progress); - }, - 'put': function(path, headers = {}, params = {}, progress = null) { - return call('PUT', path, headers, params, progress); - }, - 'patch': function(path, headers = {}, params = {}, progress = null) { - return call('PATCH', path, headers, params, progress); - }, - 'delete': function(path, headers = {}, params = {}, progress = null) { - return call('DELETE', path, headers, params, progress); - }, - 'addGlobalParam': addGlobalParam, - 'addGlobalHeader': addGlobalHeader - } - }(window.document); - - let iframe = function(method, url, params) { - let form = document.createElement('form'); - - form.setAttribute('method', method); - form.setAttribute('action', config.endpoint + url); - - for(let key in params) { - if(params.hasOwnProperty(key)) { - let hiddenField = document.createElement("input"); - hiddenField.setAttribute("type", "hidden"); - hiddenField.setAttribute("name", key); - hiddenField.setAttribute("value", params[key]); - - form.appendChild(hiddenField); - } - } - - document.body.appendChild(form); - - return form.submit(); - }; - - let account = { - - /** - * Get Account - * - * Get currently logged in user data as JSON object. - * - * @throws {Error} - * @return {Promise} - */ - get: function() { - let path = '/account'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Account - * - * Delete a currently logged in user account. Behind the scene, the user - * record is not deleted but permanently blocked from any access. This is done - * to avoid deleted accounts being overtaken by new users with the same email - * address. Any user-related resources like documents or storage files should - * be deleted separately. - * - * @throws {Error} - * @return {Promise} - */ - delete: function() { - let path = '/account'; - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Account Email - * - * Update currently logged in user account email address. After changing user - * address, user confirmation status is being reset and a new confirmation - * mail is sent. For security measures, user password is required to complete - * this request. - * - * @param {string} email - * @param {string} password - * @throws {Error} - * @return {Promise} - */ - updateEmail: function(email, password) { - if(email === undefined) { - throw new Error('Missing required parameter: "email"'); - } - - if(password === undefined) { - throw new Error('Missing required parameter: "password"'); - } - - let path = '/account/email'; - - let payload = {}; - - if(email) { - payload['email'] = email; - } - - if(password) { - payload['password'] = password; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Account Name - * - * Update currently logged in user account name. - * - * @param {string} name - * @throws {Error} - * @return {Promise} - */ - updateName: function(name) { - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/account/name'; - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Account Password - * - * Update currently logged in user password. For validation, user is required - * to pass the password twice. - * - * @param {string} password - * @param {string} oldPassword - * @throws {Error} - * @return {Promise} - */ - updatePassword: function(password, oldPassword) { - if(password === undefined) { - throw new Error('Missing required parameter: "password"'); - } - - if(oldPassword === undefined) { - throw new Error('Missing required parameter: "oldPassword"'); - } - - let path = '/account/password'; - - let payload = {}; - - if(password) { - payload['password'] = password; - } - - if(oldPassword) { - payload['old-password'] = oldPassword; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Account Preferences - * - * Get currently logged in user preferences key-value object. - * - * @throws {Error} - * @return {Promise} - */ - getPrefs: function() { - let path = '/account/prefs'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Account Prefs - * - * Update currently logged in user account preferences. You can pass only the - * specific settings you wish to update. - * - * @param {string} prefs - * @throws {Error} - * @return {Promise} - */ - updatePrefs: function(prefs) { - if(prefs === undefined) { - throw new Error('Missing required parameter: "prefs"'); - } - - let path = '/account/prefs'; - - let payload = {}; - - if(prefs) { - payload['prefs'] = prefs; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Account Security Log - * - * Get currently logged in user list of latest security activity logs. Each - * log returns user IP address, location and date and time of log. - * - * @throws {Error} - * @return {Promise} - */ - getSecurity: function() { - let path = '/account/security'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Account Active Sessions - * - * Get currently logged in user list of active sessions across different - * devices. - * - * @throws {Error} - * @return {Promise} - */ - getSessions: function() { - let path = '/account/sessions'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - } - }; - - let auth = { - - /** - * Login - * - * Allow the user to login into his account by providing a valid email and - * password combination. Use the success and failure arguments to provide a - * redirect URL\'s back to your app when login is completed. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param {string} email - * @param {string} password - * @param {string} success - * @param {string} failure - * @throws {Error} - * @return {null} - */ - login: function(email, password, success = '', failure = '') { - if(email === undefined) { - throw new Error('Missing required parameter: "email"'); - } - - if(password === undefined) { - throw new Error('Missing required parameter: "password"'); - } - - let path = '/auth/login'; - - let payload = {}; - - if(email) { - payload['email'] = email; - } - - if(password) { - payload['password'] = password; - } - - if(success) { - payload['success'] = success; - } - - if(failure) { - payload['failure'] = failure; - } - - payload['project'] = config.project; - - return iframe('post', path, payload); - }, - - /** - * Login with OAuth - * - * Allow the user to login to his account using the OAuth provider of his - * choice. Each OAuth provider should be enabled from the Appwrite console - * first. Use the success and failure arguments to provide a redirect URL's - * back to your app when login is completed. - * - * @param {string} provider - * @param {string} success - * @param {string} failure - * @throws {Error} - * @return {null} - */ - oauth: function(provider, success, failure) { - if(provider === undefined) { - throw new Error('Missing required parameter: "provider"'); - } - - if(success === undefined) { - throw new Error('Missing required parameter: "success"'); - } - - if(failure === undefined) { - throw new Error('Missing required parameter: "failure"'); - } - - let path = '/auth/login/oauth/{provider}'.replace(new RegExp('{provider}', 'g'), provider); - - let payload = {}; - - if(success) { - payload['success'] = success; - } - - if(failure) { - payload['failure'] = failure; - } - - payload['project'] = config.project; - - return iframe('get', path, payload); - }, - - /** - * Logout Current Session - * - * Use this endpoint to log out the currently logged in user from his account. - * When successful this endpoint will delete the user session and remove the - * session secret cookie from the user client. - * - * @throws {Error} - * @return {Promise} - */ - logout: function() { - let path = '/auth/logout'; - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Logout Specific Session - * - * Use this endpoint to log out the currently logged in user from all his - * account sessions across all his different devices. When using the option id - * argument, only the session unique ID provider will be deleted. - * - * @param {string} id - * @throws {Error} - * @return {Promise} - */ - logoutBySession: function(id) { - if(id === undefined) { - throw new Error('Missing required parameter: "id"'); - } - - let path = '/auth/logout/{id}'.replace(new RegExp('{id}', 'g'), id); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Password Recovery - * - * Sends the user an email with a temporary secret token for password reset. - * When the user clicks the confirmation link he is redirected back to your - * app password reset redirect URL with a secret token and email address - * values attached to the URL query string. Use the query string params to - * submit a request to the /auth/password/reset endpoint to complete the - * process. - * - * @param {string} email - * @param {string} reset - * @throws {Error} - * @return {Promise} - */ - recovery: function(email, reset) { - if(email === undefined) { - throw new Error('Missing required parameter: "email"'); - } - - if(reset === undefined) { - throw new Error('Missing required parameter: "reset"'); - } - - let path = '/auth/recovery'; - - let payload = {}; - - if(email) { - payload['email'] = email; - } - - if(reset) { - payload['reset'] = reset; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Password Reset - * - * Use this endpoint to complete the user account password reset. Both the - * **userId** and **token** arguments will be passed as query parameters to - * the redirect URL you have provided when sending your request to the - * /auth/recovery endpoint. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param {string} userId - * @param {string} token - * @param {string} passwordA - * @param {string} passwordB - * @throws {Error} - * @return {Promise} - */ - recoveryReset: function(userId, token, passwordA, passwordB) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(token === undefined) { - throw new Error('Missing required parameter: "token"'); - } - - if(passwordA === undefined) { - throw new Error('Missing required parameter: "passwordA"'); - } - - if(passwordB === undefined) { - throw new Error('Missing required parameter: "passwordB"'); - } - - let path = '/auth/recovery/reset'; - - let payload = {}; - - if(userId) { - payload['userId'] = userId; - } - - if(token) { - payload['token'] = token; - } - - if(passwordA) { - payload['password-a'] = passwordA; - } - - if(passwordB) { - payload['password-b'] = passwordB; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Register - * - * Use this endpoint to allow a new user to register an account in your - * project. Use the success and failure URLs to redirect users back to your - * application after signup completes. - * - * If registration completes successfully user will be sent with a - * confirmation email in order to confirm he is the owner of the account email - * address. Use the confirmation parameter to redirect the user from the - * confirmation email back to your app. When the user is redirected, use the - * /auth/confirm endpoint to complete the account confirmation. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param {string} email - * @param {string} password - * @param {string} confirm - * @param {string} success - * @param {string} failure - * @param {string} name - * @throws {Error} - * @return {null} - */ - register: function(email, password, confirm, success = '', failure = '', name = '') { - if(email === undefined) { - throw new Error('Missing required parameter: "email"'); - } - - if(password === undefined) { - throw new Error('Missing required parameter: "password"'); - } - - if(confirm === undefined) { - throw new Error('Missing required parameter: "confirm"'); - } - - let path = '/auth/register'; - - let payload = {}; - - if(email) { - payload['email'] = email; - } - - if(password) { - payload['password'] = password; - } - - if(confirm) { - payload['confirm'] = confirm; - } - - if(success) { - payload['success'] = success; - } - - if(failure) { - payload['failure'] = failure; - } - - if(name) { - payload['name'] = name; - } - - payload['project'] = config.project; - - return iframe('post', path, payload); - }, - - /** - * Confirmation - * - * Use this endpoint to complete the confirmation of the user account email - * address. Both the **userId** and **token** arguments will be passed as - * query parameters to the redirect URL you have provided when sending your - * request to the /auth/register endpoint. - * - * @param {string} userId - * @param {string} token - * @throws {Error} - * @return {Promise} - */ - confirm: function(userId, token) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(token === undefined) { - throw new Error('Missing required parameter: "token"'); - } - - let path = '/auth/register/confirm'; - - let payload = {}; - - if(userId) { - payload['userId'] = userId; - } - - if(token) { - payload['token'] = token; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Resend Confirmation - * - * This endpoint allows the user to request your app to resend him his email - * confirmation message. The redirect arguments act the same way as in - * /auth/register endpoint. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param {string} confirm - * @throws {Error} - * @return {Promise} - */ - confirmResend: function(confirm) { - if(confirm === undefined) { - throw new Error('Missing required parameter: "confirm"'); - } - - let path = '/auth/register/confirm/resend'; - - let payload = {}; - - if(confirm) { - payload['confirm'] = confirm; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - } - }; - - let avatars = { - - /** - * Get Browser Icon - * - * You can use this endpoint to show different browser icons to your users. - * The code argument receives the browser code as it appears in your user - * /account/sessions endpoint. Use width, height and quality arguments to - * change the output settings. - * - * @param {string} code - * @param {number} width - * @param {number} height - * @param {number} quality - * @throws {Error} - * @return {Promise} - */ - getBrowser: function(code, width = 100, height = 100, quality = 100) { - if(code === undefined) { - throw new Error('Missing required parameter: "code"'); - } - - let path = '/avatars/browsers/{code}'.replace(new RegExp('{code}', 'g'), code); - - let payload = {}; - - if(width) { - payload['width'] = width; - } - - if(height) { - payload['height'] = height; - } - - if(quality) { - payload['quality'] = quality; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Credit Card Icon - * - * Need to display your users with your billing method or their payment - * methods? The credit card endpoint will return you the icon of the credit - * card provider you need. Use width, height and quality arguments to change - * the output settings. - * - * @param {string} code - * @param {number} width - * @param {number} height - * @param {number} quality - * @throws {Error} - * @return {Promise} - */ - getCreditCard: function(code, width = 100, height = 100, quality = 100) { - if(code === undefined) { - throw new Error('Missing required parameter: "code"'); - } - - let path = '/avatars/credit-cards/{code}'.replace(new RegExp('{code}', 'g'), code); - - let payload = {}; - - if(width) { - payload['width'] = width; - } - - if(height) { - payload['height'] = height; - } - - if(quality) { - payload['quality'] = quality; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Favicon - * - * Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote - * website URL. - * - * @param {string} url - * @throws {Error} - * @return {Promise} - */ - getFavicon: function(url) { - if(url === undefined) { - throw new Error('Missing required parameter: "url"'); - } - - let path = '/avatars/favicon'; - - let payload = {}; - - if(url) { - payload['url'] = url; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Country Flag - * - * You can use this endpoint to show different country flags icons to your - * users. The code argument receives the 2 letter country code. Use width, - * height and quality arguments to change the output settings. - * - * @param {string} code - * @param {number} width - * @param {number} height - * @param {number} quality - * @throws {Error} - * @return {Promise} - */ - getFlag: function(code, width = 100, height = 100, quality = 100) { - if(code === undefined) { - throw new Error('Missing required parameter: "code"'); - } - - let path = '/avatars/flags/{code}'.replace(new RegExp('{code}', 'g'), code); - - let payload = {}; - - if(width) { - payload['width'] = width; - } - - if(height) { - payload['height'] = height; - } - - if(quality) { - payload['quality'] = quality; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Image from URL - * - * Use this endpoint to fetch a remote image URL and crop it to any image size - * you want. This endpoint is very useful if you need to crop and display - * remote images in your app or in case you want to make sure a 3rd party - * image is properly served using a TLS protocol. - * - * @param {string} url - * @param {number} width - * @param {number} height - * @throws {Error} - * @return {Promise} - */ - getImage: function(url, width = 400, height = 400) { - if(url === undefined) { - throw new Error('Missing required parameter: "url"'); - } - - let path = '/avatars/image'; - - let payload = {}; - - if(url) { - payload['url'] = url; - } - - if(width) { - payload['width'] = width; - } - - if(height) { - payload['height'] = height; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get QR Code - * - * Converts a given plain text to a QR code image. You can use the query - * parameters to change the size and style of the resulting image. - * - * @param {string} text - * @param {number} size - * @param {number} margin - * @param {number} download - * @throws {Error} - * @return {Promise} - */ - getQR: function(text, size = 400, margin = 1, download = 0) { - if(text === undefined) { - throw new Error('Missing required parameter: "text"'); - } - - let path = '/avatars/qr'; - - let payload = {}; - - if(text) { - payload['text'] = text; - } - - if(size) { - payload['size'] = size; - } - - if(margin) { - payload['margin'] = margin; - } - - if(download) { - payload['download'] = download; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - } - }; - - let database = { - - /** - * List Collections - * - * Get a list of all the user collections. You can use the query params to - * filter your results. On admin mode, this endpoint will return a list of all - * of the project collections. [Learn more about different API - * modes](/docs/admin). - * - * @param {string} search - * @param {number} limit - * @param {number} offset - * @param {string} orderType - * @throws {Error} - * @return {Promise} - */ - listCollections: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/database'; - - let payload = {}; - - if(search) { - payload['search'] = search; - } - - if(limit) { - payload['limit'] = limit; - } - - if(offset) { - payload['offset'] = offset; - } - - if(orderType) { - payload['orderType'] = orderType; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Collection - * - * Create a new Collection. - * - * @param {string} name - * @param {array} read - * @param {array} write - * @param {array} rules - * @throws {Error} - * @return {Promise} - */ - createCollection: function(name, read, write, rules) { - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(read === undefined) { - throw new Error('Missing required parameter: "read"'); - } - - if(write === undefined) { - throw new Error('Missing required parameter: "write"'); - } - - if(rules === undefined) { - throw new Error('Missing required parameter: "rules"'); - } - - let path = '/database'; - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(read) { - payload['read'] = read; - } - - if(write) { - payload['write'] = write; - } - - if(rules) { - payload['rules'] = rules; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Collection - * - * Get collection by its unique ID. This endpoint response returns a JSON - * object with the collection metadata. - * - * @param {string} collectionId - * @throws {Error} - * @return {Promise} - */ - getCollection: function(collectionId) { - if(collectionId === undefined) { - throw new Error('Missing required parameter: "collectionId"'); - } - - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Collection - * - * Update collection by its unique ID. - * - * @param {string} collectionId - * @param {string} name - * @param {array} read - * @param {array} write - * @param {array} rules - * @throws {Error} - * @return {Promise} - */ - updateCollection: function(collectionId, name, read, write, rules = []) { - if(collectionId === undefined) { - throw new Error('Missing required parameter: "collectionId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(read === undefined) { - throw new Error('Missing required parameter: "read"'); - } - - if(write === undefined) { - throw new Error('Missing required parameter: "write"'); - } - - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(read) { - payload['read'] = read; - } - - if(write) { - payload['write'] = write; - } - - if(rules) { - payload['rules'] = rules; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Collection - * - * Delete a collection by its unique ID. Only users with write permissions - * have access to delete this resource. - * - * @param {string} collectionId - * @throws {Error} - * @return {Promise} - */ - deleteCollection: function(collectionId) { - if(collectionId === undefined) { - throw new Error('Missing required parameter: "collectionId"'); - } - - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Documents - * - * Get a list of all the user documents. You can use the query params to - * filter your results. On admin mode, this endpoint will return a list of all - * of the project documents. [Learn more about different API - * modes](/docs/admin). - * - * @param {string} collectionId - * @param {array} filters - * @param {number} offset - * @param {number} limit - * @param {string} orderField - * @param {string} orderType - * @param {string} orderCast - * @param {string} search - * @param {number} first - * @param {number} last - * @throws {Error} - * @return {Promise} - */ - listDocuments: function(collectionId, filters = [], offset = 0, limit = 50, orderField = '$uid', orderType = 'ASC', orderCast = 'string', search = '', first = 0, last = 0) { - if(collectionId === undefined) { - throw new Error('Missing required parameter: "collectionId"'); - } - - let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - let payload = {}; - - if(filters) { - payload['filters'] = filters; - } - - if(offset) { - payload['offset'] = offset; - } - - if(limit) { - payload['limit'] = limit; - } - - if(orderField) { - payload['order-field'] = orderField; - } - - if(orderType) { - payload['order-type'] = orderType; - } - - if(orderCast) { - payload['order-cast'] = orderCast; - } - - if(search) { - payload['search'] = search; - } - - if(first) { - payload['first'] = first; - } - - if(last) { - payload['last'] = last; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Document - * - * Create a new Document. - * - * @param {string} collectionId - * @param {string} data - * @param {array} read - * @param {array} write - * @param {string} parentDocument - * @param {string} parentProperty - * @param {string} parentPropertyType - * @throws {Error} - * @return {Promise} - */ - createDocument: function(collectionId, data, read, write, parentDocument = '', parentProperty = '', parentPropertyType = 'assign') { - if(collectionId === undefined) { - throw new Error('Missing required parameter: "collectionId"'); - } - - if(data === undefined) { - throw new Error('Missing required parameter: "data"'); - } - - if(read === undefined) { - throw new Error('Missing required parameter: "read"'); - } - - if(write === undefined) { - throw new Error('Missing required parameter: "write"'); - } - - let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - let payload = {}; - - if(data) { - payload['data'] = data; - } - - if(read) { - payload['read'] = read; - } - - if(write) { - payload['write'] = write; - } - - if(parentDocument) { - payload['parentDocument'] = parentDocument; - } - - if(parentProperty) { - payload['parentProperty'] = parentProperty; - } - - if(parentPropertyType) { - payload['parentPropertyType'] = parentPropertyType; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Document - * - * Get document by its unique ID. This endpoint response returns a JSON object - * with the document data. - * - * @param {string} collectionId - * @param {string} documentId - * @throws {Error} - * @return {Promise} - */ - getDocument: function(collectionId, documentId) { - if(collectionId === undefined) { - throw new Error('Missing required parameter: "collectionId"'); - } - - if(documentId === undefined) { - throw new Error('Missing required parameter: "documentId"'); - } - - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Document - * - * - * @param {string} collectionId - * @param {string} documentId - * @param {string} data - * @param {array} read - * @param {array} write - * @throws {Error} - * @return {Promise} - */ - updateDocument: function(collectionId, documentId, data, read, write) { - if(collectionId === undefined) { - throw new Error('Missing required parameter: "collectionId"'); - } - - if(documentId === undefined) { - throw new Error('Missing required parameter: "documentId"'); - } - - if(data === undefined) { - throw new Error('Missing required parameter: "data"'); - } - - if(read === undefined) { - throw new Error('Missing required parameter: "read"'); - } - - if(write === undefined) { - throw new Error('Missing required parameter: "write"'); - } - - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); - - let payload = {}; - - if(data) { - payload['data'] = data; - } - - if(read) { - payload['read'] = read; - } - - if(write) { - payload['write'] = write; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Document - * - * Delete document by its unique ID. This endpoint deletes only the parent - * documents, his attributes and relations to other documents. Child documents - * **will not** be deleted. - * - * @param {string} collectionId - * @param {string} documentId - * @throws {Error} - * @return {Promise} - */ - deleteDocument: function(collectionId, documentId) { - if(collectionId === undefined) { - throw new Error('Missing required parameter: "collectionId"'); - } - - if(documentId === undefined) { - throw new Error('Missing required parameter: "documentId"'); - } - - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - } - }; - - let locale = { - - /** - * Get User Locale - * - * Get the current user location based on IP. Returns an object with user - * country code, country name, continent name, continent code, ip address and - * suggested currency. You can use the locale header to get the data in a - * supported language. - * - * @throws {Error} - * @return {Promise} - */ - getLocale: function() { - let path = '/locale'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Countries - * - * List of all continents. You can use the locale header to get the data in a - * supported language. - * - * @throws {Error} - * @return {Promise} - */ - getContinents: function() { - let path = '/locale/continents'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Countries - * - * List of all countries. You can use the locale header to get the data in a - * supported language. - * - * @throws {Error} - * @return {Promise} - */ - getCountries: function() { - let path = '/locale/countries'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List EU Countries - * - * List of all countries that are currently members of the EU. You can use the - * locale header to get the data in a supported language. UK brexit date is - * currently set to 2019-10-31 and will be updated if and when needed. - * - * @throws {Error} - * @return {Promise} - */ - getCountriesEU: function() { - let path = '/locale/countries/eu'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Countries Phone Codes - * - * List of all countries phone codes. You can use the locale header to get the - * data in a supported language. - * - * @throws {Error} - * @return {Promise} - */ - getCountriesPhones: function() { - let path = '/locale/countries/phones'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Currencies - * - * List of all currencies, including currency symol, name, plural, and decimal - * digits for all major and minor currencies. You can use the locale header to - * get the data in a supported language. - * - * @throws {Error} - * @return {Promise} - */ - getCurrencies: function() { - let path = '/locale/currencies'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - } - }; - - let projects = { - - /** - * List Projects - * - * - * @throws {Error} - * @return {Promise} - */ - listProjects: function() { - let path = '/projects'; - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Project - * - * - * @param {string} name - * @param {string} teamId - * @param {string} description - * @param {string} logo - * @param {string} url - * @param {string} legalName - * @param {string} legalCountry - * @param {string} legalState - * @param {string} legalCity - * @param {string} legalAddress - * @param {string} legalTaxId - * @throws {Error} - * @return {Promise} - */ - createProject: function(name, teamId, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - let path = '/projects'; - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(teamId) { - payload['teamId'] = teamId; - } - - if(description) { - payload['description'] = description; - } - - if(logo) { - payload['logo'] = logo; - } - - if(url) { - payload['url'] = url; - } - - if(legalName) { - payload['legalName'] = legalName; - } - - if(legalCountry) { - payload['legalCountry'] = legalCountry; - } - - if(legalState) { - payload['legalState'] = legalState; - } - - if(legalCity) { - payload['legalCity'] = legalCity; - } - - if(legalAddress) { - payload['legalAddress'] = legalAddress; - } - - if(legalTaxId) { - payload['legalTaxId'] = legalTaxId; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Project - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - getProject: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Project - * - * - * @param {string} projectId - * @param {string} name - * @param {string} description - * @param {string} logo - * @param {string} url - * @param {string} legalName - * @param {string} legalCountry - * @param {string} legalState - * @param {string} legalCity - * @param {string} legalAddress - * @param {string} legalTaxId - * @throws {Error} - * @return {Promise} - */ - updateProject: function(projectId, name, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(description) { - payload['description'] = description; - } - - if(logo) { - payload['logo'] = logo; - } - - if(url) { - payload['url'] = url; - } - - if(legalName) { - payload['legalName'] = legalName; - } - - if(legalCountry) { - payload['legalCountry'] = legalCountry; - } - - if(legalState) { - payload['legalState'] = legalState; - } - - if(legalCity) { - payload['legalCity'] = legalCity; - } - - if(legalAddress) { - payload['legalAddress'] = legalAddress; - } - - if(legalTaxId) { - payload['legalTaxId'] = legalTaxId; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Project - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - deleteProject: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Keys - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - listKeys: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Key - * - * - * @param {string} projectId - * @param {string} name - * @param {array} scopes - * @throws {Error} - * @return {Promise} - */ - createKey: function(projectId, name, scopes) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(scopes === undefined) { - throw new Error('Missing required parameter: "scopes"'); - } - - let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(scopes) { - payload['scopes'] = scopes; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Key - * - * - * @param {string} projectId - * @param {string} keyId - * @throws {Error} - * @return {Promise} - */ - getKey: function(projectId, keyId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(keyId === undefined) { - throw new Error('Missing required parameter: "keyId"'); - } - - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Key - * - * - * @param {string} projectId - * @param {string} keyId - * @param {string} name - * @param {array} scopes - * @throws {Error} - * @return {Promise} - */ - updateKey: function(projectId, keyId, name, scopes) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(keyId === undefined) { - throw new Error('Missing required parameter: "keyId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(scopes === undefined) { - throw new Error('Missing required parameter: "scopes"'); - } - - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(scopes) { - payload['scopes'] = scopes; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Key - * - * - * @param {string} projectId - * @param {string} keyId - * @throws {Error} - * @return {Promise} - */ - deleteKey: function(projectId, keyId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(keyId === undefined) { - throw new Error('Missing required parameter: "keyId"'); - } - - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Project OAuth - * - * - * @param {string} projectId - * @param {string} provider - * @param {string} appId - * @param {string} secret - * @throws {Error} - * @return {Promise} - */ - updateProjectOAuth: function(projectId, provider, appId = '', secret = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(provider === undefined) { - throw new Error('Missing required parameter: "provider"'); - } - - let path = '/projects/{projectId}/oauth'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(provider) { - payload['provider'] = provider; - } - - if(appId) { - payload['appId'] = appId; - } - - if(secret) { - payload['secret'] = secret; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Platforms - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - listPlatforms: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Platform - * - * - * @param {string} projectId - * @param {string} type - * @param {string} name - * @param {string} key - * @param {string} store - * @param {string} url - * @throws {Error} - * @return {Promise} - */ - createPlatform: function(projectId, type, name, key = '', store = '', url = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(type === undefined) { - throw new Error('Missing required parameter: "type"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(type) { - payload['type'] = type; - } - - if(name) { - payload['name'] = name; - } - - if(key) { - payload['key'] = key; - } - - if(store) { - payload['store'] = store; - } - - if(url) { - payload['url'] = url; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Platform - * - * - * @param {string} projectId - * @param {string} platformId - * @throws {Error} - * @return {Promise} - */ - getPlatform: function(projectId, platformId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(platformId === undefined) { - throw new Error('Missing required parameter: "platformId"'); - } - - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Platform - * - * - * @param {string} projectId - * @param {string} platformId - * @param {string} name - * @param {string} key - * @param {string} store - * @param {string} url - * @throws {Error} - * @return {Promise} - */ - updatePlatform: function(projectId, platformId, name, key = '', store = '', url = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(platformId === undefined) { - throw new Error('Missing required parameter: "platformId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(key) { - payload['key'] = key; - } - - if(store) { - payload['store'] = store; - } - - if(url) { - payload['url'] = url; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Platform - * - * - * @param {string} projectId - * @param {string} platformId - * @throws {Error} - * @return {Promise} - */ - deletePlatform: function(projectId, platformId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(platformId === undefined) { - throw new Error('Missing required parameter: "platformId"'); - } - - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Tasks - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - listTasks: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Task - * - * - * @param {string} projectId - * @param {string} name - * @param {string} status - * @param {string} schedule - * @param {number} security - * @param {string} httpMethod - * @param {string} httpUrl - * @param {array} httpHeaders - * @param {string} httpUser - * @param {string} httpPass - * @throws {Error} - * @return {Promise} - */ - createTask: function(projectId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(status === undefined) { - throw new Error('Missing required parameter: "status"'); - } - - if(schedule === undefined) { - throw new Error('Missing required parameter: "schedule"'); - } - - if(security === undefined) { - throw new Error('Missing required parameter: "security"'); - } - - if(httpMethod === undefined) { - throw new Error('Missing required parameter: "httpMethod"'); - } - - if(httpUrl === undefined) { - throw new Error('Missing required parameter: "httpUrl"'); - } - - let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(status) { - payload['status'] = status; - } - - if(schedule) { - payload['schedule'] = schedule; - } - - if(security) { - payload['security'] = security; - } - - if(httpMethod) { - payload['httpMethod'] = httpMethod; - } - - if(httpUrl) { - payload['httpUrl'] = httpUrl; - } - - if(httpHeaders) { - payload['httpHeaders'] = httpHeaders; - } - - if(httpUser) { - payload['httpUser'] = httpUser; - } - - if(httpPass) { - payload['httpPass'] = httpPass; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Task - * - * - * @param {string} projectId - * @param {string} taskId - * @throws {Error} - * @return {Promise} - */ - getTask: function(projectId, taskId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(taskId === undefined) { - throw new Error('Missing required parameter: "taskId"'); - } - - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Task - * - * - * @param {string} projectId - * @param {string} taskId - * @param {string} name - * @param {string} status - * @param {string} schedule - * @param {number} security - * @param {string} httpMethod - * @param {string} httpUrl - * @param {array} httpHeaders - * @param {string} httpUser - * @param {string} httpPass - * @throws {Error} - * @return {Promise} - */ - updateTask: function(projectId, taskId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(taskId === undefined) { - throw new Error('Missing required parameter: "taskId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(status === undefined) { - throw new Error('Missing required parameter: "status"'); - } - - if(schedule === undefined) { - throw new Error('Missing required parameter: "schedule"'); - } - - if(security === undefined) { - throw new Error('Missing required parameter: "security"'); - } - - if(httpMethod === undefined) { - throw new Error('Missing required parameter: "httpMethod"'); - } - - if(httpUrl === undefined) { - throw new Error('Missing required parameter: "httpUrl"'); - } - - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(status) { - payload['status'] = status; - } - - if(schedule) { - payload['schedule'] = schedule; - } - - if(security) { - payload['security'] = security; - } - - if(httpMethod) { - payload['httpMethod'] = httpMethod; - } - - if(httpUrl) { - payload['httpUrl'] = httpUrl; - } - - if(httpHeaders) { - payload['httpHeaders'] = httpHeaders; - } - - if(httpUser) { - payload['httpUser'] = httpUser; - } - - if(httpPass) { - payload['httpPass'] = httpPass; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Task - * - * - * @param {string} projectId - * @param {string} taskId - * @throws {Error} - * @return {Promise} - */ - deleteTask: function(projectId, taskId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(taskId === undefined) { - throw new Error('Missing required parameter: "taskId"'); - } - - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Project - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - getProjectUsage: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/usage'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * List Webhooks - * - * - * @param {string} projectId - * @throws {Error} - * @return {Promise} - */ - listWebhooks: function(projectId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Webhook - * - * - * @param {string} projectId - * @param {string} name - * @param {array} events - * @param {string} url - * @param {number} security - * @param {string} httpUser - * @param {string} httpPass - * @throws {Error} - * @return {Promise} - */ - createWebhook: function(projectId, name, events, url, security, httpUser = '', httpPass = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(events === undefined) { - throw new Error('Missing required parameter: "events"'); - } - - if(url === undefined) { - throw new Error('Missing required parameter: "url"'); - } - - if(security === undefined) { - throw new Error('Missing required parameter: "security"'); - } - - let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(events) { - payload['events'] = events; - } - - if(url) { - payload['url'] = url; - } - - if(security) { - payload['security'] = security; - } - - if(httpUser) { - payload['httpUser'] = httpUser; - } - - if(httpPass) { - payload['httpPass'] = httpPass; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Webhook - * - * - * @param {string} projectId - * @param {string} webhookId - * @throws {Error} - * @return {Promise} - */ - getWebhook: function(projectId, webhookId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(webhookId === undefined) { - throw new Error('Missing required parameter: "webhookId"'); - } - - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Webhook - * - * - * @param {string} projectId - * @param {string} webhookId - * @param {string} name - * @param {array} events - * @param {string} url - * @param {number} security - * @param {string} httpUser - * @param {string} httpPass - * @throws {Error} - * @return {Promise} - */ - updateWebhook: function(projectId, webhookId, name, events, url, security, httpUser = '', httpPass = '') { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(webhookId === undefined) { - throw new Error('Missing required parameter: "webhookId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - if(events === undefined) { - throw new Error('Missing required parameter: "events"'); - } - - if(url === undefined) { - throw new Error('Missing required parameter: "url"'); - } - - if(security === undefined) { - throw new Error('Missing required parameter: "security"'); - } - - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(events) { - payload['events'] = events; - } - - if(url) { - payload['url'] = url; - } - - if(security) { - payload['security'] = security; - } - - if(httpUser) { - payload['httpUser'] = httpUser; - } - - if(httpPass) { - payload['httpPass'] = httpPass; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Webhook - * - * - * @param {string} projectId - * @param {string} webhookId - * @throws {Error} - * @return {Promise} - */ - deleteWebhook: function(projectId, webhookId) { - if(projectId === undefined) { - throw new Error('Missing required parameter: "projectId"'); - } - - if(webhookId === undefined) { - throw new Error('Missing required parameter: "webhookId"'); - } - - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - } - }; - - let storage = { - - /** - * List Files - * - * Get a list of all the user files. You can use the query params to filter - * your results. On admin mode, this endpoint will return a list of all of the - * project files. [Learn more about different API modes](/docs/admin). - * - * @param {string} search - * @param {number} limit - * @param {number} offset - * @param {string} orderType - * @throws {Error} - * @return {Promise} - */ - listFiles: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/storage/files'; - - let payload = {}; - - if(search) { - payload['search'] = search; - } - - if(limit) { - payload['limit'] = limit; - } - - if(offset) { - payload['offset'] = offset; - } - - if(orderType) { - payload['orderType'] = orderType; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create File - * - * Create a new file. The user who creates the file will automatically be - * assigned to read and write access unless he has passed custom values for - * read and write arguments. - * - * @param {File} files - * @param {array} read - * @param {array} write - * @throws {Error} - * @return {Promise} - */ - createFile: function(files, read, write) { - if(files === undefined) { - throw new Error('Missing required parameter: "files"'); - } - - if(read === undefined) { - throw new Error('Missing required parameter: "read"'); - } - - if(write === undefined) { - throw new Error('Missing required parameter: "write"'); - } - - let path = '/storage/files'; - - let payload = {}; - - if(files) { - payload['files'] = files; - } - - if(read) { - payload['read'] = read; - } - - if(write) { - payload['write'] = write; - } - - return http - .post(path, { - 'content-type': 'multipart/form-data', - }, payload); - }, - - /** - * Get File - * - * Get file by its unique ID. This endpoint response returns a JSON object - * with the file metadata. - * - * @param {string} fileId - * @throws {Error} - * @return {Promise} - */ - getFile: function(fileId) { - if(fileId === undefined) { - throw new Error('Missing required parameter: "fileId"'); - } - - let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update File - * - * Update file by its unique ID. Only users with write permissions have access - * to update this resource. - * - * @param {string} fileId - * @param {array} read - * @param {array} write - * @throws {Error} - * @return {Promise} - */ - updateFile: function(fileId, read, write) { - if(fileId === undefined) { - throw new Error('Missing required parameter: "fileId"'); - } - - if(read === undefined) { - throw new Error('Missing required parameter: "read"'); - } - - if(write === undefined) { - throw new Error('Missing required parameter: "write"'); - } - - let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); - - let payload = {}; - - if(read) { - payload['read'] = read; - } - - if(write) { - payload['write'] = write; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete File - * - * Delete a file by its unique ID. Only users with write permissions have - * access to delete this resource. - * - * @param {string} fileId - * @throws {Error} - * @return {Promise} - */ - deleteFile: function(fileId) { - if(fileId === undefined) { - throw new Error('Missing required parameter: "fileId"'); - } - - let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get File for Download - * - * Get file content by its unique ID. The endpoint response return with a - * 'Content-Disposition: attachment' header that tells the browser to start - * downloading the file to user downloads directory. - * - * @param {string} fileId - * @throws {Error} - * @return {Promise} - */ - getFileDownload: function(fileId) { - if(fileId === undefined) { - throw new Error('Missing required parameter: "fileId"'); - } - - let path = '/storage/files/{fileId}/download'.replace(new RegExp('{fileId}', 'g'), fileId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get File Preview - * - * Get file preview image. Currently, this method supports preview for image - * files (jpg, png, and gif), other supported formats, like pdf, docs, slides, - * and spreadsheets will return file icon image. You can also pass query - * string arguments for cutting and resizing your preview image. - * - * @param {string} fileId - * @param {number} width - * @param {number} height - * @param {number} quality - * @param {string} background - * @param {string} output - * @throws {Error} - * @return {Promise} - */ - getFilePreview: function(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { - if(fileId === undefined) { - throw new Error('Missing required parameter: "fileId"'); - } - - let path = '/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}', 'g'), fileId); - - let payload = {}; - - if(width) { - payload['width'] = width; - } - - if(height) { - payload['height'] = height; - } - - if(quality) { - payload['quality'] = quality; - } - - if(background) { - payload['background'] = background; - } - - if(output) { - payload['output'] = output; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get File for View - * - * Get file content by its unique ID. This endpoint is similar to the download - * method but returns with no 'Content-Disposition: attachment' header. - * - * @param {string} fileId - * @param {string} as - * @throws {Error} - * @return {Promise} - */ - getFileView: function(fileId, as = '') { - if(fileId === undefined) { - throw new Error('Missing required parameter: "fileId"'); - } - - let path = '/storage/files/{fileId}/view'.replace(new RegExp('{fileId}', 'g'), fileId); - - let payload = {}; - - if(as) { - payload['as'] = as; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - } - }; - - let teams = { - - /** - * List Teams - * - * Get a list of all the current user teams. You can use the query params to - * filter your results. On admin mode, this endpoint will return a list of all - * of the project teams. [Learn more about different API modes](/docs/admin). - * - * @param {string} search - * @param {number} limit - * @param {number} offset - * @param {string} orderType - * @throws {Error} - * @return {Promise} - */ - listTeams: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/teams'; - - let payload = {}; - - if(search) { - payload['search'] = search; - } - - if(limit) { - payload['limit'] = limit; - } - - if(offset) { - payload['offset'] = offset; - } - - if(orderType) { - payload['orderType'] = orderType; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Team - * - * Create a new team. The user who creates the team will automatically be - * assigned as the owner of the team. The team owner can invite new members, - * who will be able add new owners and update or delete the team from your - * project. - * - * @param {string} name - * @param {array} roles - * @throws {Error} - * @return {Promise} - */ - createTeam: function(name, roles = ["owner"]) { - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/teams'; - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - if(roles) { - payload['roles'] = roles; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Team - * - * Get team by its unique ID. All team members have read access for this - * resource. - * - * @param {string} teamId - * @throws {Error} - * @return {Promise} - */ - getTeam: function(teamId) { - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Team - * - * Update team by its unique ID. Only team owners have write access for this - * resource. - * - * @param {string} teamId - * @param {string} name - * @throws {Error} - * @return {Promise} - */ - updateTeam: function(teamId, name) { - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - if(name === undefined) { - throw new Error('Missing required parameter: "name"'); - } - - let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); - - let payload = {}; - - if(name) { - payload['name'] = name; - } - - return http - .put(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Team - * - * Delete team by its unique ID. Only team owners have write access for this - * resource. - * - * @param {string} teamId - * @throws {Error} - * @return {Promise} - */ - deleteTeam: function(teamId) { - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get Team Members - * - * Get team members by the team unique ID. All team members have read access - * for this list of resources. - * - * @param {string} teamId - * @throws {Error} - * @return {Promise} - */ - getTeamMembers: function(teamId) { - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - let path = '/teams/{teamId}/members'.replace(new RegExp('{teamId}', 'g'), teamId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Team Membership - * - * Use this endpoint to invite a new member to your team. An email with a link - * to join the team will be sent to the new member email address. If member - * doesn't exists in the project it will be automatically created. - * - * Use the redirect parameter to redirect the user from the invitation email - * back to your app. When the user is redirected, use the - * /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the - * user to the team. - * - * Please notice that in order to avoid a [Redirect - * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URL's are the once from domains you have set when - * added your platforms in the console interface. - * - * @param {string} teamId - * @param {string} email - * @param {array} roles - * @param {string} redirect - * @param {string} name - * @throws {Error} - * @return {Promise} - */ - createTeamMembership: function(teamId, email, roles, redirect, name = '') { - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - if(email === undefined) { - throw new Error('Missing required parameter: "email"'); - } - - if(roles === undefined) { - throw new Error('Missing required parameter: "roles"'); - } - - if(redirect === undefined) { - throw new Error('Missing required parameter: "redirect"'); - } - - let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); - - let payload = {}; - - if(email) { - payload['email'] = email; - } - - if(name) { - payload['name'] = name; - } - - if(roles) { - payload['roles'] = roles; - } - - if(redirect) { - payload['redirect'] = redirect; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete Team Membership - * - * This endpoint allows a user to leave a team or for a team owner to delete - * the membership of any other team member. - * - * @param {string} teamId - * @param {string} inviteId - * @throws {Error} - * @return {Promise} - */ - deleteTeamMembership: function(teamId, inviteId) { - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - if(inviteId === undefined) { - throw new Error('Missing required parameter: "inviteId"'); - } - - let path = '/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create Team Membership (Resend) - * - * Use this endpoint to resend your invitation email for a user to join a - * team. - * - * @param {string} teamId - * @param {string} inviteId - * @param {string} redirect - * @throws {Error} - * @return {Promise} - */ - createTeamMembershipResend: function(teamId, inviteId, redirect) { - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - if(inviteId === undefined) { - throw new Error('Missing required parameter: "inviteId"'); - } - - if(redirect === undefined) { - throw new Error('Missing required parameter: "redirect"'); - } - - let path = '/teams/{teamId}/memberships/{inviteId}/resend'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); - - let payload = {}; - - if(redirect) { - payload['redirect'] = redirect; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update Team Membership Status - * - * Use this endpoint to let user accept an invitation to join a team after he - * is being redirect back to your app from the invitation email. Use the - * success and failure URL's to redirect users back to your application after - * the request completes. - * - * Please notice that in order to avoid a [Redirect - * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URL's are the once from domains you have set when - * added your platforms in the console interface. - * - * When not using the success or failure redirect arguments this endpoint will - * result with a 200 status code on success and with 401 status error on - * failure. This behavior was applied to help the web clients deal with - * browsers who don't allow to set 3rd party HTTP cookies needed for saving - * the account session token. - * - * @param {string} teamId - * @param {string} inviteId - * @param {string} userId - * @param {string} secret - * @param {string} success - * @param {string} failure - * @throws {Error} - * @return {null} - */ - updateTeamMembershipStatus: function(teamId, inviteId, userId, secret, success = '', failure = '') { - if(teamId === undefined) { - throw new Error('Missing required parameter: "teamId"'); - } - - if(inviteId === undefined) { - throw new Error('Missing required parameter: "inviteId"'); - } - - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(secret === undefined) { - throw new Error('Missing required parameter: "secret"'); - } - - let path = '/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); - - let payload = {}; - - if(userId) { - payload['userId'] = userId; - } - - if(secret) { - payload['secret'] = secret; - } - - if(success) { - payload['success'] = success; - } - - if(failure) { - payload['failure'] = failure; - } - - payload['project'] = config.project; - - return iframe('patch', path, payload); - } - }; - - let users = { - - /** - * List Users - * - * Get a list of all the project users. You can use the query params to filter - * your results. - * - * @param {string} search - * @param {number} limit - * @param {number} offset - * @param {string} orderType - * @throws {Error} - * @return {Promise} - */ - listUsers: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/users'; - - let payload = {}; - - if(search) { - payload['search'] = search; - } - - if(limit) { - payload['limit'] = limit; - } - - if(offset) { - payload['offset'] = offset; - } - - if(orderType) { - payload['orderType'] = orderType; - } - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Create User - * - * Create a new user. - * - * @param {string} email - * @param {string} password - * @param {string} name - * @throws {Error} - * @return {Promise} - */ - createUser: function(email, password, name = '') { - if(email === undefined) { - throw new Error('Missing required parameter: "email"'); - } - - if(password === undefined) { - throw new Error('Missing required parameter: "password"'); - } - - let path = '/users'; - - let payload = {}; - - if(email) { - payload['email'] = email; - } - - if(password) { - payload['password'] = password; - } - - if(name) { - payload['name'] = name; - } - - return http - .post(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get User - * - * Get user by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - getUser: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get User Logs - * - * Get user activity logs list by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - getUserLogs: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}/logs'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get User Prefs - * - * Get user preferences by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - getUserPrefs: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update User Prefs - * - * Update user preferences by its unique ID. You can pass only the specific - * settings you wish to update. - * - * @param {string} userId - * @param {string} prefs - * @throws {Error} - * @return {Promise} - */ - updateUserPrefs: function(userId, prefs) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(prefs === undefined) { - throw new Error('Missing required parameter: "prefs"'); - } - - let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - if(prefs) { - payload['prefs'] = prefs; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Get User Sessions - * - * Get user sessions list by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - getUserSessions: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .get(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete User Sessions - * - * Delete all user sessions by its unique ID. - * - * @param {string} userId - * @throws {Error} - * @return {Promise} - */ - deleteUserSessions: function(userId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Delete User Session - * - * Delete user sessions by its unique ID. - * - * @param {string} userId - * @param {string} sessionId - * @throws {Error} - * @return {Promise} - */ - deleteUserSession: function(userId, sessionId) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(sessionId === undefined) { - throw new Error('Missing required parameter: "sessionId"'); - } - - let path = '/users/{userId}/sessions/:session'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - if(sessionId) { - payload['sessionId'] = sessionId; - } - - return http - .delete(path, { - 'content-type': 'application/json', - }, payload); - }, - - /** - * Update User Status - * - * Update user status by its unique ID. - * - * @param {string} userId - * @param {string} status - * @throws {Error} - * @return {Promise} - */ - updateUserStatus: function(userId, status) { - if(userId === undefined) { - throw new Error('Missing required parameter: "userId"'); - } - - if(status === undefined) { - throw new Error('Missing required parameter: "status"'); - } - - let path = '/users/{userId}/status'.replace(new RegExp('{userId}', 'g'), userId); - - let payload = {}; - - if(status) { - payload['status'] = status; - } - - return http - .patch(path, { - 'content-type': 'application/json', - }, payload); - } - }; - - return { - setEndpoint: setEndpoint, - setProject: setProject, - setKey: setKey, - setLocale: setLocale, - setMode: setMode, - account: account, - auth: auth, - avatars: avatars, - database: database, - locale: locale, - projects: projects, - storage: storage, - teams: teams, - users: users - }; - }; - - if(typeof module !== "undefined") { - module.exports = window.Appwrite; - } - -})((typeof window !== "undefined") ? window : {}); \ No newline at end of file diff --git a/app/sdks/js/src/sdk.min.js b/app/sdks/js/src/sdk.min.js deleted file mode 100644 index f921d5801a..0000000000 --- a/app/sdks/js/src/sdk.min.js +++ /dev/null @@ -1,361 +0,0 @@ -(function(window){'use strict';window.Appwrite=function(){let config={endpoint:'https://appwrite.io/v1',project:'',key:'',locale:'',mode:'',};let setEndpoint=function(endpoint){config.endpoint=endpoint;return this};let setProject=function(value){http.addGlobalHeader('X-Appwrite-Project',value);config.project=value;return this};let setKey=function(value){http.addGlobalHeader('X-Appwrite-Key',value);config.key=value;return this};let setLocale=function(value){http.addGlobalHeader('X-Appwrite-Locale',value);config.locale=value;return this};let setMode=function(value){http.addGlobalHeader('X-Appwrite-Mode',value);config.mode=value;return this};let http=function(document){let globalParams=[],globalHeaders=[];let addParam=function(url,param,value){let a=document.createElement('a'),regex=/(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g;let match,str=[];a.href=url;param=encodeURIComponent(param);while(match=regex.exec(a.search))if(param!==match[1])str.push(match[1]+(match[2]?"="+match[2]:""));str.push(param+(value?"="+encodeURIComponent(value):""));a.search=str.join("&");return a.href};let buildQuery=function(params){let str=[];for(let p in params){if(Array.isArray(params[p])){for(let index=0;index=request.status){let data=request.response;let contentType=this.getResponseHeader('content-type')||'';contentType=contentType.substring(0,contentType.indexOf(';'));switch(contentType){case 'application/json':data=JSON.parse(data);break} -resolve(data)}else{reject(new Error(request.statusText))}};if(progress){request.addEventListener('progress',progress);request.upload.addEventListener('progress',progress,!1)} -request.onerror=function(){reject(new Error("Network Error"))};request.send(params)})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{})},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress)},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress)},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress)},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress)},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let iframe=function(method,url,params){let form=document.createElement('form');form.setAttribute('method',method);form.setAttribute('action',config.endpoint+url);for(let key in params){if(params.hasOwnProperty(key)){let hiddenField=document.createElement("input");hiddenField.setAttribute("type","hidden");hiddenField.setAttribute("name",key);hiddenField.setAttribute("value",params[key]);form.appendChild(hiddenField)}} -document.body.appendChild(form);return form.submit()};let account={get:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload)},delete:function(){let path='/account';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateEmail:function(email,password){if(email===undefined){throw new Error('Missing required parameter: "email"')} -if(password===undefined){throw new Error('Missing required parameter: "password"')} -let path='/account/email';let payload={};if(email){payload.email=email} -if(password){payload.password=password} -return http.patch(path,{'content-type':'application/json',},payload)},updateName:function(name){if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/account/name';let payload={};if(name){payload.name=name} -return http.patch(path,{'content-type':'application/json',},payload)},updatePassword:function(password,oldPassword){if(password===undefined){throw new Error('Missing required parameter: "password"')} -if(oldPassword===undefined){throw new Error('Missing required parameter: "oldPassword"')} -let path='/account/password';let payload={};if(password){payload.password=password} -if(oldPassword){payload['old-password']=oldPassword} -return http.patch(path,{'content-type':'application/json',},payload)},getPrefs:function(){let path='/account/prefs';let payload={};return http.get(path,{'content-type':'application/json',},payload)},updatePrefs:function(prefs){if(prefs===undefined){throw new Error('Missing required parameter: "prefs"')} -let path='/account/prefs';let payload={};if(prefs){payload.prefs=prefs} -return http.patch(path,{'content-type':'application/json',},payload)},getSecurity:function(){let path='/account/security';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getSessions:function(){let path='/account/sessions';let payload={};return http.get(path,{'content-type':'application/json',},payload)}};let auth={login:function(email,password,success='',failure=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} -if(password===undefined){throw new Error('Missing required parameter: "password"')} -let path='/auth/login';let payload={};if(email){payload.email=email} -if(password){payload.password=password} -if(success){payload.success=success} -if(failure){payload.failure=failure} -payload.project=config.project;return iframe('post',path,payload)},oauth:function(provider,success,failure){if(provider===undefined){throw new Error('Missing required parameter: "provider"')} -if(success===undefined){throw new Error('Missing required parameter: "success"')} -if(failure===undefined){throw new Error('Missing required parameter: "failure"')} -let path='/auth/login/oauth/{provider}'.replace(new RegExp('{provider}','g'),provider);let payload={};if(success){payload.success=success} -if(failure){payload.failure=failure} -payload.project=config.project;return iframe('get',path,payload)},logout:function(){let path='/auth/logout';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},logoutBySession:function(id){if(id===undefined){throw new Error('Missing required parameter: "id"')} -let path='/auth/logout/{id}'.replace(new RegExp('{id}','g'),id);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},recovery:function(email,reset){if(email===undefined){throw new Error('Missing required parameter: "email"')} -if(reset===undefined){throw new Error('Missing required parameter: "reset"')} -let path='/auth/recovery';let payload={};if(email){payload.email=email} -if(reset){payload.reset=reset} -return http.post(path,{'content-type':'application/json',},payload)},recoveryReset:function(userId,token,passwordA,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(token===undefined){throw new Error('Missing required parameter: "token"')} -if(passwordA===undefined){throw new Error('Missing required parameter: "passwordA"')} -if(passwordB===undefined){throw new Error('Missing required parameter: "passwordB"')} -let path='/auth/recovery/reset';let payload={};if(userId){payload.userId=userId} -if(token){payload.token=token} -if(passwordA){payload['password-a']=passwordA} -if(passwordB){payload['password-b']=passwordB} -return http.put(path,{'content-type':'application/json',},payload)},register:function(email,password,confirm,success='',failure='',name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} -if(password===undefined){throw new Error('Missing required parameter: "password"')} -if(confirm===undefined){throw new Error('Missing required parameter: "confirm"')} -let path='/auth/register';let payload={};if(email){payload.email=email} -if(password){payload.password=password} -if(confirm){payload.confirm=confirm} -if(success){payload.success=success} -if(failure){payload.failure=failure} -if(name){payload.name=name} -payload.project=config.project;return iframe('post',path,payload)},confirm:function(userId,token){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(token===undefined){throw new Error('Missing required parameter: "token"')} -let path='/auth/register/confirm';let payload={};if(userId){payload.userId=userId} -if(token){payload.token=token} -return http.post(path,{'content-type':'application/json',},payload)},confirmResend:function(confirm){if(confirm===undefined){throw new Error('Missing required parameter: "confirm"')} -let path='/auth/register/confirm/resend';let payload={};if(confirm){payload.confirm=confirm} -return http.post(path,{'content-type':'application/json',},payload)}};let avatars={getBrowser:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"')} -let path='/avatars/browsers/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload.width=width} -if(height){payload.height=height} -if(quality){payload.quality=quality} -return http.get(path,{'content-type':'application/json',},payload)},getCreditCard:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"')} -let path='/avatars/credit-cards/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload.width=width} -if(height){payload.height=height} -if(quality){payload.quality=quality} -return http.get(path,{'content-type':'application/json',},payload)},getFavicon:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"')} -let path='/avatars/favicon';let payload={};if(url){payload.url=url} -return http.get(path,{'content-type':'application/json',},payload)},getFlag:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"')} -let path='/avatars/flags/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload.width=width} -if(height){payload.height=height} -if(quality){payload.quality=quality} -return http.get(path,{'content-type':'application/json',},payload)},getImage:function(url,width=400,height=400){if(url===undefined){throw new Error('Missing required parameter: "url"')} -let path='/avatars/image';let payload={};if(url){payload.url=url} -if(width){payload.width=width} -if(height){payload.height=height} -return http.get(path,{'content-type':'application/json',},payload)},getQR:function(text,size=400,margin=1,download=0){if(text===undefined){throw new Error('Missing required parameter: "text"')} -let path='/avatars/qr';let payload={};if(text){payload.text=text} -if(size){payload.size=size} -if(margin){payload.margin=margin} -if(download){payload.download=download} -return http.get(path,{'content-type':'application/json',},payload)}};let database={listCollections:function(search='',limit=25,offset=0,orderType='ASC'){let path='/database';let payload={};if(search){payload.search=search} -if(limit){payload.limit=limit} -if(offset){payload.offset=offset} -if(orderType){payload.orderType=orderType} -return http.get(path,{'content-type':'application/json',},payload)},createCollection:function(name,read,write,rules){if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(read===undefined){throw new Error('Missing required parameter: "read"')} -if(write===undefined){throw new Error('Missing required parameter: "write"')} -if(rules===undefined){throw new Error('Missing required parameter: "rules"')} -let path='/database';let payload={};if(name){payload.name=name} -if(read){payload.read=read} -if(write){payload.write=write} -if(rules){payload.rules=rules} -return http.post(path,{'content-type':'application/json',},payload)},getCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateCollection:function(collectionId,name,read,write,rules=[]){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(read===undefined){throw new Error('Missing required parameter: "read"')} -if(write===undefined){throw new Error('Missing required parameter: "write"')} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(name){payload.name=name} -if(read){payload.read=read} -if(write){payload.write=write} -if(rules){payload.rules=rules} -return http.put(path,{'content-type':'application/json',},payload)},deleteCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listDocuments:function(collectionId,filters=[],offset=0,limit=50,orderField='$uid',orderType='ASC',orderCast='string',search='',first=0,last=0){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -let path='/database/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(filters){payload.filters=filters} -if(offset){payload.offset=offset} -if(limit){payload.limit=limit} -if(orderField){payload['order-field']=orderField} -if(orderType){payload['order-type']=orderType} -if(orderCast){payload['order-cast']=orderCast} -if(search){payload.search=search} -if(first){payload.first=first} -if(last){payload.last=last} -return http.get(path,{'content-type':'application/json',},payload)},createDocument:function(collectionId,data,read,write,parentDocument='',parentProperty='',parentPropertyType='assign'){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -if(data===undefined){throw new Error('Missing required parameter: "data"')} -if(read===undefined){throw new Error('Missing required parameter: "read"')} -if(write===undefined){throw new Error('Missing required parameter: "write"')} -let path='/database/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(data){payload.data=data} -if(read){payload.read=read} -if(write){payload.write=write} -if(parentDocument){payload.parentDocument=parentDocument} -if(parentProperty){payload.parentProperty=parentProperty} -if(parentPropertyType){payload.parentPropertyType=parentPropertyType} -return http.post(path,{'content-type':'application/json',},payload)},getDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateDocument:function(collectionId,documentId,data,read,write){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} -if(data===undefined){throw new Error('Missing required parameter: "data"')} -if(read===undefined){throw new Error('Missing required parameter: "read"')} -if(write===undefined){throw new Error('Missing required parameter: "write"')} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};if(data){payload.data=data} -if(read){payload.read=read} -if(write){payload.write=write} -return http.patch(path,{'content-type':'application/json',},payload)},deleteDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let locale={getLocale:function(){let path='/locale';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getContinents:function(){let path='/locale/continents';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountries:function(){let path='/locale/countries';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesEU:function(){let path='/locale/countries/eu';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesPhones:function(){let path='/locale/countries/phones';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCurrencies:function(){let path='/locale/currencies';let payload={};return http.get(path,{'content-type':'application/json',},payload)}};let projects={listProjects:function(){let path='/projects';let payload={};return http.get(path,{'content-type':'application/json',},payload)},createProject:function(name,teamId,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -let path='/projects';let payload={};if(name){payload.name=name} -if(teamId){payload.teamId=teamId} -if(description){payload.description=description} -if(logo){payload.logo=logo} -if(url){payload.url=url} -if(legalName){payload.legalName=legalName} -if(legalCountry){payload.legalCountry=legalCountry} -if(legalState){payload.legalState=legalState} -if(legalCity){payload.legalCity=legalCity} -if(legalAddress){payload.legalAddress=legalAddress} -if(legalTaxId){payload.legalTaxId=legalTaxId} -return http.post(path,{'content-type':'application/json',},payload)},getProject:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateProject:function(projectId,name,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} -if(description){payload.description=description} -if(logo){payload.logo=logo} -if(url){payload.url=url} -if(legalName){payload.legalName=legalName} -if(legalCountry){payload.legalCountry=legalCountry} -if(legalState){payload.legalState=legalState} -if(legalCity){payload.legalCity=legalCity} -if(legalAddress){payload.legalAddress=legalAddress} -if(legalTaxId){payload.legalTaxId=legalTaxId} -return http.patch(path,{'content-type':'application/json',},payload)},deleteProject:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listKeys:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createKey:function(projectId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(scopes===undefined){throw new Error('Missing required parameter: "scopes"')} -let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} -if(scopes){payload.scopes=scopes} -return http.post(path,{'content-type':'application/json',},payload)},getKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} -let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateKey:function(projectId,keyId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(scopes===undefined){throw new Error('Missing required parameter: "scopes"')} -let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};if(name){payload.name=name} -if(scopes){payload.scopes=scopes} -return http.put(path,{'content-type':'application/json',},payload)},deleteKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(keyId===undefined){throw new Error('Missing required parameter: "keyId"')} -let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateProjectOAuth:function(projectId,provider,appId='',secret=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(provider===undefined){throw new Error('Missing required parameter: "provider"')} -let path='/projects/{projectId}/oauth'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(provider){payload.provider=provider} -if(appId){payload.appId=appId} -if(secret){payload.secret=secret} -return http.patch(path,{'content-type':'application/json',},payload)},listPlatforms:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createPlatform:function(projectId,type,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(type===undefined){throw new Error('Missing required parameter: "type"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(type){payload.type=type} -if(name){payload.name=name} -if(key){payload.key=key} -if(store){payload.store=store} -if(url){payload.url=url} -return http.post(path,{'content-type':'application/json',},payload)},getPlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} -let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updatePlatform:function(projectId,platformId,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};if(name){payload.name=name} -if(key){payload.key=key} -if(store){payload.store=store} -if(url){payload.url=url} -return http.put(path,{'content-type':'application/json',},payload)},deletePlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(platformId===undefined){throw new Error('Missing required parameter: "platformId"')} -let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listTasks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/tasks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createTask:function(projectId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(status===undefined){throw new Error('Missing required parameter: "status"')} -if(schedule===undefined){throw new Error('Missing required parameter: "schedule"')} -if(security===undefined){throw new Error('Missing required parameter: "security"')} -if(httpMethod===undefined){throw new Error('Missing required parameter: "httpMethod"')} -if(httpUrl===undefined){throw new Error('Missing required parameter: "httpUrl"')} -let path='/projects/{projectId}/tasks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} -if(status){payload.status=status} -if(schedule){payload.schedule=schedule} -if(security){payload.security=security} -if(httpMethod){payload.httpMethod=httpMethod} -if(httpUrl){payload.httpUrl=httpUrl} -if(httpHeaders){payload.httpHeaders=httpHeaders} -if(httpUser){payload.httpUser=httpUser} -if(httpPass){payload.httpPass=httpPass} -return http.post(path,{'content-type':'application/json',},payload)},getTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} -let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateTask:function(projectId,taskId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(status===undefined){throw new Error('Missing required parameter: "status"')} -if(schedule===undefined){throw new Error('Missing required parameter: "schedule"')} -if(security===undefined){throw new Error('Missing required parameter: "security"')} -if(httpMethod===undefined){throw new Error('Missing required parameter: "httpMethod"')} -if(httpUrl===undefined){throw new Error('Missing required parameter: "httpUrl"')} -let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};if(name){payload.name=name} -if(status){payload.status=status} -if(schedule){payload.schedule=schedule} -if(security){payload.security=security} -if(httpMethod){payload.httpMethod=httpMethod} -if(httpUrl){payload.httpUrl=httpUrl} -if(httpHeaders){payload.httpHeaders=httpHeaders} -if(httpUser){payload.httpUser=httpUser} -if(httpPass){payload.httpPass=httpPass} -return http.put(path,{'content-type':'application/json',},payload)},deleteTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(taskId===undefined){throw new Error('Missing required parameter: "taskId"')} -let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getProjectUsage:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/usage'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},listWebhooks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -let path='/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createWebhook:function(projectId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(events===undefined){throw new Error('Missing required parameter: "events"')} -if(url===undefined){throw new Error('Missing required parameter: "url"')} -if(security===undefined){throw new Error('Missing required parameter: "security"')} -let path='/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload.name=name} -if(events){payload.events=events} -if(url){payload.url=url} -if(security){payload.security=security} -if(httpUser){payload.httpUser=httpUser} -if(httpPass){payload.httpPass=httpPass} -return http.post(path,{'content-type':'application/json',},payload)},getWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateWebhook:function(projectId,webhookId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -if(events===undefined){throw new Error('Missing required parameter: "events"')} -if(url===undefined){throw new Error('Missing required parameter: "url"')} -if(security===undefined){throw new Error('Missing required parameter: "security"')} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};if(name){payload.name=name} -if(events){payload.events=events} -if(url){payload.url=url} -if(security){payload.security=security} -if(httpUser){payload.httpUser=httpUser} -if(httpPass){payload.httpPass=httpPass} -return http.put(path,{'content-type':'application/json',},payload)},deleteWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"')} -if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"')} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let storage={listFiles:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';let payload={};if(search){payload.search=search} -if(limit){payload.limit=limit} -if(offset){payload.offset=offset} -if(orderType){payload.orderType=orderType} -return http.get(path,{'content-type':'application/json',},payload)},createFile:function(files,read,write){if(files===undefined){throw new Error('Missing required parameter: "files"')} -if(read===undefined){throw new Error('Missing required parameter: "read"')} -if(write===undefined){throw new Error('Missing required parameter: "write"')} -let path='/storage/files';let payload={};if(files){payload.files=files} -if(read){payload.read=read} -if(write){payload.write=write} -return http.post(path,{'content-type':'multipart/form-data',},payload)},getFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateFile:function(fileId,read,write){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -if(read===undefined){throw new Error('Missing required parameter: "read"')} -if(write===undefined){throw new Error('Missing required parameter: "write"')} -let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(read){payload.read=read} -if(write){payload.write=write} -return http.put(path,{'content-type':'application/json',},payload)},deleteFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getFileDownload:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -let path='/storage/files/{fileId}/download'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getFilePreview:function(fileId,width=0,height=0,quality=100,background='',output=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -let path='/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(width){payload.width=width} -if(height){payload.height=height} -if(quality){payload.quality=quality} -if(background){payload.background=background} -if(output){payload.output=output} -return http.get(path,{'content-type':'application/json',},payload)},getFileView:function(fileId,as=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -let path='/storage/files/{fileId}/view'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(as){payload.as=as} -return http.get(path,{'content-type':'application/json',},payload)}};let teams={listTeams:function(search='',limit=25,offset=0,orderType='ASC'){let path='/teams';let payload={};if(search){payload.search=search} -if(limit){payload.limit=limit} -if(offset){payload.offset=offset} -if(orderType){payload.orderType=orderType} -return http.get(path,{'content-type':'application/json',},payload)},createTeam:function(name,roles=["owner"]){if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/teams';let payload={};if(name){payload.name=name} -if(roles){payload.roles=roles} -return http.post(path,{'content-type':'application/json',},payload)},getTeam:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateTeam:function(teamId,name){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -if(name===undefined){throw new Error('Missing required parameter: "name"')} -let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};if(name){payload.name=name} -return http.put(path,{'content-type':'application/json',},payload)},deleteTeam:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getTeamMembers:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -let path='/teams/{teamId}/members'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createTeamMembership:function(teamId,email,roles,redirect,name=''){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -if(email===undefined){throw new Error('Missing required parameter: "email"')} -if(roles===undefined){throw new Error('Missing required parameter: "roles"')} -if(redirect===undefined){throw new Error('Missing required parameter: "redirect"')} -let path='/teams/{teamId}/memberships'.replace(new RegExp('{teamId}','g'),teamId);let payload={};if(email){payload.email=email} -if(name){payload.name=name} -if(roles){payload.roles=roles} -if(redirect){payload.redirect=redirect} -return http.post(path,{'content-type':'application/json',},payload)},deleteTeamMembership:function(teamId,inviteId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"')} -let path='/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createTeamMembershipResend:function(teamId,inviteId,redirect){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"')} -if(redirect===undefined){throw new Error('Missing required parameter: "redirect"')} -let path='/teams/{teamId}/memberships/{inviteId}/resend'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};if(redirect){payload.redirect=redirect} -return http.post(path,{'content-type':'application/json',},payload)},updateTeamMembershipStatus:function(teamId,inviteId,userId,secret,success='',failure=''){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"')} -if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(secret===undefined){throw new Error('Missing required parameter: "secret"')} -let path='/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};if(userId){payload.userId=userId} -if(secret){payload.secret=secret} -if(success){payload.success=success} -if(failure){payload.failure=failure} -payload.project=config.project;return iframe('patch',path,payload)}};let users={listUsers:function(search='',limit=25,offset=0,orderType='ASC'){let path='/users';let payload={};if(search){payload.search=search} -if(limit){payload.limit=limit} -if(offset){payload.offset=offset} -if(orderType){payload.orderType=orderType} -return http.get(path,{'content-type':'application/json',},payload)},createUser:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} -if(password===undefined){throw new Error('Missing required parameter: "password"')} -let path='/users';let payload={};if(email){payload.email=email} -if(password){payload.password=password} -if(name){payload.name=name} -return http.post(path,{'content-type':'application/json',},payload)},getUser:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getUserLogs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}/logs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getUserPrefs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateUserPrefs:function(userId,prefs){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(prefs===undefined){throw new Error('Missing required parameter: "prefs"')} -let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};if(prefs){payload.prefs=prefs} -return http.patch(path,{'content-type':'application/json',},payload)},getUserSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},deleteUserSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},deleteUserSession:function(userId,sessionId){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(sessionId===undefined){throw new Error('Missing required parameter: "sessionId"')} -let path='/users/{userId}/sessions/:session'.replace(new RegExp('{userId}','g'),userId);let payload={};if(sessionId){payload.sessionId=sessionId} -return http.delete(path,{'content-type':'application/json',},payload)},updateUserStatus:function(userId,status){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} -if(status===undefined){throw new Error('Missing required parameter: "status"')} -let path='/users/{userId}/status'.replace(new RegExp('{userId}','g'),userId);let payload={};if(status){payload.status=status} -return http.patch(path,{'content-type':'application/json',},payload)}};return{setEndpoint:setEndpoint,setProject:setProject,setKey:setKey,setLocale:setLocale,setMode:setMode,account:account,auth:auth,avatars:avatars,database:database,locale:locale,projects:projects,storage:storage,teams:teams,users:users}};if(typeof module!=="undefined"){module.exports=window.Appwrite}})((typeof window!=="undefined")?window:{}) \ No newline at end of file diff --git a/app/sdks/node/LICENSE b/app/sdks/node/LICENSE deleted file mode 100644 index fc7c051a91..0000000000 --- a/app/sdks/node/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/sdks/node/README.md b/app/sdks/node/README.md deleted file mode 100644 index 51a4ba0454..0000000000 --- a/app/sdks/node/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Appwrite SDK for NodeJS - -![License](https://img.shields.io/github/license/appwrite/sdk-for-node.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) - -**This SDK is compatible with Appwrite server version 0.4.0. For older versions, please check previous releases.** - -Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) - - - -![Appwrite](https://appwrite.io/images/github.png) - -## Installation - -To install via [NPM](https://www.npmjs.com/): - -```bash -npm install node-appwrite --save -``` - -## License - -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/delete.md b/app/sdks/node/docs/examples/account/delete.md deleted file mode 100644 index 0710fd6dfc..0000000000 --- a/app/sdks/node/docs/examples/account/delete.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.delete(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/get-prefs.md b/app/sdks/node/docs/examples/account/get-prefs.md deleted file mode 100644 index bdff57e923..0000000000 --- a/app/sdks/node/docs/examples/account/get-prefs.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.getPrefs(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/get-security.md b/app/sdks/node/docs/examples/account/get-security.md deleted file mode 100644 index 03a6561fff..0000000000 --- a/app/sdks/node/docs/examples/account/get-security.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.getSecurity(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/get-sessions.md b/app/sdks/node/docs/examples/account/get-sessions.md deleted file mode 100644 index 02b464a497..0000000000 --- a/app/sdks/node/docs/examples/account/get-sessions.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.getSessions(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/get.md b/app/sdks/node/docs/examples/account/get.md deleted file mode 100644 index b2e078d061..0000000000 --- a/app/sdks/node/docs/examples/account/get.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.get(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/update-email.md b/app/sdks/node/docs/examples/account/update-email.md deleted file mode 100644 index 29b50314f2..0000000000 --- a/app/sdks/node/docs/examples/account/update-email.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.updateEmail('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/update-name.md b/app/sdks/node/docs/examples/account/update-name.md deleted file mode 100644 index d8b4734cbb..0000000000 --- a/app/sdks/node/docs/examples/account/update-name.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.updateName('[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/update-password.md b/app/sdks/node/docs/examples/account/update-password.md deleted file mode 100644 index 5aa6622ffa..0000000000 --- a/app/sdks/node/docs/examples/account/update-password.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.updatePassword('password', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/account/update-prefs.md b/app/sdks/node/docs/examples/account/update-prefs.md deleted file mode 100644 index c76e735e18..0000000000 --- a/app/sdks/node/docs/examples/account/update-prefs.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') - .setKey('') -; - -let promise = account.updatePrefs('{}'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/confirm-resend.md b/app/sdks/node/docs/examples/auth/confirm-resend.md deleted file mode 100644 index 443870394b..0000000000 --- a/app/sdks/node/docs/examples/auth/confirm-resend.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client - .setProject('') - .setKey('') -; - -let promise = auth.confirmResend('https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/confirm.md b/app/sdks/node/docs/examples/auth/confirm.md deleted file mode 100644 index 527df2d6ff..0000000000 --- a/app/sdks/node/docs/examples/auth/confirm.md +++ /dev/null @@ -1,17 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client -; - -let promise = auth.confirm('[USER_ID]', '[TOKEN]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/login.md b/app/sdks/node/docs/examples/auth/login.md deleted file mode 100644 index 1033b6f30f..0000000000 --- a/app/sdks/node/docs/examples/auth/login.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client - .setProject('') - .setKey('') -; - -let promise = auth.login('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/logout-by-session.md b/app/sdks/node/docs/examples/auth/logout-by-session.md deleted file mode 100644 index df964c0caf..0000000000 --- a/app/sdks/node/docs/examples/auth/logout-by-session.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client - .setProject('') - .setKey('') -; - -let promise = auth.logoutBySession('[ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/logout.md b/app/sdks/node/docs/examples/auth/logout.md deleted file mode 100644 index d34102cbd7..0000000000 --- a/app/sdks/node/docs/examples/auth/logout.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client - .setProject('') - .setKey('') -; - -let promise = auth.logout(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/oauth-callback.md b/app/sdks/node/docs/examples/auth/oauth-callback.md deleted file mode 100644 index 2588802fed..0000000000 --- a/app/sdks/node/docs/examples/auth/oauth-callback.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new Auth.Client(); - -let auth = new sdk.Auth(client); - -client - setProject('') - setKey('') -; - -let promise = auth.oauthCallback('[PROJECT_ID]', 'bitbucket', '[CODE]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/oauth.md b/app/sdks/node/docs/examples/auth/oauth.md deleted file mode 100644 index 4a2230c686..0000000000 --- a/app/sdks/node/docs/examples/auth/oauth.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client - .setProject('') - .setKey('') -; - -let promise = auth.oauth('bitbucket', 'https://example.com', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/recovery-reset.md b/app/sdks/node/docs/examples/auth/recovery-reset.md deleted file mode 100644 index f43a8b3305..0000000000 --- a/app/sdks/node/docs/examples/auth/recovery-reset.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client - .setProject('') - .setKey('') -; - -let promise = auth.recoveryReset('[USER_ID]', '[TOKEN]', 'password', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/recovery.md b/app/sdks/node/docs/examples/auth/recovery.md deleted file mode 100644 index 9e340a7f32..0000000000 --- a/app/sdks/node/docs/examples/auth/recovery.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client - .setProject('') - .setKey('') -; - -let promise = auth.recovery('email@example.com', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/auth/register.md b/app/sdks/node/docs/examples/auth/register.md deleted file mode 100644 index 708719a56f..0000000000 --- a/app/sdks/node/docs/examples/auth/register.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let auth = new sdk.Auth(client); - -client - .setProject('') - .setKey('') -; - -let promise = auth.register('email@example.com', 'password', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/avatars/get-browser.md b/app/sdks/node/docs/examples/avatars/get-browser.md deleted file mode 100644 index 50d3fefcf1..0000000000 --- a/app/sdks/node/docs/examples/avatars/get-browser.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let avatars = new sdk.Avatars(client); - -client - .setProject('') - .setKey('') -; - -let promise = avatars.getBrowser('aa'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/avatars/get-credit-card.md b/app/sdks/node/docs/examples/avatars/get-credit-card.md deleted file mode 100644 index f64488cc12..0000000000 --- a/app/sdks/node/docs/examples/avatars/get-credit-card.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let avatars = new sdk.Avatars(client); - -client - .setProject('') - .setKey('') -; - -let promise = avatars.getCreditCard('amex'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/avatars/get-favicon.md b/app/sdks/node/docs/examples/avatars/get-favicon.md deleted file mode 100644 index ac449e9f1a..0000000000 --- a/app/sdks/node/docs/examples/avatars/get-favicon.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let avatars = new sdk.Avatars(client); - -client - .setProject('') - .setKey('') -; - -let promise = avatars.getFavicon('https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/avatars/get-flag.md b/app/sdks/node/docs/examples/avatars/get-flag.md deleted file mode 100644 index d53f2aa555..0000000000 --- a/app/sdks/node/docs/examples/avatars/get-flag.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let avatars = new sdk.Avatars(client); - -client - .setProject('') - .setKey('') -; - -let promise = avatars.getFlag('af'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/avatars/get-image.md b/app/sdks/node/docs/examples/avatars/get-image.md deleted file mode 100644 index e541b90e61..0000000000 --- a/app/sdks/node/docs/examples/avatars/get-image.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let avatars = new sdk.Avatars(client); - -client - .setProject('') - .setKey('') -; - -let promise = avatars.getImage('https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/avatars/get-q-r.md b/app/sdks/node/docs/examples/avatars/get-q-r.md deleted file mode 100644 index 9611a617ef..0000000000 --- a/app/sdks/node/docs/examples/avatars/get-q-r.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let avatars = new sdk.Avatars(client); - -client - .setProject('') - .setKey('') -; - -let promise = avatars.getQR('[TEXT]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/create-collection.md b/app/sdks/node/docs/examples/database/create-collection.md deleted file mode 100644 index c7ea8d43e1..0000000000 --- a/app/sdks/node/docs/examples/database/create-collection.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.createCollection('[NAME]', [], [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/create-document.md b/app/sdks/node/docs/examples/database/create-document.md deleted file mode 100644 index 9a15f133d5..0000000000 --- a/app/sdks/node/docs/examples/database/create-document.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.createDocument('[COLLECTION_ID]', '{}', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/delete-collection.md b/app/sdks/node/docs/examples/database/delete-collection.md deleted file mode 100644 index 7be40b41bf..0000000000 --- a/app/sdks/node/docs/examples/database/delete-collection.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.deleteCollection('[COLLECTION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/delete-document.md b/app/sdks/node/docs/examples/database/delete-document.md deleted file mode 100644 index d74f2dd16c..0000000000 --- a/app/sdks/node/docs/examples/database/delete-document.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.deleteDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/get-collection.md b/app/sdks/node/docs/examples/database/get-collection.md deleted file mode 100644 index 69a39382bf..0000000000 --- a/app/sdks/node/docs/examples/database/get-collection.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.getCollection('[COLLECTION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/get-document.md b/app/sdks/node/docs/examples/database/get-document.md deleted file mode 100644 index 5a676580bd..0000000000 --- a/app/sdks/node/docs/examples/database/get-document.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.getDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/list-collections.md b/app/sdks/node/docs/examples/database/list-collections.md deleted file mode 100644 index 2f746de896..0000000000 --- a/app/sdks/node/docs/examples/database/list-collections.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.listCollections(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/list-documents.md b/app/sdks/node/docs/examples/database/list-documents.md deleted file mode 100644 index 641a572420..0000000000 --- a/app/sdks/node/docs/examples/database/list-documents.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.listDocuments('[COLLECTION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/update-collection.md b/app/sdks/node/docs/examples/database/update-collection.md deleted file mode 100644 index d393606e8f..0000000000 --- a/app/sdks/node/docs/examples/database/update-collection.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.updateCollection('[COLLECTION_ID]', '[NAME]', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/database/update-document.md b/app/sdks/node/docs/examples/database/update-document.md deleted file mode 100644 index b281187da4..0000000000 --- a/app/sdks/node/docs/examples/database/update-document.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let database = new sdk.Database(client); - -client - .setProject('') - .setKey('') -; - -let promise = database.updateDocument('[COLLECTION_ID]', '[DOCUMENT_ID]', '{}', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/locale/get-continents.md b/app/sdks/node/docs/examples/locale/get-continents.md deleted file mode 100644 index 3c2143cf06..0000000000 --- a/app/sdks/node/docs/examples/locale/get-continents.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let locale = new sdk.Locale(client); - -client - .setProject('') - .setKey('') -; - -let promise = locale.getContinents(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/locale/get-countries-e-u.md b/app/sdks/node/docs/examples/locale/get-countries-e-u.md deleted file mode 100644 index 3aabf5713b..0000000000 --- a/app/sdks/node/docs/examples/locale/get-countries-e-u.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let locale = new sdk.Locale(client); - -client - .setProject('') - .setKey('') -; - -let promise = locale.getCountriesEU(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/locale/get-countries-phones.md b/app/sdks/node/docs/examples/locale/get-countries-phones.md deleted file mode 100644 index 79cc6f5b6b..0000000000 --- a/app/sdks/node/docs/examples/locale/get-countries-phones.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let locale = new sdk.Locale(client); - -client - .setProject('') - .setKey('') -; - -let promise = locale.getCountriesPhones(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/locale/get-countries.md b/app/sdks/node/docs/examples/locale/get-countries.md deleted file mode 100644 index a4e878bc6a..0000000000 --- a/app/sdks/node/docs/examples/locale/get-countries.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let locale = new sdk.Locale(client); - -client - .setProject('') - .setKey('') -; - -let promise = locale.getCountries(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/locale/get-currencies.md b/app/sdks/node/docs/examples/locale/get-currencies.md deleted file mode 100644 index 59d8137dee..0000000000 --- a/app/sdks/node/docs/examples/locale/get-currencies.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let locale = new sdk.Locale(client); - -client - .setProject('') - .setKey('') -; - -let promise = locale.getCurrencies(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/locale/get-locale.md b/app/sdks/node/docs/examples/locale/get-locale.md deleted file mode 100644 index 57e5d69e78..0000000000 --- a/app/sdks/node/docs/examples/locale/get-locale.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let locale = new sdk.Locale(client); - -client - .setProject('') - .setKey('') -; - -let promise = locale.getLocale(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/create-key.md b/app/sdks/node/docs/examples/projects/create-key.md deleted file mode 100644 index 227e8fc5ba..0000000000 --- a/app/sdks/node/docs/examples/projects/create-key.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.createKey('[PROJECT_ID]', '[NAME]', []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/create-platform.md b/app/sdks/node/docs/examples/projects/create-platform.md deleted file mode 100644 index ce9c7e01e1..0000000000 --- a/app/sdks/node/docs/examples/projects/create-platform.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.createPlatform('[PROJECT_ID]', 'web', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/create-project.md b/app/sdks/node/docs/examples/projects/create-project.md deleted file mode 100644 index 8f0d8b47ef..0000000000 --- a/app/sdks/node/docs/examples/projects/create-project.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.createProject('[NAME]', '[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/create-task.md b/app/sdks/node/docs/examples/projects/create-task.md deleted file mode 100644 index 8923742294..0000000000 --- a/app/sdks/node/docs/examples/projects/create-task.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/create-webhook.md b/app/sdks/node/docs/examples/projects/create-webhook.md deleted file mode 100644 index 8135e8d66e..0000000000 --- a/app/sdks/node/docs/examples/projects/create-webhook.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/delete-key.md b/app/sdks/node/docs/examples/projects/delete-key.md deleted file mode 100644 index 3ca5caba8a..0000000000 --- a/app/sdks/node/docs/examples/projects/delete-key.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.deleteKey('[PROJECT_ID]', '[KEY_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/delete-platform.md b/app/sdks/node/docs/examples/projects/delete-platform.md deleted file mode 100644 index 8c01703dd0..0000000000 --- a/app/sdks/node/docs/examples/projects/delete-platform.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.deletePlatform('[PROJECT_ID]', '[PLATFORM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/delete-project.md b/app/sdks/node/docs/examples/projects/delete-project.md deleted file mode 100644 index 7755f35c1f..0000000000 --- a/app/sdks/node/docs/examples/projects/delete-project.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.deleteProject('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/delete-task.md b/app/sdks/node/docs/examples/projects/delete-task.md deleted file mode 100644 index a3b985b784..0000000000 --- a/app/sdks/node/docs/examples/projects/delete-task.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.deleteTask('[PROJECT_ID]', '[TASK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/delete-webhook.md b/app/sdks/node/docs/examples/projects/delete-webhook.md deleted file mode 100644 index 3b41b8c433..0000000000 --- a/app/sdks/node/docs/examples/projects/delete-webhook.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.deleteWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/get-key.md b/app/sdks/node/docs/examples/projects/get-key.md deleted file mode 100644 index e0b2a85856..0000000000 --- a/app/sdks/node/docs/examples/projects/get-key.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.getKey('[PROJECT_ID]', '[KEY_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/get-platform.md b/app/sdks/node/docs/examples/projects/get-platform.md deleted file mode 100644 index c035141e0c..0000000000 --- a/app/sdks/node/docs/examples/projects/get-platform.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.getPlatform('[PROJECT_ID]', '[PLATFORM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/get-project-usage.md b/app/sdks/node/docs/examples/projects/get-project-usage.md deleted file mode 100644 index 32c13c13a3..0000000000 --- a/app/sdks/node/docs/examples/projects/get-project-usage.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.getProjectUsage('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/get-project.md b/app/sdks/node/docs/examples/projects/get-project.md deleted file mode 100644 index 15b685a554..0000000000 --- a/app/sdks/node/docs/examples/projects/get-project.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.getProject('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/get-task.md b/app/sdks/node/docs/examples/projects/get-task.md deleted file mode 100644 index 83040a39f1..0000000000 --- a/app/sdks/node/docs/examples/projects/get-task.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.getTask('[PROJECT_ID]', '[TASK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/get-webhook.md b/app/sdks/node/docs/examples/projects/get-webhook.md deleted file mode 100644 index cb98367d6f..0000000000 --- a/app/sdks/node/docs/examples/projects/get-webhook.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.getWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/list-keys.md b/app/sdks/node/docs/examples/projects/list-keys.md deleted file mode 100644 index a0a894a68e..0000000000 --- a/app/sdks/node/docs/examples/projects/list-keys.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.listKeys('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/list-platforms.md b/app/sdks/node/docs/examples/projects/list-platforms.md deleted file mode 100644 index bb7f1370cb..0000000000 --- a/app/sdks/node/docs/examples/projects/list-platforms.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.listPlatforms('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/list-projects.md b/app/sdks/node/docs/examples/projects/list-projects.md deleted file mode 100644 index e4651ef686..0000000000 --- a/app/sdks/node/docs/examples/projects/list-projects.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.listProjects(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/list-tasks.md b/app/sdks/node/docs/examples/projects/list-tasks.md deleted file mode 100644 index 98e381116f..0000000000 --- a/app/sdks/node/docs/examples/projects/list-tasks.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.listTasks('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/list-webhooks.md b/app/sdks/node/docs/examples/projects/list-webhooks.md deleted file mode 100644 index 35da55721b..0000000000 --- a/app/sdks/node/docs/examples/projects/list-webhooks.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.listWebhooks('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/update-key.md b/app/sdks/node/docs/examples/projects/update-key.md deleted file mode 100644 index cd445aef25..0000000000 --- a/app/sdks/node/docs/examples/projects/update-key.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.updateKey('[PROJECT_ID]', '[KEY_ID]', '[NAME]', []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/update-platform.md b/app/sdks/node/docs/examples/projects/update-platform.md deleted file mode 100644 index 6adcad9ed9..0000000000 --- a/app/sdks/node/docs/examples/projects/update-platform.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.updatePlatform('[PROJECT_ID]', '[PLATFORM_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/update-project-o-auth.md b/app/sdks/node/docs/examples/projects/update-project-o-auth.md deleted file mode 100644 index 229f7e9c3b..0000000000 --- a/app/sdks/node/docs/examples/projects/update-project-o-auth.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.updateProjectOAuth('[PROJECT_ID]', 'bitbucket'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/update-project.md b/app/sdks/node/docs/examples/projects/update-project.md deleted file mode 100644 index 486cef2a4d..0000000000 --- a/app/sdks/node/docs/examples/projects/update-project.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.updateProject('[PROJECT_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/update-task.md b/app/sdks/node/docs/examples/projects/update-task.md deleted file mode 100644 index 06f0dd21e4..0000000000 --- a/app/sdks/node/docs/examples/projects/update-task.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/projects/update-webhook.md b/app/sdks/node/docs/examples/projects/update-webhook.md deleted file mode 100644 index 4a74848fca..0000000000 --- a/app/sdks/node/docs/examples/projects/update-webhook.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') - .setKey('') -; - -let promise = projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/storage/create-file.md b/app/sdks/node/docs/examples/storage/create-file.md deleted file mode 100644 index f0c9d4c5a8..0000000000 --- a/app/sdks/node/docs/examples/storage/create-file.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.createFile(document.getElementById('uploader').files[0], [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/storage/delete-file.md b/app/sdks/node/docs/examples/storage/delete-file.md deleted file mode 100644 index 9e8d13880f..0000000000 --- a/app/sdks/node/docs/examples/storage/delete-file.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.deleteFile('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/storage/get-file-download.md b/app/sdks/node/docs/examples/storage/get-file-download.md deleted file mode 100644 index 2967170695..0000000000 --- a/app/sdks/node/docs/examples/storage/get-file-download.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.getFileDownload('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/storage/get-file-preview.md b/app/sdks/node/docs/examples/storage/get-file-preview.md deleted file mode 100644 index 0c09e8ca8d..0000000000 --- a/app/sdks/node/docs/examples/storage/get-file-preview.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.getFilePreview('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/storage/get-file-view.md b/app/sdks/node/docs/examples/storage/get-file-view.md deleted file mode 100644 index a3074fbed1..0000000000 --- a/app/sdks/node/docs/examples/storage/get-file-view.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.getFileView('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/storage/get-file.md b/app/sdks/node/docs/examples/storage/get-file.md deleted file mode 100644 index a1a3baf009..0000000000 --- a/app/sdks/node/docs/examples/storage/get-file.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.getFile('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/storage/list-files.md b/app/sdks/node/docs/examples/storage/list-files.md deleted file mode 100644 index 59a331a2b5..0000000000 --- a/app/sdks/node/docs/examples/storage/list-files.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.listFiles(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/storage/update-file.md b/app/sdks/node/docs/examples/storage/update-file.md deleted file mode 100644 index 3741785996..0000000000 --- a/app/sdks/node/docs/examples/storage/update-file.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.updateFile('[FILE_ID]', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/create-team-membership-resend.md b/app/sdks/node/docs/examples/teams/create-team-membership-resend.md deleted file mode 100644 index 1f387d0b3b..0000000000 --- a/app/sdks/node/docs/examples/teams/create-team-membership-resend.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.createTeamMembershipResend('[TEAM_ID]', '[INVITE_ID]', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/create-team-membership.md b/app/sdks/node/docs/examples/teams/create-team-membership.md deleted file mode 100644 index 7a2c9be298..0000000000 --- a/app/sdks/node/docs/examples/teams/create-team-membership.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.createTeamMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/create-team.md b/app/sdks/node/docs/examples/teams/create-team.md deleted file mode 100644 index 73dd77ecc5..0000000000 --- a/app/sdks/node/docs/examples/teams/create-team.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.createTeam('[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/delete-team-membership.md b/app/sdks/node/docs/examples/teams/delete-team-membership.md deleted file mode 100644 index 435a65026f..0000000000 --- a/app/sdks/node/docs/examples/teams/delete-team-membership.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.deleteTeamMembership('[TEAM_ID]', '[INVITE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/delete-team.md b/app/sdks/node/docs/examples/teams/delete-team.md deleted file mode 100644 index 0204d40c98..0000000000 --- a/app/sdks/node/docs/examples/teams/delete-team.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.deleteTeam('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/get-team-members.md b/app/sdks/node/docs/examples/teams/get-team-members.md deleted file mode 100644 index 35fd3062fe..0000000000 --- a/app/sdks/node/docs/examples/teams/get-team-members.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.getTeamMembers('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/get-team.md b/app/sdks/node/docs/examples/teams/get-team.md deleted file mode 100644 index b716b7ea01..0000000000 --- a/app/sdks/node/docs/examples/teams/get-team.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.getTeam('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/list-teams.md b/app/sdks/node/docs/examples/teams/list-teams.md deleted file mode 100644 index 609c708753..0000000000 --- a/app/sdks/node/docs/examples/teams/list-teams.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.listTeams(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/update-team-membership-status.md b/app/sdks/node/docs/examples/teams/update-team-membership-status.md deleted file mode 100644 index 8d65bf33b0..0000000000 --- a/app/sdks/node/docs/examples/teams/update-team-membership-status.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.updateTeamMembershipStatus('[TEAM_ID]', '[INVITE_ID]', '[USER_ID]', '[SECRET]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/teams/update-team.md b/app/sdks/node/docs/examples/teams/update-team.md deleted file mode 100644 index 6afb377091..0000000000 --- a/app/sdks/node/docs/examples/teams/update-team.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.updateTeam('[TEAM_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/create-user.md b/app/sdks/node/docs/examples/users/create-user.md deleted file mode 100644 index d07ab1eabf..0000000000 --- a/app/sdks/node/docs/examples/users/create-user.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.createUser('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/delete-user-session.md b/app/sdks/node/docs/examples/users/delete-user-session.md deleted file mode 100644 index dab704e2d4..0000000000 --- a/app/sdks/node/docs/examples/users/delete-user-session.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.deleteUserSession('[USER_ID]', '[SESSION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/delete-user-sessions.md b/app/sdks/node/docs/examples/users/delete-user-sessions.md deleted file mode 100644 index 33f803298d..0000000000 --- a/app/sdks/node/docs/examples/users/delete-user-sessions.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.deleteUserSessions('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/delete-users-session.md b/app/sdks/node/docs/examples/users/delete-users-session.md deleted file mode 100644 index 530503da4b..0000000000 --- a/app/sdks/node/docs/examples/users/delete-users-session.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.deleteUsersSession('[USER_ID]', '[SESSION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/get-user-logs.md b/app/sdks/node/docs/examples/users/get-user-logs.md deleted file mode 100644 index 85d0a125a0..0000000000 --- a/app/sdks/node/docs/examples/users/get-user-logs.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.getUserLogs('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/get-user-prefs.md b/app/sdks/node/docs/examples/users/get-user-prefs.md deleted file mode 100644 index 46d959e1cb..0000000000 --- a/app/sdks/node/docs/examples/users/get-user-prefs.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.getUserPrefs('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/get-user-sessions.md b/app/sdks/node/docs/examples/users/get-user-sessions.md deleted file mode 100644 index b3dfe28405..0000000000 --- a/app/sdks/node/docs/examples/users/get-user-sessions.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.getUserSessions('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/get-user.md b/app/sdks/node/docs/examples/users/get-user.md deleted file mode 100644 index 96676c0196..0000000000 --- a/app/sdks/node/docs/examples/users/get-user.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.getUser('[USER_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/list-users.md b/app/sdks/node/docs/examples/users/list-users.md deleted file mode 100644 index 455e42db4d..0000000000 --- a/app/sdks/node/docs/examples/users/list-users.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.listUsers(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/update-user-prefs.md b/app/sdks/node/docs/examples/users/update-user-prefs.md deleted file mode 100644 index beacba0b0a..0000000000 --- a/app/sdks/node/docs/examples/users/update-user-prefs.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.updateUserPrefs('[USER_ID]', '{}'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/docs/examples/users/update-user-status.md b/app/sdks/node/docs/examples/users/update-user-status.md deleted file mode 100644 index 858833a50c..0000000000 --- a/app/sdks/node/docs/examples/users/update-user-status.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.updateUserStatus('[USER_ID]', '1'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/node/index.js b/app/sdks/node/index.js deleted file mode 100644 index f4b28948ae..0000000000 --- a/app/sdks/node/index.js +++ /dev/null @@ -1,23 +0,0 @@ -const Client = require('./lib/client.js'); -const Account = require('./lib/services/account.js'); -const Auth = require('./lib/services/auth.js'); -const Avatars = require('./lib/services/avatars.js'); -const Database = require('./lib/services/database.js'); -const Locale = require('./lib/services/locale.js'); -const Projects = require('./lib/services/projects.js'); -const Storage = require('./lib/services/storage.js'); -const Teams = require('./lib/services/teams.js'); -const Users = require('./lib/services/users.js'); - -module.exports = { - Client, - Account, - Auth, - Avatars, - Database, - Locale, - Projects, - Storage, - Teams, - Users, -}; \ No newline at end of file diff --git a/app/sdks/node/lib/client.js b/app/sdks/node/lib/client.js deleted file mode 100644 index 253bf95f02..0000000000 --- a/app/sdks/node/lib/client.js +++ /dev/null @@ -1,122 +0,0 @@ -const URL = require('url').URL; -const request = require('request-promise-native'); - -class Client { - - constructor() { - this.endpoint = 'https://appwrite.io/v1'; - this.headers = { - 'content-type': '', - 'x-sdk-version': 'appwrite:nodejs:1.0.31', - }; - this.selfSigned = false; - } - - /** - * Set Project - * - * Your Appwrite project ID - * - * @param string value - * - * @return self - */ - setProject(value) { - this.addHeader('X-Appwrite-Project', value); - - return this; - } - - /** - * Set Key - * - * Your Appwrite project secret key - * - * @param string value - * - * @return self - */ - setKey(value) { - this.addHeader('X-Appwrite-Key', value); - - return this; - } - - /** - * Set Locale - * - * @param string value - * - * @return self - */ - setLocale(value) { - this.addHeader('X-Appwrite-Locale', value); - - return this; - } - - /** - * Set Mode - * - * @param string value - * - * @return self - */ - setMode(value) { - this.addHeader('X-Appwrite-Mode', value); - - return this; - } - - /*** - * @param bool status - * @return this - */ - setSelfSigned(status = true) { - this.selfSigned = status; - - return this; - } - - /*** - * @param endpoint - * @return this - */ - setEndpoint(endpoint) - { - this.endpoint = endpoint; - - return this; - } - - /** - * @param key string - * @param value string - */ - addHeader(key, value) { - this.headers[key.toLowerCase()] = value.toLowerCase(); - - return this; - } - - call(method, path = '', headers = {}, params = {}) { - if(this.selfSigned) { // Allow self signed requests - process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; - } - - headers = Object.assign(this.headers, headers); - - let options = { - method: method.toUpperCase(), - uri: this.endpoint + path, - qs: (method.toUpperCase() === 'GET') ? params : {}, - headers: headers, - body: (method.toUpperCase() === 'GET') ? '' : params, - json: (headers['content-type'].toLowerCase().startsWith('application/json')), - }; - - return request(options); - } -} - -module.exports = Client; \ No newline at end of file diff --git a/app/sdks/node/lib/service.js b/app/sdks/node/lib/service.js deleted file mode 100644 index e799c064be..0000000000 --- a/app/sdks/node/lib/service.js +++ /dev/null @@ -1,10 +0,0 @@ -class Service { - /** - * @param client - */ - constructor(client) { - this.client = client; - } -} - -module.exports = Service; \ No newline at end of file diff --git a/app/sdks/node/lib/services/account.js b/app/sdks/node/lib/services/account.js deleted file mode 100644 index 327c1c80fd..0000000000 --- a/app/sdks/node/lib/services/account.js +++ /dev/null @@ -1,191 +0,0 @@ -const Service = require('../service.js'); - -class Account extends Service { - - /** - * Get Account - * - * Get currently logged in user data as JSON object. - * - * @throws Exception - * @return {} - */ - async get() { - let path = '/account'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Delete Account - * - * Delete a currently logged in user account. Behind the scene, the user - * record is not deleted but permanently blocked from any access. This is done - * to avoid deleted accounts being overtaken by new users with the same email - * address. Any user-related resources like documents or storage files should - * be deleted separately. - * - * @throws Exception - * @return {} - */ - async delete() { - let path = '/account'; - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Account Email - * - * Update currently logged in user account email address. After changing user - * address, user confirmation status is being reset and a new confirmation - * mail is sent. For security measures, user password is required to complete - * this request. - * - * @param string email - * @param string password - * @throws Exception - * @return {} - */ - async updateEmail(email, password) { - let path = '/account/email'; - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'password': password - }); - } - - /** - * Update Account Name - * - * Update currently logged in user account name. - * - * @param string name - * @throws Exception - * @return {} - */ - async updateName(name) { - let path = '/account/name'; - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'name': name - }); - } - - /** - * Update Account Password - * - * Update currently logged in user password. For validation, user is required - * to pass the password twice. - * - * @param string password - * @param string oldPassword - * @throws Exception - * @return {} - */ - async updatePassword(password, oldPassword) { - let path = '/account/password'; - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'password': password, - 'old-password': oldPassword - }); - } - - /** - * Get Account Preferences - * - * Get currently logged in user preferences key-value object. - * - * @throws Exception - * @return {} - */ - async getPrefs() { - let path = '/account/prefs'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Account Prefs - * - * Update currently logged in user account preferences. You can pass only the - * specific settings you wish to update. - * - * @param string prefs - * @throws Exception - * @return {} - */ - async updatePrefs(prefs) { - let path = '/account/prefs'; - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'prefs': prefs - }); - } - - /** - * Get Account Security Log - * - * Get currently logged in user list of latest security activity logs. Each - * log returns user IP address, location and date and time of log. - * - * @throws Exception - * @return {} - */ - async getSecurity() { - let path = '/account/security'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Get Account Active Sessions - * - * Get currently logged in user list of active sessions across different - * devices. - * - * @throws Exception - * @return {} - */ - async getSessions() { - let path = '/account/sessions'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } -} - -module.exports = Account; \ No newline at end of file diff --git a/app/sdks/node/lib/services/auth.js b/app/sdks/node/lib/services/auth.js deleted file mode 100644 index c88bb9bdf5..0000000000 --- a/app/sdks/node/lib/services/auth.js +++ /dev/null @@ -1,274 +0,0 @@ -const Service = require('../service.js'); - -class Auth extends Service { - - /** - * Login - * - * Allow the user to login into his account by providing a valid email and - * password combination. Use the success and failure arguments to provide a - * redirect URL\'s back to your app when login is completed. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param string email - * @param string password - * @param string success - * @param string failure - * @throws Exception - * @return {} - */ - async login(email, password, success = '', failure = '') { - let path = '/auth/login'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'password': password, - 'success': success, - 'failure': failure - }); - } - - /** - * Login with OAuth - * - * Allow the user to login to his account using the OAuth provider of his - * choice. Each OAuth provider should be enabled from the Appwrite console - * first. Use the success and failure arguments to provide a redirect URL's - * back to your app when login is completed. - * - * @param string provider - * @param string success - * @param string failure - * @throws Exception - * @return {} - */ - async oauth(provider, success, failure) { - let path = '/auth/login/oauth/{provider}'.replace(new RegExp('{provider}', 'g'), provider); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'success': success, - 'failure': failure - }); - } - - /** - * Logout Current Session - * - * Use this endpoint to log out the currently logged in user from his account. - * When successful this endpoint will delete the user session and remove the - * session secret cookie from the user client. - * - * @throws Exception - * @return {} - */ - async logout() { - let path = '/auth/logout'; - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Logout Specific Session - * - * Use this endpoint to log out the currently logged in user from all his - * account sessions across all his different devices. When using the option id - * argument, only the session unique ID provider will be deleted. - * - * @param string id - * @throws Exception - * @return {} - */ - async logoutBySession(id) { - let path = '/auth/logout/{id}'.replace(new RegExp('{id}', 'g'), id); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Password Recovery - * - * Sends the user an email with a temporary secret token for password reset. - * When the user clicks the confirmation link he is redirected back to your - * app password reset redirect URL with a secret token and email address - * values attached to the URL query string. Use the query string params to - * submit a request to the /auth/password/reset endpoint to complete the - * process. - * - * @param string email - * @param string reset - * @throws Exception - * @return {} - */ - async recovery(email, reset) { - let path = '/auth/recovery'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'reset': reset - }); - } - - /** - * Password Reset - * - * Use this endpoint to complete the user account password reset. Both the - * **userId** and **token** arguments will be passed as query parameters to - * the redirect URL you have provided when sending your request to the - * /auth/recovery endpoint. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param string userId - * @param string token - * @param string passwordA - * @param string passwordB - * @throws Exception - * @return {} - */ - async recoveryReset(userId, token, passwordA, passwordB) { - let path = '/auth/recovery/reset'; - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'userId': userId, - 'token': token, - 'password-a': passwordA, - 'password-b': passwordB - }); - } - - /** - * Register - * - * Use this endpoint to allow a new user to register an account in your - * project. Use the success and failure URLs to redirect users back to your - * application after signup completes. - * - * If registration completes successfully user will be sent with a - * confirmation email in order to confirm he is the owner of the account email - * address. Use the confirmation parameter to redirect the user from the - * confirmation email back to your app. When the user is redirected, use the - * /auth/confirm endpoint to complete the account confirmation. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param string email - * @param string password - * @param string confirm - * @param string success - * @param string failure - * @param string name - * @throws Exception - * @return {} - */ - async register(email, password, confirm, success = '', failure = '', name = '') { - let path = '/auth/register'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'password': password, - 'confirm': confirm, - 'success': success, - 'failure': failure, - 'name': name - }); - } - - /** - * Confirmation - * - * Use this endpoint to complete the confirmation of the user account email - * address. Both the **userId** and **token** arguments will be passed as - * query parameters to the redirect URL you have provided when sending your - * request to the /auth/register endpoint. - * - * @param string userId - * @param string token - * @throws Exception - * @return {} - */ - async confirm(userId, token) { - let path = '/auth/register/confirm'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'userId': userId, - 'token': token - }); - } - - /** - * Resend Confirmation - * - * This endpoint allows the user to request your app to resend him his email - * confirmation message. The redirect arguments act the same way as in - * /auth/register endpoint. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param string confirm - * @throws Exception - * @return {} - */ - async confirmResend(confirm) { - let path = '/auth/register/confirm/resend'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'confirm': confirm - }); - } -} - -module.exports = Auth; \ No newline at end of file diff --git a/app/sdks/node/lib/services/avatars.js b/app/sdks/node/lib/services/avatars.js deleted file mode 100644 index c34bdde966..0000000000 --- a/app/sdks/node/lib/services/avatars.js +++ /dev/null @@ -1,164 +0,0 @@ -const Service = require('../service.js'); - -class Avatars extends Service { - - /** - * Get Browser Icon - * - * You can use this endpoint to show different browser icons to your users. - * The code argument receives the browser code as it appears in your user - * /account/sessions endpoint. Use width, height and quality arguments to - * change the output settings. - * - * @param string code - * @param number width - * @param number height - * @param number quality - * @throws Exception - * @return {} - */ - async getBrowser(code, width = 100, height = 100, quality = 100) { - let path = '/avatars/browsers/{code}'.replace(new RegExp('{code}', 'g'), code); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'width': width, - 'height': height, - 'quality': quality - }); - } - - /** - * Get Credit Card Icon - * - * Need to display your users with your billing method or their payment - * methods? The credit card endpoint will return you the icon of the credit - * card provider you need. Use width, height and quality arguments to change - * the output settings. - * - * @param string code - * @param number width - * @param number height - * @param number quality - * @throws Exception - * @return {} - */ - async getCreditCard(code, width = 100, height = 100, quality = 100) { - let path = '/avatars/credit-cards/{code}'.replace(new RegExp('{code}', 'g'), code); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'width': width, - 'height': height, - 'quality': quality - }); - } - - /** - * Get Favicon - * - * Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote - * website URL. - * - * @param string url - * @throws Exception - * @return {} - */ - async getFavicon(url) { - let path = '/avatars/favicon'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'url': url - }); - } - - /** - * Get Country Flag - * - * You can use this endpoint to show different country flags icons to your - * users. The code argument receives the 2 letter country code. Use width, - * height and quality arguments to change the output settings. - * - * @param string code - * @param number width - * @param number height - * @param number quality - * @throws Exception - * @return {} - */ - async getFlag(code, width = 100, height = 100, quality = 100) { - let path = '/avatars/flags/{code}'.replace(new RegExp('{code}', 'g'), code); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'width': width, - 'height': height, - 'quality': quality - }); - } - - /** - * Get Image from URL - * - * Use this endpoint to fetch a remote image URL and crop it to any image size - * you want. This endpoint is very useful if you need to crop and display - * remote images in your app or in case you want to make sure a 3rd party - * image is properly served using a TLS protocol. - * - * @param string url - * @param number width - * @param number height - * @throws Exception - * @return {} - */ - async getImage(url, width = 400, height = 400) { - let path = '/avatars/image'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'url': url, - 'width': width, - 'height': height - }); - } - - /** - * Get QR Code - * - * Converts a given plain text to a QR code image. You can use the query - * parameters to change the size and style of the resulting image. - * - * @param string text - * @param number size - * @param number margin - * @param number download - * @throws Exception - * @return {} - */ - async getQR(text, size = 400, margin = 1, download = 0) { - let path = '/avatars/qr'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'text': text, - 'size': size, - 'margin': margin, - 'download': download - }); - } -} - -module.exports = Avatars; \ No newline at end of file diff --git a/app/sdks/node/lib/services/database.js b/app/sdks/node/lib/services/database.js deleted file mode 100644 index 4287484038..0000000000 --- a/app/sdks/node/lib/services/database.js +++ /dev/null @@ -1,266 +0,0 @@ -const Service = require('../service.js'); - -class Database extends Service { - - /** - * List Collections - * - * Get a list of all the user collections. You can use the query params to - * filter your results. On admin mode, this endpoint will return a list of all - * of the project collections. [Learn more about different API - * modes](/docs/admin). - * - * @param string search - * @param number limit - * @param number offset - * @param string orderType - * @throws Exception - * @return {} - */ - async listCollections(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/database'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'search': search, - 'limit': limit, - 'offset': offset, - 'orderType': orderType - }); - } - - /** - * Create Collection - * - * Create a new Collection. - * - * @param string name - * @param array read - * @param array write - * @param array rules - * @throws Exception - * @return {} - */ - async createCollection(name, read, write, rules) { - let path = '/database'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'read': read, - 'write': write, - 'rules': rules - }); - } - - /** - * Get Collection - * - * Get collection by its unique ID. This endpoint response returns a JSON - * object with the collection metadata. - * - * @param string collectionId - * @throws Exception - * @return {} - */ - async getCollection(collectionId) { - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Collection - * - * Update collection by its unique ID. - * - * @param string collectionId - * @param string name - * @param array read - * @param array write - * @param array rules - * @throws Exception - * @return {} - */ - async updateCollection(collectionId, name, read, write, rules = []) { - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'read': read, - 'write': write, - 'rules': rules - }); - } - - /** - * Delete Collection - * - * Delete a collection by its unique ID. Only users with write permissions - * have access to delete this resource. - * - * @param string collectionId - * @throws Exception - * @return {} - */ - async deleteCollection(collectionId) { - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Documents - * - * Get a list of all the user documents. You can use the query params to - * filter your results. On admin mode, this endpoint will return a list of all - * of the project documents. [Learn more about different API - * modes](/docs/admin). - * - * @param string collectionId - * @param array filters - * @param number offset - * @param number limit - * @param string orderField - * @param string orderType - * @param string orderCast - * @param string search - * @param number first - * @param number last - * @throws Exception - * @return {} - */ - async listDocuments(collectionId, filters = [], offset = 0, limit = 50, orderField = '$uid', orderType = 'ASC', orderCast = 'string', search = '', first = 0, last = 0) { - let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'filters': filters, - 'offset': offset, - 'limit': limit, - 'order-field': orderField, - 'order-type': orderType, - 'order-cast': orderCast, - 'search': search, - 'first': first, - 'last': last - }); - } - - /** - * Create Document - * - * Create a new Document. - * - * @param string collectionId - * @param string data - * @param array read - * @param array write - * @param string parentDocument - * @param string parentProperty - * @param string parentPropertyType - * @throws Exception - * @return {} - */ - async createDocument(collectionId, data, read, write, parentDocument = '', parentProperty = '', parentPropertyType = 'assign') { - let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'data': data, - 'read': read, - 'write': write, - 'parentDocument': parentDocument, - 'parentProperty': parentProperty, - 'parentPropertyType': parentPropertyType - }); - } - - /** - * Get Document - * - * Get document by its unique ID. This endpoint response returns a JSON object - * with the document data. - * - * @param string collectionId - * @param string documentId - * @throws Exception - * @return {} - */ - async getDocument(collectionId, documentId) { - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Document - * - * @param string collectionId - * @param string documentId - * @param string data - * @param array read - * @param array write - * @throws Exception - * @return {} - */ - async updateDocument(collectionId, documentId, data, read, write) { - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'data': data, - 'read': read, - 'write': write - }); - } - - /** - * Delete Document - * - * Delete document by its unique ID. This endpoint deletes only the parent - * documents, his attributes and relations to other documents. Child documents - * **will not** be deleted. - * - * @param string collectionId - * @param string documentId - * @throws Exception - * @return {} - */ - async deleteDocument(collectionId, documentId) { - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } -} - -module.exports = Database; \ No newline at end of file diff --git a/app/sdks/node/lib/services/locale.js b/app/sdks/node/lib/services/locale.js deleted file mode 100644 index 8233259394..0000000000 --- a/app/sdks/node/lib/services/locale.js +++ /dev/null @@ -1,124 +0,0 @@ -const Service = require('../service.js'); - -class Locale extends Service { - - /** - * Get User Locale - * - * Get the current user location based on IP. Returns an object with user - * country code, country name, continent name, continent code, ip address and - * suggested currency. You can use the locale header to get the data in a - * supported language. - * - * @throws Exception - * @return {} - */ - async getLocale() { - let path = '/locale'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Countries - * - * List of all continents. You can use the locale header to get the data in a - * supported language. - * - * @throws Exception - * @return {} - */ - async getContinents() { - let path = '/locale/continents'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Countries - * - * List of all countries. You can use the locale header to get the data in a - * supported language. - * - * @throws Exception - * @return {} - */ - async getCountries() { - let path = '/locale/countries'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List EU Countries - * - * List of all countries that are currently members of the EU. You can use the - * locale header to get the data in a supported language. UK brexit date is - * currently set to 2019-10-31 and will be updated if and when needed. - * - * @throws Exception - * @return {} - */ - async getCountriesEU() { - let path = '/locale/countries/eu'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Countries Phone Codes - * - * List of all countries phone codes. You can use the locale header to get the - * data in a supported language. - * - * @throws Exception - * @return {} - */ - async getCountriesPhones() { - let path = '/locale/countries/phones'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Currencies - * - * List of all currencies, including currency symol, name, plural, and decimal - * digits for all major and minor currencies. You can use the locale header to - * get the data in a supported language. - * - * @throws Exception - * @return {} - */ - async getCurrencies() { - let path = '/locale/currencies'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } -} - -module.exports = Locale; \ No newline at end of file diff --git a/app/sdks/node/lib/services/projects.js b/app/sdks/node/lib/services/projects.js deleted file mode 100644 index 58a03980a2..0000000000 --- a/app/sdks/node/lib/services/projects.js +++ /dev/null @@ -1,609 +0,0 @@ -const Service = require('../service.js'); - -class Projects extends Service { - - /** - * List Projects - * - * @throws Exception - * @return {} - */ - async listProjects() { - let path = '/projects'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Project - * - * @param string name - * @param string teamId - * @param string description - * @param string logo - * @param string url - * @param string legalName - * @param string legalCountry - * @param string legalState - * @param string legalCity - * @param string legalAddress - * @param string legalTaxId - * @throws Exception - * @return {} - */ - async createProject(name, teamId, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { - let path = '/projects'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'teamId': teamId, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legalName, - 'legalCountry': legalCountry, - 'legalState': legalState, - 'legalCity': legalCity, - 'legalAddress': legalAddress, - 'legalTaxId': legalTaxId - }); - } - - /** - * Get Project - * - * @param string projectId - * @throws Exception - * @return {} - */ - async getProject(projectId) { - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Project - * - * @param string projectId - * @param string name - * @param string description - * @param string logo - * @param string url - * @param string legalName - * @param string legalCountry - * @param string legalState - * @param string legalCity - * @param string legalAddress - * @param string legalTaxId - * @throws Exception - * @return {} - */ - async updateProject(projectId, name, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legalName, - 'legalCountry': legalCountry, - 'legalState': legalState, - 'legalCity': legalCity, - 'legalAddress': legalAddress, - 'legalTaxId': legalTaxId - }); - } - - /** - * Delete Project - * - * @param string projectId - * @throws Exception - * @return {} - */ - async deleteProject(projectId) { - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Keys - * - * @param string projectId - * @throws Exception - * @return {} - */ - async listKeys(projectId) { - let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Key - * - * @param string projectId - * @param string name - * @param array scopes - * @throws Exception - * @return {} - */ - async createKey(projectId, name, scopes) { - let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'scopes': scopes - }); - } - - /** - * Get Key - * - * @param string projectId - * @param string keyId - * @throws Exception - * @return {} - */ - async getKey(projectId, keyId) { - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Key - * - * @param string projectId - * @param string keyId - * @param string name - * @param array scopes - * @throws Exception - * @return {} - */ - async updateKey(projectId, keyId, name, scopes) { - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'scopes': scopes - }); - } - - /** - * Delete Key - * - * @param string projectId - * @param string keyId - * @throws Exception - * @return {} - */ - async deleteKey(projectId, keyId) { - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Project OAuth - * - * @param string projectId - * @param string provider - * @param string appId - * @param string secret - * @throws Exception - * @return {} - */ - async updateProjectOAuth(projectId, provider, appId = '', secret = '') { - let path = '/projects/{projectId}/oauth'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'provider': provider, - 'appId': appId, - 'secret': secret - }); - } - - /** - * List Platforms - * - * @param string projectId - * @throws Exception - * @return {} - */ - async listPlatforms(projectId) { - let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Platform - * - * @param string projectId - * @param string type - * @param string name - * @param string key - * @param string store - * @param string url - * @throws Exception - * @return {} - */ - async createPlatform(projectId, type, name, key = '', store = '', url = '') { - let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'type': type, - 'name': name, - 'key': key, - 'store': store, - 'url': url - }); - } - - /** - * Get Platform - * - * @param string projectId - * @param string platformId - * @throws Exception - * @return {} - */ - async getPlatform(projectId, platformId) { - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Platform - * - * @param string projectId - * @param string platformId - * @param string name - * @param string key - * @param string store - * @param string url - * @throws Exception - * @return {} - */ - async updatePlatform(projectId, platformId, name, key = '', store = '', url = '') { - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'key': key, - 'store': store, - 'url': url - }); - } - - /** - * Delete Platform - * - * @param string projectId - * @param string platformId - * @throws Exception - * @return {} - */ - async deletePlatform(projectId, platformId) { - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Tasks - * - * @param string projectId - * @throws Exception - * @return {} - */ - async listTasks(projectId) { - let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Task - * - * @param string projectId - * @param string name - * @param string status - * @param string schedule - * @param number security - * @param string httpMethod - * @param string httpUrl - * @param array httpHeaders - * @param string httpUser - * @param string httpPass - * @throws Exception - * @return {} - */ - async createTask(projectId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { - let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': httpMethod, - 'httpUrl': httpUrl, - 'httpHeaders': httpHeaders, - 'httpUser': httpUser, - 'httpPass': httpPass - }); - } - - /** - * Get Task - * - * @param string projectId - * @param string taskId - * @throws Exception - * @return {} - */ - async getTask(projectId, taskId) { - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Task - * - * @param string projectId - * @param string taskId - * @param string name - * @param string status - * @param string schedule - * @param number security - * @param string httpMethod - * @param string httpUrl - * @param array httpHeaders - * @param string httpUser - * @param string httpPass - * @throws Exception - * @return {} - */ - async updateTask(projectId, taskId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': httpMethod, - 'httpUrl': httpUrl, - 'httpHeaders': httpHeaders, - 'httpUser': httpUser, - 'httpPass': httpPass - }); - } - - /** - * Delete Task - * - * @param string projectId - * @param string taskId - * @throws Exception - * @return {} - */ - async deleteTask(projectId, taskId) { - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Get Project - * - * @param string projectId - * @throws Exception - * @return {} - */ - async getProjectUsage(projectId) { - let path = '/projects/{projectId}/usage'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Webhooks - * - * @param string projectId - * @throws Exception - * @return {} - */ - async listWebhooks(projectId) { - let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Webhook - * - * @param string projectId - * @param string name - * @param array events - * @param string url - * @param number security - * @param string httpUser - * @param string httpPass - * @throws Exception - * @return {} - */ - async createWebhook(projectId, name, events, url, security, httpUser = '', httpPass = '') { - let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': httpUser, - 'httpPass': httpPass - }); - } - - /** - * Get Webhook - * - * @param string projectId - * @param string webhookId - * @throws Exception - * @return {} - */ - async getWebhook(projectId, webhookId) { - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Webhook - * - * @param string projectId - * @param string webhookId - * @param string name - * @param array events - * @param string url - * @param number security - * @param string httpUser - * @param string httpPass - * @throws Exception - * @return {} - */ - async updateWebhook(projectId, webhookId, name, events, url, security, httpUser = '', httpPass = '') { - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': httpUser, - 'httpPass': httpPass - }); - } - - /** - * Delete Webhook - * - * @param string projectId - * @param string webhookId - * @throws Exception - * @return {} - */ - async deleteWebhook(projectId, webhookId) { - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } -} - -module.exports = Projects; \ No newline at end of file diff --git a/app/sdks/node/lib/services/storage.js b/app/sdks/node/lib/services/storage.js deleted file mode 100644 index fb9f8632c9..0000000000 --- a/app/sdks/node/lib/services/storage.js +++ /dev/null @@ -1,199 +0,0 @@ -const Service = require('../service.js'); - -class Storage extends Service { - - /** - * List Files - * - * Get a list of all the user files. You can use the query params to filter - * your results. On admin mode, this endpoint will return a list of all of the - * project files. [Learn more about different API modes](/docs/admin). - * - * @param string search - * @param number limit - * @param number offset - * @param string orderType - * @throws Exception - * @return {} - */ - async listFiles(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/storage/files'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'search': search, - 'limit': limit, - 'offset': offset, - 'orderType': orderType - }); - } - - /** - * Create File - * - * Create a new file. The user who creates the file will automatically be - * assigned to read and write access unless he has passed custom values for - * read and write arguments. - * - * @param File files - * @param array read - * @param array write - * @throws Exception - * @return {} - */ - async createFile(files, read, write) { - let path = '/storage/files'; - - return await this.client.call('post', path, { - 'content-type': 'multipart/form-data', - }, - { - 'files': files, - 'read': read, - 'write': write - }); - } - - /** - * Get File - * - * Get file by its unique ID. This endpoint response returns a JSON object - * with the file metadata. - * - * @param string fileId - * @throws Exception - * @return {} - */ - async getFile(fileId) { - let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update File - * - * Update file by its unique ID. Only users with write permissions have access - * to update this resource. - * - * @param string fileId - * @param array read - * @param array write - * @throws Exception - * @return {} - */ - async updateFile(fileId, read, write) { - let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'read': read, - 'write': write - }); - } - - /** - * Delete File - * - * Delete a file by its unique ID. Only users with write permissions have - * access to delete this resource. - * - * @param string fileId - * @throws Exception - * @return {} - */ - async deleteFile(fileId) { - let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Get File for Download - * - * Get file content by its unique ID. The endpoint response return with a - * 'Content-Disposition: attachment' header that tells the browser to start - * downloading the file to user downloads directory. - * - * @param string fileId - * @throws Exception - * @return {} - */ - async getFileDownload(fileId) { - let path = '/storage/files/{fileId}/download'.replace(new RegExp('{fileId}', 'g'), fileId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Get File Preview - * - * Get file preview image. Currently, this method supports preview for image - * files (jpg, png, and gif), other supported formats, like pdf, docs, slides, - * and spreadsheets will return file icon image. You can also pass query - * string arguments for cutting and resizing your preview image. - * - * @param string fileId - * @param number width - * @param number height - * @param number quality - * @param string background - * @param string output - * @throws Exception - * @return {} - */ - async getFilePreview(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { - let path = '/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}', 'g'), fileId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'width': width, - 'height': height, - 'quality': quality, - 'background': background, - 'output': output - }); - } - - /** - * Get File for View - * - * Get file content by its unique ID. This endpoint is similar to the download - * method but returns with no 'Content-Disposition: attachment' header. - * - * @param string fileId - * @param string as - * @throws Exception - * @return {} - */ - async getFileView(fileId, as = '') { - let path = '/storage/files/{fileId}/view'.replace(new RegExp('{fileId}', 'g'), fileId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'as': as - }); - } -} - -module.exports = Storage; \ No newline at end of file diff --git a/app/sdks/node/lib/services/teams.js b/app/sdks/node/lib/services/teams.js deleted file mode 100644 index 9ed1def550..0000000000 --- a/app/sdks/node/lib/services/teams.js +++ /dev/null @@ -1,266 +0,0 @@ -const Service = require('../service.js'); - -class Teams extends Service { - - /** - * List Teams - * - * Get a list of all the current user teams. You can use the query params to - * filter your results. On admin mode, this endpoint will return a list of all - * of the project teams. [Learn more about different API modes](/docs/admin). - * - * @param string search - * @param number limit - * @param number offset - * @param string orderType - * @throws Exception - * @return {} - */ - async listTeams(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/teams'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'search': search, - 'limit': limit, - 'offset': offset, - 'orderType': orderType - }); - } - - /** - * Create Team - * - * Create a new team. The user who creates the team will automatically be - * assigned as the owner of the team. The team owner can invite new members, - * who will be able add new owners and update or delete the team from your - * project. - * - * @param string name - * @param array roles - * @throws Exception - * @return {} - */ - async createTeam(name, roles = ["owner"]) { - let path = '/teams'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'roles': roles - }); - } - - /** - * Get Team - * - * Get team by its unique ID. All team members have read access for this - * resource. - * - * @param string teamId - * @throws Exception - * @return {} - */ - async getTeam(teamId) { - let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Team - * - * Update team by its unique ID. Only team owners have write access for this - * resource. - * - * @param string teamId - * @param string name - * @throws Exception - * @return {} - */ - async updateTeam(teamId, name) { - let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name - }); - } - - /** - * Delete Team - * - * Delete team by its unique ID. Only team owners have write access for this - * resource. - * - * @param string teamId - * @throws Exception - * @return {} - */ - async deleteTeam(teamId) { - let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Get Team Members - * - * Get team members by the team unique ID. All team members have read access - * for this list of resources. - * - * @param string teamId - * @throws Exception - * @return {} - */ - async getTeamMembers(teamId) { - let path = '/teams/{teamId}/members'.replace(new RegExp('{teamId}', 'g'), teamId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Team Membership - * - * Use this endpoint to invite a new member to your team. An email with a link - * to join the team will be sent to the new member email address. If member - * doesn't exists in the project it will be automatically created. - * - * Use the redirect parameter to redirect the user from the invitation email - * back to your app. When the user is redirected, use the - * /teams/{teamId}/memberships/{inviteId}/status endpoint to finally join the - * user to the team. - * - * Please notice that in order to avoid a [Redirect - * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URL's are the once from domains you have set when - * added your platforms in the console interface. - * - * @param string teamId - * @param string email - * @param array roles - * @param string redirect - * @param string name - * @throws Exception - * @return {} - */ - async createTeamMembership(teamId, email, roles, redirect, name = '') { - let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'name': name, - 'roles': roles, - 'redirect': redirect - }); - } - - /** - * Delete Team Membership - * - * This endpoint allows a user to leave a team or for a team owner to delete - * the membership of any other team member. - * - * @param string teamId - * @param string inviteId - * @throws Exception - * @return {} - */ - async deleteTeamMembership(teamId, inviteId) { - let path = '/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Team Membership (Resend) - * - * Use this endpoint to resend your invitation email for a user to join a - * team. - * - * @param string teamId - * @param string inviteId - * @param string redirect - * @throws Exception - * @return {} - */ - async createTeamMembershipResend(teamId, inviteId, redirect) { - let path = '/teams/{teamId}/memberships/{inviteId}/resend'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'redirect': redirect - }); - } - - /** - * Update Team Membership Status - * - * Use this endpoint to let user accept an invitation to join a team after he - * is being redirect back to your app from the invitation email. Use the - * success and failure URL's to redirect users back to your application after - * the request completes. - * - * Please notice that in order to avoid a [Redirect - * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URL's are the once from domains you have set when - * added your platforms in the console interface. - * - * When not using the success or failure redirect arguments this endpoint will - * result with a 200 status code on success and with 401 status error on - * failure. This behavior was applied to help the web clients deal with - * browsers who don't allow to set 3rd party HTTP cookies needed for saving - * the account session token. - * - * @param string teamId - * @param string inviteId - * @param string userId - * @param string secret - * @param string success - * @param string failure - * @throws Exception - * @return {} - */ - async updateTeamMembershipStatus(teamId, inviteId, userId, secret, success = '', failure = '') { - let path = '/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'userId': userId, - 'secret': secret, - 'success': success, - 'failure': failure - }); - } -} - -module.exports = Teams; \ No newline at end of file diff --git a/app/sdks/node/lib/services/users.js b/app/sdks/node/lib/services/users.js deleted file mode 100644 index 85da0ae9b8..0000000000 --- a/app/sdks/node/lib/services/users.js +++ /dev/null @@ -1,216 +0,0 @@ -const Service = require('../service.js'); - -class Users extends Service { - - /** - * List Users - * - * Get a list of all the project users. You can use the query params to filter - * your results. - * - * @param string search - * @param number limit - * @param number offset - * @param string orderType - * @throws Exception - * @return {} - */ - async listUsers(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/users'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'search': search, - 'limit': limit, - 'offset': offset, - 'orderType': orderType - }); - } - - /** - * Create User - * - * Create a new user. - * - * @param string email - * @param string password - * @param string name - * @throws Exception - * @return {} - */ - async createUser(email, password, name = '') { - let path = '/users'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'password': password, - 'name': name - }); - } - - /** - * Get User - * - * Get user by its unique ID. - * - * @param string userId - * @throws Exception - * @return {} - */ - async getUser(userId) { - let path = '/users/{userId}'.replace(new RegExp('{userId}', 'g'), userId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Get User Logs - * - * Get user activity logs list by its unique ID. - * - * @param string userId - * @throws Exception - * @return {} - */ - async getUserLogs(userId) { - let path = '/users/{userId}/logs'.replace(new RegExp('{userId}', 'g'), userId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Get User Prefs - * - * Get user preferences by its unique ID. - * - * @param string userId - * @throws Exception - * @return {} - */ - async getUserPrefs(userId) { - let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update User Prefs - * - * Update user preferences by its unique ID. You can pass only the specific - * settings you wish to update. - * - * @param string userId - * @param string prefs - * @throws Exception - * @return {} - */ - async updateUserPrefs(userId, prefs) { - let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'prefs': prefs - }); - } - - /** - * Get User Sessions - * - * Get user sessions list by its unique ID. - * - * @param string userId - * @throws Exception - * @return {} - */ - async getUserSessions(userId) { - let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Delete User Sessions - * - * Delete all user sessions by its unique ID. - * - * @param string userId - * @throws Exception - * @return {} - */ - async deleteUserSessions(userId) { - let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Delete User Session - * - * Delete user sessions by its unique ID. - * - * @param string userId - * @param string sessionId - * @throws Exception - * @return {} - */ - async deleteUserSession(userId, sessionId) { - let path = '/users/{userId}/sessions/:session'.replace(new RegExp('{userId}', 'g'), userId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - 'sessionId': sessionId - }); - } - - /** - * Update User Status - * - * Update user status by its unique ID. - * - * @param string userId - * @param string status - * @throws Exception - * @return {} - */ - async updateUserStatus(userId, status) { - let path = '/users/{userId}/status'.replace(new RegExp('{userId}', 'g'), userId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'status': status - }); - } -} - -module.exports = Users; \ No newline at end of file diff --git a/app/sdks/node/package.json b/app/sdks/node/package.json deleted file mode 100644 index 88159d963a..0000000000 --- a/app/sdks/node/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "node-appwrite", - "homepage": "https://appwrite.io/support", - "description": "Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)", - "version": "1.0.31", - "license": "BSD-3-Clause", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/appwrite/sdk-for-node.git" - }, - "devDependencies": {}, - "dependencies": { - "request": "^2.88.0", - "request-promise-native": "^1.0.7" - } -} \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account-recovery.md b/app/sdks/nodejs/docs/examples/account/create-account-recovery.md deleted file mode 100644 index 192870a20f..0000000000 --- a/app/sdks/nodejs/docs/examples/account/create-account-recovery.md +++ /dev/null @@ -1,17 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client -; - -let promise = account.createAccountRecovery('email@example.com', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account-session-o-auth.md b/app/sdks/nodejs/docs/examples/account/create-account-session-o-auth.md deleted file mode 100644 index 7e401a4161..0000000000 --- a/app/sdks/nodejs/docs/examples/account/create-account-session-o-auth.md +++ /dev/null @@ -1,17 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client -; - -let promise = account.createAccountSessionOAuth('bitbucket', 'https://example.com', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account-session.md b/app/sdks/nodejs/docs/examples/account/create-account-session.md deleted file mode 100644 index 755f4bd3e5..0000000000 --- a/app/sdks/nodejs/docs/examples/account/create-account-session.md +++ /dev/null @@ -1,17 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client -; - -let promise = account.createAccountSession('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account-verification.md b/app/sdks/nodejs/docs/examples/account/create-account-verification.md deleted file mode 100644 index 3e2082273f..0000000000 --- a/app/sdks/nodejs/docs/examples/account/create-account-verification.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.createAccountVerification('https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/create-account.md b/app/sdks/nodejs/docs/examples/account/create-account.md deleted file mode 100644 index ea36651887..0000000000 --- a/app/sdks/nodejs/docs/examples/account/create-account.md +++ /dev/null @@ -1,17 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client -; - -let promise = account.createAccount('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/delete-account-current-session.md b/app/sdks/nodejs/docs/examples/account/delete-account-current-session.md deleted file mode 100644 index 1d617e20e6..0000000000 --- a/app/sdks/nodejs/docs/examples/account/delete-account-current-session.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.deleteAccountCurrentSession(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/delete-account-session.md b/app/sdks/nodejs/docs/examples/account/delete-account-session.md deleted file mode 100644 index 23388767ce..0000000000 --- a/app/sdks/nodejs/docs/examples/account/delete-account-session.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.deleteAccountSession('[ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/delete-account-sessions.md b/app/sdks/nodejs/docs/examples/account/delete-account-sessions.md deleted file mode 100644 index 5571d7af4e..0000000000 --- a/app/sdks/nodejs/docs/examples/account/delete-account-sessions.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.deleteAccountSessions(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/delete.md b/app/sdks/nodejs/docs/examples/account/delete.md deleted file mode 100644 index a2294e7a2b..0000000000 --- a/app/sdks/nodejs/docs/examples/account/delete.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.delete(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/get-account-logs.md b/app/sdks/nodejs/docs/examples/account/get-account-logs.md deleted file mode 100644 index 7c241510dd..0000000000 --- a/app/sdks/nodejs/docs/examples/account/get-account-logs.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.getAccountLogs(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/get-account-prefs.md b/app/sdks/nodejs/docs/examples/account/get-account-prefs.md deleted file mode 100644 index f6c6ce0ab7..0000000000 --- a/app/sdks/nodejs/docs/examples/account/get-account-prefs.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.getAccountPrefs(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/get-account-sessions.md b/app/sdks/nodejs/docs/examples/account/get-account-sessions.md deleted file mode 100644 index 60adb274c7..0000000000 --- a/app/sdks/nodejs/docs/examples/account/get-account-sessions.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.getAccountSessions(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/get-account.md b/app/sdks/nodejs/docs/examples/account/get-account.md deleted file mode 100644 index 5b27263b55..0000000000 --- a/app/sdks/nodejs/docs/examples/account/get-account.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.getAccount(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-account-name.md b/app/sdks/nodejs/docs/examples/account/update-account-name.md deleted file mode 100644 index 8c819ac65b..0000000000 --- a/app/sdks/nodejs/docs/examples/account/update-account-name.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.updateAccountName('[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-account-password.md b/app/sdks/nodejs/docs/examples/account/update-account-password.md deleted file mode 100644 index d58273c139..0000000000 --- a/app/sdks/nodejs/docs/examples/account/update-account-password.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.updateAccountPassword('password', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-account-recovery.md b/app/sdks/nodejs/docs/examples/account/update-account-recovery.md deleted file mode 100644 index a161f077f6..0000000000 --- a/app/sdks/nodejs/docs/examples/account/update-account-recovery.md +++ /dev/null @@ -1,17 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client -; - -let promise = account.updateAccountRecovery('[USER_ID]', '[SECRET]', 'password', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-account-verification.md b/app/sdks/nodejs/docs/examples/account/update-account-verification.md deleted file mode 100644 index d935d0d635..0000000000 --- a/app/sdks/nodejs/docs/examples/account/update-account-verification.md +++ /dev/null @@ -1,17 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client -; - -let promise = account.updateAccountVerification('[USER_ID]', '[SECRET]', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-email.md b/app/sdks/nodejs/docs/examples/account/update-email.md deleted file mode 100644 index e1937eb31a..0000000000 --- a/app/sdks/nodejs/docs/examples/account/update-email.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.updateEmail('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/account/update-prefs.md b/app/sdks/nodejs/docs/examples/account/update-prefs.md deleted file mode 100644 index c52e3a560a..0000000000 --- a/app/sdks/nodejs/docs/examples/account/update-prefs.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let account = new sdk.Account(client); - -client - .setProject('') -; - -let promise = account.updatePrefs(''); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/avatars/get-browser.md b/app/sdks/nodejs/docs/examples/avatars/get-browser.md index ae650dae9b..50d3fefcf1 100644 --- a/app/sdks/nodejs/docs/examples/avatars/get-browser.md +++ b/app/sdks/nodejs/docs/examples/avatars/get-browser.md @@ -7,6 +7,7 @@ let avatars = new sdk.Avatars(client); client .setProject('') + .setKey('') ; let promise = avatars.getBrowser('aa'); diff --git a/app/sdks/nodejs/docs/examples/avatars/get-credit-card.md b/app/sdks/nodejs/docs/examples/avatars/get-credit-card.md index 567ff2c81f..f64488cc12 100644 --- a/app/sdks/nodejs/docs/examples/avatars/get-credit-card.md +++ b/app/sdks/nodejs/docs/examples/avatars/get-credit-card.md @@ -7,6 +7,7 @@ let avatars = new sdk.Avatars(client); client .setProject('') + .setKey('') ; let promise = avatars.getCreditCard('amex'); diff --git a/app/sdks/nodejs/docs/examples/avatars/get-favicon.md b/app/sdks/nodejs/docs/examples/avatars/get-favicon.md index 10e05eef00..ac449e9f1a 100644 --- a/app/sdks/nodejs/docs/examples/avatars/get-favicon.md +++ b/app/sdks/nodejs/docs/examples/avatars/get-favicon.md @@ -7,6 +7,7 @@ let avatars = new sdk.Avatars(client); client .setProject('') + .setKey('') ; let promise = avatars.getFavicon('https://example.com'); diff --git a/app/sdks/nodejs/docs/examples/avatars/get-flag.md b/app/sdks/nodejs/docs/examples/avatars/get-flag.md index 4793f320af..d53f2aa555 100644 --- a/app/sdks/nodejs/docs/examples/avatars/get-flag.md +++ b/app/sdks/nodejs/docs/examples/avatars/get-flag.md @@ -7,6 +7,7 @@ let avatars = new sdk.Avatars(client); client .setProject('') + .setKey('') ; let promise = avatars.getFlag('af'); diff --git a/app/sdks/nodejs/docs/examples/avatars/get-image.md b/app/sdks/nodejs/docs/examples/avatars/get-image.md index 5329174988..e541b90e61 100644 --- a/app/sdks/nodejs/docs/examples/avatars/get-image.md +++ b/app/sdks/nodejs/docs/examples/avatars/get-image.md @@ -7,6 +7,7 @@ let avatars = new sdk.Avatars(client); client .setProject('') + .setKey('') ; let promise = avatars.getImage('https://example.com'); diff --git a/app/sdks/nodejs/docs/examples/avatars/get-q-r.md b/app/sdks/nodejs/docs/examples/avatars/get-q-r.md index adb6ea9ca1..9611a617ef 100644 --- a/app/sdks/nodejs/docs/examples/avatars/get-q-r.md +++ b/app/sdks/nodejs/docs/examples/avatars/get-q-r.md @@ -7,6 +7,7 @@ let avatars = new sdk.Avatars(client); client .setProject('') + .setKey('') ; let promise = avatars.getQR('[TEXT]'); diff --git a/app/sdks/nodejs/docs/examples/database/create-collection.md b/app/sdks/nodejs/docs/examples/database/create-collection.md index cdd31c2c40..c7ea8d43e1 100644 --- a/app/sdks/nodejs/docs/examples/database/create-collection.md +++ b/app/sdks/nodejs/docs/examples/database/create-collection.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.createCollection('[NAME]', [], [], []); diff --git a/app/sdks/nodejs/docs/examples/database/create-document.md b/app/sdks/nodejs/docs/examples/database/create-document.md index b1d3745d3c..9a15f133d5 100644 --- a/app/sdks/nodejs/docs/examples/database/create-document.md +++ b/app/sdks/nodejs/docs/examples/database/create-document.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.createDocument('[COLLECTION_ID]', '{}', [], []); diff --git a/app/sdks/nodejs/docs/examples/database/delete-collection.md b/app/sdks/nodejs/docs/examples/database/delete-collection.md index 4fe87892ef..7be40b41bf 100644 --- a/app/sdks/nodejs/docs/examples/database/delete-collection.md +++ b/app/sdks/nodejs/docs/examples/database/delete-collection.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.deleteCollection('[COLLECTION_ID]'); diff --git a/app/sdks/nodejs/docs/examples/database/delete-document.md b/app/sdks/nodejs/docs/examples/database/delete-document.md index 1dba553a31..d74f2dd16c 100644 --- a/app/sdks/nodejs/docs/examples/database/delete-document.md +++ b/app/sdks/nodejs/docs/examples/database/delete-document.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.deleteDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); diff --git a/app/sdks/nodejs/docs/examples/database/get-collection.md b/app/sdks/nodejs/docs/examples/database/get-collection.md index a634fcb9e8..69a39382bf 100644 --- a/app/sdks/nodejs/docs/examples/database/get-collection.md +++ b/app/sdks/nodejs/docs/examples/database/get-collection.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.getCollection('[COLLECTION_ID]'); diff --git a/app/sdks/nodejs/docs/examples/database/get-document.md b/app/sdks/nodejs/docs/examples/database/get-document.md index 034ab82c37..5a676580bd 100644 --- a/app/sdks/nodejs/docs/examples/database/get-document.md +++ b/app/sdks/nodejs/docs/examples/database/get-document.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.getDocument('[COLLECTION_ID]', '[DOCUMENT_ID]'); diff --git a/app/sdks/nodejs/docs/examples/database/list-collections.md b/app/sdks/nodejs/docs/examples/database/list-collections.md index 27e960111f..2f746de896 100644 --- a/app/sdks/nodejs/docs/examples/database/list-collections.md +++ b/app/sdks/nodejs/docs/examples/database/list-collections.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.listCollections(); diff --git a/app/sdks/nodejs/docs/examples/database/list-documents.md b/app/sdks/nodejs/docs/examples/database/list-documents.md index 4dd99052af..641a572420 100644 --- a/app/sdks/nodejs/docs/examples/database/list-documents.md +++ b/app/sdks/nodejs/docs/examples/database/list-documents.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.listDocuments('[COLLECTION_ID]'); diff --git a/app/sdks/nodejs/docs/examples/database/update-collection.md b/app/sdks/nodejs/docs/examples/database/update-collection.md index 37e4ef9fa1..d393606e8f 100644 --- a/app/sdks/nodejs/docs/examples/database/update-collection.md +++ b/app/sdks/nodejs/docs/examples/database/update-collection.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.updateCollection('[COLLECTION_ID]', '[NAME]', [], []); diff --git a/app/sdks/nodejs/docs/examples/database/update-document.md b/app/sdks/nodejs/docs/examples/database/update-document.md index 1be1d9672a..b281187da4 100644 --- a/app/sdks/nodejs/docs/examples/database/update-document.md +++ b/app/sdks/nodejs/docs/examples/database/update-document.md @@ -7,6 +7,7 @@ let database = new sdk.Database(client); client .setProject('') + .setKey('') ; let promise = database.updateDocument('[COLLECTION_ID]', '[DOCUMENT_ID]', '{}', [], []); diff --git a/app/sdks/nodejs/docs/examples/locale/get-continents.md b/app/sdks/nodejs/docs/examples/locale/get-continents.md index 84ea74f1b5..3c2143cf06 100644 --- a/app/sdks/nodejs/docs/examples/locale/get-continents.md +++ b/app/sdks/nodejs/docs/examples/locale/get-continents.md @@ -7,6 +7,7 @@ let locale = new sdk.Locale(client); client .setProject('') + .setKey('') ; let promise = locale.getContinents(); diff --git a/app/sdks/nodejs/docs/examples/locale/get-countries-e-u.md b/app/sdks/nodejs/docs/examples/locale/get-countries-e-u.md index a022ddee34..3aabf5713b 100644 --- a/app/sdks/nodejs/docs/examples/locale/get-countries-e-u.md +++ b/app/sdks/nodejs/docs/examples/locale/get-countries-e-u.md @@ -7,6 +7,7 @@ let locale = new sdk.Locale(client); client .setProject('') + .setKey('') ; let promise = locale.getCountriesEU(); diff --git a/app/sdks/nodejs/docs/examples/locale/get-countries-phones.md b/app/sdks/nodejs/docs/examples/locale/get-countries-phones.md index b7d870f7df..79cc6f5b6b 100644 --- a/app/sdks/nodejs/docs/examples/locale/get-countries-phones.md +++ b/app/sdks/nodejs/docs/examples/locale/get-countries-phones.md @@ -7,6 +7,7 @@ let locale = new sdk.Locale(client); client .setProject('') + .setKey('') ; let promise = locale.getCountriesPhones(); diff --git a/app/sdks/nodejs/docs/examples/locale/get-countries.md b/app/sdks/nodejs/docs/examples/locale/get-countries.md index 610d679dfb..a4e878bc6a 100644 --- a/app/sdks/nodejs/docs/examples/locale/get-countries.md +++ b/app/sdks/nodejs/docs/examples/locale/get-countries.md @@ -7,6 +7,7 @@ let locale = new sdk.Locale(client); client .setProject('') + .setKey('') ; let promise = locale.getCountries(); diff --git a/app/sdks/nodejs/docs/examples/locale/get-currencies.md b/app/sdks/nodejs/docs/examples/locale/get-currencies.md index 0bfb6b1951..59d8137dee 100644 --- a/app/sdks/nodejs/docs/examples/locale/get-currencies.md +++ b/app/sdks/nodejs/docs/examples/locale/get-currencies.md @@ -7,6 +7,7 @@ let locale = new sdk.Locale(client); client .setProject('') + .setKey('') ; let promise = locale.getCurrencies(); diff --git a/app/sdks/nodejs/docs/examples/locale/get-locale.md b/app/sdks/nodejs/docs/examples/locale/get-locale.md index f07554e149..57e5d69e78 100644 --- a/app/sdks/nodejs/docs/examples/locale/get-locale.md +++ b/app/sdks/nodejs/docs/examples/locale/get-locale.md @@ -7,6 +7,7 @@ let locale = new sdk.Locale(client); client .setProject('') + .setKey('') ; let promise = locale.getLocale(); diff --git a/app/sdks/nodejs/docs/examples/projects/create-key.md b/app/sdks/nodejs/docs/examples/projects/create-key.md deleted file mode 100644 index 2328b381a4..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/create-key.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.createKey('[PROJECT_ID]', '[NAME]', []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-platform.md b/app/sdks/nodejs/docs/examples/projects/create-platform.md deleted file mode 100644 index 7ca5744429..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/create-platform.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.createPlatform('[PROJECT_ID]', 'web', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-project.md b/app/sdks/nodejs/docs/examples/projects/create-project.md deleted file mode 100644 index 787cba3cdb..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/create-project.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.createProject('[NAME]', '[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-task.md b/app/sdks/nodejs/docs/examples/projects/create-task.md deleted file mode 100644 index 6aeab88830..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/create-task.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/create-webhook.md b/app/sdks/nodejs/docs/examples/projects/create-webhook.md deleted file mode 100644 index 3998c671e2..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/create-webhook.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-key.md b/app/sdks/nodejs/docs/examples/projects/delete-key.md deleted file mode 100644 index 7aaa57ea15..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/delete-key.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.deleteKey('[PROJECT_ID]', '[KEY_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-platform.md b/app/sdks/nodejs/docs/examples/projects/delete-platform.md deleted file mode 100644 index 96a539a160..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/delete-platform.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.deletePlatform('[PROJECT_ID]', '[PLATFORM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-project.md b/app/sdks/nodejs/docs/examples/projects/delete-project.md deleted file mode 100644 index 755733f80b..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/delete-project.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.deleteProject('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-task.md b/app/sdks/nodejs/docs/examples/projects/delete-task.md deleted file mode 100644 index 944f31cc1c..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/delete-task.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.deleteTask('[PROJECT_ID]', '[TASK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/delete-webhook.md b/app/sdks/nodejs/docs/examples/projects/delete-webhook.md deleted file mode 100644 index faa5b59b6a..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/delete-webhook.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.deleteWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-key.md b/app/sdks/nodejs/docs/examples/projects/get-key.md deleted file mode 100644 index fa0c34f520..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/get-key.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.getKey('[PROJECT_ID]', '[KEY_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-platform.md b/app/sdks/nodejs/docs/examples/projects/get-platform.md deleted file mode 100644 index a54b7e6788..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/get-platform.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.getPlatform('[PROJECT_ID]', '[PLATFORM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-project-usage.md b/app/sdks/nodejs/docs/examples/projects/get-project-usage.md deleted file mode 100644 index b97c7b6366..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/get-project-usage.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.getProjectUsage('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-project.md b/app/sdks/nodejs/docs/examples/projects/get-project.md deleted file mode 100644 index d548b12ffd..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/get-project.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.getProject('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-task.md b/app/sdks/nodejs/docs/examples/projects/get-task.md deleted file mode 100644 index f6b6c6b558..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/get-task.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.getTask('[PROJECT_ID]', '[TASK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/get-webhook.md b/app/sdks/nodejs/docs/examples/projects/get-webhook.md deleted file mode 100644 index dbfa0f508f..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/get-webhook.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.getWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-keys.md b/app/sdks/nodejs/docs/examples/projects/list-keys.md deleted file mode 100644 index c66aee9905..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/list-keys.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.listKeys('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-platforms.md b/app/sdks/nodejs/docs/examples/projects/list-platforms.md deleted file mode 100644 index f92efcd1ce..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/list-platforms.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.listPlatforms('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-projects.md b/app/sdks/nodejs/docs/examples/projects/list-projects.md deleted file mode 100644 index a8f40d3bd7..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/list-projects.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.listProjects(); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-tasks.md b/app/sdks/nodejs/docs/examples/projects/list-tasks.md deleted file mode 100644 index fe8176abe9..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/list-tasks.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.listTasks('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/list-webhooks.md b/app/sdks/nodejs/docs/examples/projects/list-webhooks.md deleted file mode 100644 index b878f71618..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/list-webhooks.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.listWebhooks('[PROJECT_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-key.md b/app/sdks/nodejs/docs/examples/projects/update-key.md deleted file mode 100644 index 72f13ea361..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/update-key.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.updateKey('[PROJECT_ID]', '[KEY_ID]', '[NAME]', []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-platform.md b/app/sdks/nodejs/docs/examples/projects/update-platform.md deleted file mode 100644 index 44fad61cfb..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/update-platform.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.updatePlatform('[PROJECT_ID]', '[PLATFORM_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-project-o-auth.md b/app/sdks/nodejs/docs/examples/projects/update-project-o-auth.md deleted file mode 100644 index 29a3c6359f..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/update-project-o-auth.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.updateProjectOAuth('[PROJECT_ID]', 'bitbucket'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-project.md b/app/sdks/nodejs/docs/examples/projects/update-project.md deleted file mode 100644 index ced5f47fb3..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/update-project.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.updateProject('[PROJECT_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-task.md b/app/sdks/nodejs/docs/examples/projects/update-task.md deleted file mode 100644 index eaa54d89a5..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/update-task.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/projects/update-webhook.md b/app/sdks/nodejs/docs/examples/projects/update-webhook.md deleted file mode 100644 index 26f47557be..0000000000 --- a/app/sdks/nodejs/docs/examples/projects/update-webhook.md +++ /dev/null @@ -1,18 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let projects = new sdk.Projects(client); - -client - .setProject('') -; - -let promise = projects.updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/create-file.md b/app/sdks/nodejs/docs/examples/storage/create-file.md index d8d108017d..f0c9d4c5a8 100644 --- a/app/sdks/nodejs/docs/examples/storage/create-file.md +++ b/app/sdks/nodejs/docs/examples/storage/create-file.md @@ -7,6 +7,7 @@ let storage = new sdk.Storage(client); client .setProject('') + .setKey('') ; let promise = storage.createFile(document.getElementById('uploader').files[0], [], []); diff --git a/app/sdks/nodejs/docs/examples/storage/delete-file.md b/app/sdks/nodejs/docs/examples/storage/delete-file.md index fae85d0b1d..9e8d13880f 100644 --- a/app/sdks/nodejs/docs/examples/storage/delete-file.md +++ b/app/sdks/nodejs/docs/examples/storage/delete-file.md @@ -7,6 +7,7 @@ let storage = new sdk.Storage(client); client .setProject('') + .setKey('') ; let promise = storage.deleteFile('[FILE_ID]'); diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-download.md b/app/sdks/nodejs/docs/examples/storage/get-file-download.md index 10ca0322a3..2967170695 100644 --- a/app/sdks/nodejs/docs/examples/storage/get-file-download.md +++ b/app/sdks/nodejs/docs/examples/storage/get-file-download.md @@ -7,6 +7,7 @@ let storage = new sdk.Storage(client); client .setProject('') + .setKey('') ; let promise = storage.getFileDownload('[FILE_ID]'); diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-preview.md b/app/sdks/nodejs/docs/examples/storage/get-file-preview.md index f8a4b1ea02..0c09e8ca8d 100644 --- a/app/sdks/nodejs/docs/examples/storage/get-file-preview.md +++ b/app/sdks/nodejs/docs/examples/storage/get-file-preview.md @@ -7,6 +7,7 @@ let storage = new sdk.Storage(client); client .setProject('') + .setKey('') ; let promise = storage.getFilePreview('[FILE_ID]'); diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-view.md b/app/sdks/nodejs/docs/examples/storage/get-file-view.md index 34260abe30..a3074fbed1 100644 --- a/app/sdks/nodejs/docs/examples/storage/get-file-view.md +++ b/app/sdks/nodejs/docs/examples/storage/get-file-view.md @@ -7,6 +7,7 @@ let storage = new sdk.Storage(client); client .setProject('') + .setKey('') ; let promise = storage.getFileView('[FILE_ID]'); diff --git a/app/sdks/nodejs/docs/examples/storage/get-file.md b/app/sdks/nodejs/docs/examples/storage/get-file.md index 16e109f2ef..a1a3baf009 100644 --- a/app/sdks/nodejs/docs/examples/storage/get-file.md +++ b/app/sdks/nodejs/docs/examples/storage/get-file.md @@ -7,6 +7,7 @@ let storage = new sdk.Storage(client); client .setProject('') + .setKey('') ; let promise = storage.getFile('[FILE_ID]'); diff --git a/app/sdks/nodejs/docs/examples/storage/list-files.md b/app/sdks/nodejs/docs/examples/storage/list-files.md index 61fcc799b0..59a331a2b5 100644 --- a/app/sdks/nodejs/docs/examples/storage/list-files.md +++ b/app/sdks/nodejs/docs/examples/storage/list-files.md @@ -7,6 +7,7 @@ let storage = new sdk.Storage(client); client .setProject('') + .setKey('') ; let promise = storage.listFiles(); diff --git a/app/sdks/nodejs/docs/examples/storage/update-file.md b/app/sdks/nodejs/docs/examples/storage/update-file.md index fbe5d588fb..3741785996 100644 --- a/app/sdks/nodejs/docs/examples/storage/update-file.md +++ b/app/sdks/nodejs/docs/examples/storage/update-file.md @@ -7,6 +7,7 @@ let storage = new sdk.Storage(client); client .setProject('') + .setKey('') ; let promise = storage.updateFile('[FILE_ID]', [], []); diff --git a/app/sdks/nodejs/docs/examples/teams/create-team-membership.md b/app/sdks/nodejs/docs/examples/teams/create-team-membership.md index 4106ac2a11..7a2c9be298 100644 --- a/app/sdks/nodejs/docs/examples/teams/create-team-membership.md +++ b/app/sdks/nodejs/docs/examples/teams/create-team-membership.md @@ -7,6 +7,7 @@ let teams = new sdk.Teams(client); client .setProject('') + .setKey('') ; let promise = teams.createTeamMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); diff --git a/app/sdks/nodejs/docs/examples/teams/create-team.md b/app/sdks/nodejs/docs/examples/teams/create-team.md index c0bf9b7d59..73dd77ecc5 100644 --- a/app/sdks/nodejs/docs/examples/teams/create-team.md +++ b/app/sdks/nodejs/docs/examples/teams/create-team.md @@ -7,6 +7,7 @@ let teams = new sdk.Teams(client); client .setProject('') + .setKey('') ; let promise = teams.createTeam('[NAME]'); diff --git a/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md b/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md index 859a9ca8a9..435a65026f 100644 --- a/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md @@ -7,6 +7,7 @@ let teams = new sdk.Teams(client); client .setProject('') + .setKey('') ; let promise = teams.deleteTeamMembership('[TEAM_ID]', '[INVITE_ID]'); diff --git a/app/sdks/nodejs/docs/examples/teams/delete-team.md b/app/sdks/nodejs/docs/examples/teams/delete-team.md index 7c87cc9260..0204d40c98 100644 --- a/app/sdks/nodejs/docs/examples/teams/delete-team.md +++ b/app/sdks/nodejs/docs/examples/teams/delete-team.md @@ -7,6 +7,7 @@ let teams = new sdk.Teams(client); client .setProject('') + .setKey('') ; let promise = teams.deleteTeam('[TEAM_ID]'); diff --git a/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md b/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md index 4dd49446fa..038fd4e2a0 100644 --- a/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md +++ b/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md @@ -7,6 +7,7 @@ let teams = new sdk.Teams(client); client .setProject('') + .setKey('') ; let promise = teams.getTeamMemberships('[TEAM_ID]'); diff --git a/app/sdks/nodejs/docs/examples/teams/get-team.md b/app/sdks/nodejs/docs/examples/teams/get-team.md index 0e65a57e7e..b716b7ea01 100644 --- a/app/sdks/nodejs/docs/examples/teams/get-team.md +++ b/app/sdks/nodejs/docs/examples/teams/get-team.md @@ -7,6 +7,7 @@ let teams = new sdk.Teams(client); client .setProject('') + .setKey('') ; let promise = teams.getTeam('[TEAM_ID]'); diff --git a/app/sdks/nodejs/docs/examples/teams/list-teams.md b/app/sdks/nodejs/docs/examples/teams/list-teams.md index d8d3ca7010..609c708753 100644 --- a/app/sdks/nodejs/docs/examples/teams/list-teams.md +++ b/app/sdks/nodejs/docs/examples/teams/list-teams.md @@ -7,6 +7,7 @@ let teams = new sdk.Teams(client); client .setProject('') + .setKey('') ; let promise = teams.listTeams(); diff --git a/app/sdks/nodejs/docs/examples/teams/update-team-membership-status.md b/app/sdks/nodejs/docs/examples/teams/update-team-membership-status.md deleted file mode 100644 index daeaf47fa0..0000000000 --- a/app/sdks/nodejs/docs/examples/teams/update-team-membership-status.md +++ /dev/null @@ -1,17 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client -; - -let promise = teams.updateTeamMembershipStatus('[TEAM_ID]', '[INVITE_ID]', '[USER_ID]', '[SECRET]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/update-team.md b/app/sdks/nodejs/docs/examples/teams/update-team.md index d527ca95ab..6afb377091 100644 --- a/app/sdks/nodejs/docs/examples/teams/update-team.md +++ b/app/sdks/nodejs/docs/examples/teams/update-team.md @@ -7,6 +7,7 @@ let teams = new sdk.Teams(client); client .setProject('') + .setKey('') ; let promise = teams.updateTeam('[TEAM_ID]', '[NAME]'); diff --git a/app/sdks/nodejs/docs/examples/users/create-user.md b/app/sdks/nodejs/docs/examples/users/create-user.md index a5c637c383..d07ab1eabf 100644 --- a/app/sdks/nodejs/docs/examples/users/create-user.md +++ b/app/sdks/nodejs/docs/examples/users/create-user.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.createUser('email@example.com', 'password'); diff --git a/app/sdks/nodejs/docs/examples/users/delete-user-session.md b/app/sdks/nodejs/docs/examples/users/delete-user-session.md index a3cbeb522c..dab704e2d4 100644 --- a/app/sdks/nodejs/docs/examples/users/delete-user-session.md +++ b/app/sdks/nodejs/docs/examples/users/delete-user-session.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.deleteUserSession('[USER_ID]', '[SESSION_ID]'); diff --git a/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md b/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md index 0b972bd21c..33f803298d 100644 --- a/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.deleteUserSessions('[USER_ID]'); diff --git a/app/sdks/nodejs/docs/examples/users/get-user-logs.md b/app/sdks/nodejs/docs/examples/users/get-user-logs.md index 1ff249ea31..85d0a125a0 100644 --- a/app/sdks/nodejs/docs/examples/users/get-user-logs.md +++ b/app/sdks/nodejs/docs/examples/users/get-user-logs.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.getUserLogs('[USER_ID]'); diff --git a/app/sdks/nodejs/docs/examples/users/get-user-prefs.md b/app/sdks/nodejs/docs/examples/users/get-user-prefs.md index 33e26ebda8..46d959e1cb 100644 --- a/app/sdks/nodejs/docs/examples/users/get-user-prefs.md +++ b/app/sdks/nodejs/docs/examples/users/get-user-prefs.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.getUserPrefs('[USER_ID]'); diff --git a/app/sdks/nodejs/docs/examples/users/get-user-sessions.md b/app/sdks/nodejs/docs/examples/users/get-user-sessions.md index 09e7e4bbdb..b3dfe28405 100644 --- a/app/sdks/nodejs/docs/examples/users/get-user-sessions.md +++ b/app/sdks/nodejs/docs/examples/users/get-user-sessions.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.getUserSessions('[USER_ID]'); diff --git a/app/sdks/nodejs/docs/examples/users/get-user.md b/app/sdks/nodejs/docs/examples/users/get-user.md index 1a9b1b5463..96676c0196 100644 --- a/app/sdks/nodejs/docs/examples/users/get-user.md +++ b/app/sdks/nodejs/docs/examples/users/get-user.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.getUser('[USER_ID]'); diff --git a/app/sdks/nodejs/docs/examples/users/list-users.md b/app/sdks/nodejs/docs/examples/users/list-users.md index 0e609113a8..455e42db4d 100644 --- a/app/sdks/nodejs/docs/examples/users/list-users.md +++ b/app/sdks/nodejs/docs/examples/users/list-users.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.listUsers(); diff --git a/app/sdks/nodejs/docs/examples/users/update-user-prefs.md b/app/sdks/nodejs/docs/examples/users/update-user-prefs.md index 58009109f8..8788ac7dba 100644 --- a/app/sdks/nodejs/docs/examples/users/update-user-prefs.md +++ b/app/sdks/nodejs/docs/examples/users/update-user-prefs.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.updateUserPrefs('[USER_ID]', ''); diff --git a/app/sdks/nodejs/docs/examples/users/update-user-status.md b/app/sdks/nodejs/docs/examples/users/update-user-status.md index 99227df81b..858833a50c 100644 --- a/app/sdks/nodejs/docs/examples/users/update-user-status.md +++ b/app/sdks/nodejs/docs/examples/users/update-user-status.md @@ -7,6 +7,7 @@ let users = new sdk.Users(client); client .setProject('') + .setKey('') ; let promise = users.updateUserStatus('[USER_ID]', '1'); diff --git a/app/sdks/nodejs/index.js b/app/sdks/nodejs/index.js index 89e82ef555..d9e8b5a391 100644 --- a/app/sdks/nodejs/index.js +++ b/app/sdks/nodejs/index.js @@ -1,20 +1,16 @@ const Client = require('./lib/client.js'); -const Account = require('./lib/services/account.js'); const Avatars = require('./lib/services/avatars.js'); const Database = require('./lib/services/database.js'); const Locale = require('./lib/services/locale.js'); -const Projects = require('./lib/services/projects.js'); const Storage = require('./lib/services/storage.js'); const Teams = require('./lib/services/teams.js'); const Users = require('./lib/services/users.js'); module.exports = { Client, - Account, Avatars, Database, Locale, - Projects, Storage, Teams, Users, diff --git a/app/sdks/nodejs/lib/services/account.js b/app/sdks/nodejs/lib/services/account.js deleted file mode 100644 index 27f6d1f709..0000000000 --- a/app/sdks/nodejs/lib/services/account.js +++ /dev/null @@ -1,474 +0,0 @@ -const Service = require('../service.js'); - -class Account extends Service { - - /** - * Get Account - * - * Get currently logged in user data as JSON object. - * - * @throws Exception - * @return {} - */ - async getAccount() { - let path = '/account'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Account - * - * Use this endpoint to allow a new user to register an account in your - * project. Use the success and failure URLs to redirect users back to your - * application after signup completes. - * - * If registration completes successfully user will be sent with a - * confirmation email in order to confirm he is the owner of the account email - * address. Use the confirmation parameter to redirect the user from the - * confirmation email back to your app. When the user is redirected, use the - * /auth/confirm endpoint to complete the account confirmation. - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param string email - * @param string password - * @param string name - * @throws Exception - * @return {} - */ - async createAccount(email, password, name = '') { - let path = '/account'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'password': password, - 'name': name - }); - } - - /** - * Delete Account - * - * Delete a currently logged in user account. Behind the scene, the user - * record is not deleted but permanently blocked from any access. This is done - * to avoid deleted accounts being overtaken by new users with the same email - * address. Any user-related resources like documents or storage files should - * be deleted separately. - * - * @throws Exception - * @return {} - */ - async delete() { - let path = '/account'; - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Account Email - * - * Update currently logged in user account email address. After changing user - * address, user confirmation status is being reset and a new confirmation - * mail is sent. For security measures, user password is required to complete - * this request. - * - * @param string email - * @param string password - * @throws Exception - * @return {} - */ - async updateEmail(email, password) { - let path = '/account/email'; - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'password': password - }); - } - - /** - * Get Account Logs - * - * Get currently logged in user list of latest security activity logs. Each - * log returns user IP address, location and date and time of log. - * - * @throws Exception - * @return {} - */ - async getAccountLogs() { - let path = '/account/logs'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Account Name - * - * Update currently logged in user account name. - * - * @param string name - * @throws Exception - * @return {} - */ - async updateAccountName(name) { - let path = '/account/name'; - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'name': name - }); - } - - /** - * Update Account Password - * - * Update currently logged in user password. For validation, user is required - * to pass the password twice. - * - * @param string password - * @param string oldPassword - * @throws Exception - * @return {} - */ - async updateAccountPassword(password, oldPassword) { - let path = '/account/password'; - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'password': password, - 'old-password': oldPassword - }); - } - - /** - * Get Account Preferences - * - * Get currently logged in user preferences key-value object. - * - * @throws Exception - * @return {} - */ - async getAccountPrefs() { - let path = '/account/prefs'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Account Preferences - * - * Update currently logged in user account preferences. You can pass only the - * specific settings you wish to update. - * - * @param string prefs - * @throws Exception - * @return {} - */ - async updatePrefs(prefs) { - let path = '/account/prefs'; - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'prefs': prefs - }); - } - - /** - * Password Recovery - * - * Sends the user an email with a temporary secret key for password reset. - * When the user clicks the confirmation link he is redirected back to your - * app password reset URL with the secret key and email address values - * attached to the URL query string. Use the query string params to submit a - * request to the /auth/password/reset endpoint to complete the process. - * - * @param string email - * @param string url - * @throws Exception - * @return {} - */ - async createAccountRecovery(email, url) { - let path = '/account/recovery'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'url': url - }); - } - - /** - * Password Reset - * - * Use this endpoint to complete the user account password reset. Both the - * **userId** and **secret** arguments will be passed as query parameters to - * the redirect URL you have provided when sending your request to the - * /auth/recovery endpoint. - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param string userId - * @param string secret - * @param string passwordA - * @param string passwordB - * @throws Exception - * @return {} - */ - async updateAccountRecovery(userId, secret, passwordA, passwordB) { - let path = '/account/recovery'; - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'userId': userId, - 'secret': secret, - 'password-a': passwordA, - 'password-b': passwordB - }); - } - - /** - * Get Account Sessions - * - * Get currently logged in user list of active sessions across different - * devices. - * - * @throws Exception - * @return {} - */ - async getAccountSessions() { - let path = '/account/sessions'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Account Session - * - * Allow the user to login into his account by providing a valid email and - * password combination. Use the success and failure arguments to provide a - * redirect URL's back to your app when login is completed. - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param string email - * @param string password - * @throws Exception - * @return {} - */ - async createAccountSession(email, password) { - let path = '/account/sessions'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'email': email, - 'password': password - }); - } - - /** - * Delete All Account Sessions - * - * Delete all sessions from the user account and remove any sessions cookies - * from the end client. - * - * @throws Exception - * @return {} - */ - async deleteAccountSessions() { - let path = '/account/sessions'; - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Delete Current Account Session - * - * Use this endpoint to log out the currently logged in user from his account. - * When successful this endpoint will delete the user session and remove the - * session secret cookie from the user client. - * - * @throws Exception - * @return {} - */ - async deleteAccountCurrentSession() { - let path = '/account/sessions/current'; - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Account Session with OAuth - * - * Allow the user to login to his account using the OAuth provider of his - * choice. Each OAuth provider should be enabled from the Appwrite console - * first. Use the success and failure arguments to provide a redirect URL's - * back to your app when login is completed. - * - * @param string provider - * @param string success - * @param string failure - * @throws Exception - * @return {} - */ - async createAccountSessionOAuth(provider, success, failure) { - let path = '/account/sessions/oauth/{provider}'.replace(new RegExp('{provider}', 'g'), provider); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - 'success': success, - 'failure': failure - }); - } - - /** - * Delete Account Session - * - * Use this endpoint to log out the currently logged in user from all his - * account sessions across all his different devices. When using the option id - * argument, only the session unique ID provider will be deleted. - * - * @param string id - * @throws Exception - * @return {} - */ - async deleteAccountSession(id) { - let path = '/account/sessions/{id}'.replace(new RegExp('{id}', 'g'), id); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Verification - * - * Use this endpoint to send a verification message to your user email address - * to confirm they are the valid owners of that address. Both the **userId** - * and **secret** arguments will be passed as query parameters to the URL you - * have provider to be attached to the verification email. The provided URL - * should redirect the user back for your app and allow you to complete the - * verification process by verifying both the **userId** and **secret** - * parameters. Learn more about how to [complete the verification - * process](/docs/account#updateAccountVerification). - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param string url - * @throws Exception - * @return {} - */ - async createAccountVerification(url) { - let path = '/account/verification'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'url': url - }); - } - - /** - * Updated Verification - * - * Use this endpoint to complete the user email verification process. Use both - * the **userId** and **secret** parameters that were attached to your app URL - * to verify the user email ownership. If confirmed this route will return a - * 200 status code. - * - * @param string userId - * @param string secret - * @param string passwordB - * @throws Exception - * @return {} - */ - async updateAccountVerification(userId, secret, passwordB) { - let path = '/account/verification'; - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'userId': userId, - 'secret': secret, - 'password-b': passwordB - }); - } -} - -module.exports = Account; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/projects.js b/app/sdks/nodejs/lib/services/projects.js deleted file mode 100644 index 58a03980a2..0000000000 --- a/app/sdks/nodejs/lib/services/projects.js +++ /dev/null @@ -1,609 +0,0 @@ -const Service = require('../service.js'); - -class Projects extends Service { - - /** - * List Projects - * - * @throws Exception - * @return {} - */ - async listProjects() { - let path = '/projects'; - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Project - * - * @param string name - * @param string teamId - * @param string description - * @param string logo - * @param string url - * @param string legalName - * @param string legalCountry - * @param string legalState - * @param string legalCity - * @param string legalAddress - * @param string legalTaxId - * @throws Exception - * @return {} - */ - async createProject(name, teamId, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { - let path = '/projects'; - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'teamId': teamId, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legalName, - 'legalCountry': legalCountry, - 'legalState': legalState, - 'legalCity': legalCity, - 'legalAddress': legalAddress, - 'legalTaxId': legalTaxId - }); - } - - /** - * Get Project - * - * @param string projectId - * @throws Exception - * @return {} - */ - async getProject(projectId) { - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Project - * - * @param string projectId - * @param string name - * @param string description - * @param string logo - * @param string url - * @param string legalName - * @param string legalCountry - * @param string legalState - * @param string legalCity - * @param string legalAddress - * @param string legalTaxId - * @throws Exception - * @return {} - */ - async updateProject(projectId, name, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legalName, - 'legalCountry': legalCountry, - 'legalState': legalState, - 'legalCity': legalCity, - 'legalAddress': legalAddress, - 'legalTaxId': legalTaxId - }); - } - - /** - * Delete Project - * - * @param string projectId - * @throws Exception - * @return {} - */ - async deleteProject(projectId) { - let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Keys - * - * @param string projectId - * @throws Exception - * @return {} - */ - async listKeys(projectId) { - let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Key - * - * @param string projectId - * @param string name - * @param array scopes - * @throws Exception - * @return {} - */ - async createKey(projectId, name, scopes) { - let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'scopes': scopes - }); - } - - /** - * Get Key - * - * @param string projectId - * @param string keyId - * @throws Exception - * @return {} - */ - async getKey(projectId, keyId) { - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Key - * - * @param string projectId - * @param string keyId - * @param string name - * @param array scopes - * @throws Exception - * @return {} - */ - async updateKey(projectId, keyId, name, scopes) { - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'scopes': scopes - }); - } - - /** - * Delete Key - * - * @param string projectId - * @param string keyId - * @throws Exception - * @return {} - */ - async deleteKey(projectId, keyId) { - let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Project OAuth - * - * @param string projectId - * @param string provider - * @param string appId - * @param string secret - * @throws Exception - * @return {} - */ - async updateProjectOAuth(projectId, provider, appId = '', secret = '') { - let path = '/projects/{projectId}/oauth'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'provider': provider, - 'appId': appId, - 'secret': secret - }); - } - - /** - * List Platforms - * - * @param string projectId - * @throws Exception - * @return {} - */ - async listPlatforms(projectId) { - let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Platform - * - * @param string projectId - * @param string type - * @param string name - * @param string key - * @param string store - * @param string url - * @throws Exception - * @return {} - */ - async createPlatform(projectId, type, name, key = '', store = '', url = '') { - let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'type': type, - 'name': name, - 'key': key, - 'store': store, - 'url': url - }); - } - - /** - * Get Platform - * - * @param string projectId - * @param string platformId - * @throws Exception - * @return {} - */ - async getPlatform(projectId, platformId) { - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Platform - * - * @param string projectId - * @param string platformId - * @param string name - * @param string key - * @param string store - * @param string url - * @throws Exception - * @return {} - */ - async updatePlatform(projectId, platformId, name, key = '', store = '', url = '') { - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'key': key, - 'store': store, - 'url': url - }); - } - - /** - * Delete Platform - * - * @param string projectId - * @param string platformId - * @throws Exception - * @return {} - */ - async deletePlatform(projectId, platformId) { - let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Tasks - * - * @param string projectId - * @throws Exception - * @return {} - */ - async listTasks(projectId) { - let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Task - * - * @param string projectId - * @param string name - * @param string status - * @param string schedule - * @param number security - * @param string httpMethod - * @param string httpUrl - * @param array httpHeaders - * @param string httpUser - * @param string httpPass - * @throws Exception - * @return {} - */ - async createTask(projectId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { - let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': httpMethod, - 'httpUrl': httpUrl, - 'httpHeaders': httpHeaders, - 'httpUser': httpUser, - 'httpPass': httpPass - }); - } - - /** - * Get Task - * - * @param string projectId - * @param string taskId - * @throws Exception - * @return {} - */ - async getTask(projectId, taskId) { - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Task - * - * @param string projectId - * @param string taskId - * @param string name - * @param string status - * @param string schedule - * @param number security - * @param string httpMethod - * @param string httpUrl - * @param array httpHeaders - * @param string httpUser - * @param string httpPass - * @throws Exception - * @return {} - */ - async updateTask(projectId, taskId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': httpMethod, - 'httpUrl': httpUrl, - 'httpHeaders': httpHeaders, - 'httpUser': httpUser, - 'httpPass': httpPass - }); - } - - /** - * Delete Task - * - * @param string projectId - * @param string taskId - * @throws Exception - * @return {} - */ - async deleteTask(projectId, taskId) { - let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Get Project - * - * @param string projectId - * @throws Exception - * @return {} - */ - async getProjectUsage(projectId) { - let path = '/projects/{projectId}/usage'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * List Webhooks - * - * @param string projectId - * @throws Exception - * @return {} - */ - async listWebhooks(projectId) { - let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Create Webhook - * - * @param string projectId - * @param string name - * @param array events - * @param string url - * @param number security - * @param string httpUser - * @param string httpPass - * @throws Exception - * @return {} - */ - async createWebhook(projectId, name, events, url, security, httpUser = '', httpPass = '') { - let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); - - return await this.client.call('post', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': httpUser, - 'httpPass': httpPass - }); - } - - /** - * Get Webhook - * - * @param string projectId - * @param string webhookId - * @throws Exception - * @return {} - */ - async getWebhook(projectId, webhookId) { - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - return await this.client.call('get', path, { - 'content-type': 'application/json', - }, - { - }); - } - - /** - * Update Webhook - * - * @param string projectId - * @param string webhookId - * @param string name - * @param array events - * @param string url - * @param number security - * @param string httpUser - * @param string httpPass - * @throws Exception - * @return {} - */ - async updateWebhook(projectId, webhookId, name, events, url, security, httpUser = '', httpPass = '') { - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - return await this.client.call('put', path, { - 'content-type': 'application/json', - }, - { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': httpUser, - 'httpPass': httpPass - }); - } - - /** - * Delete Webhook - * - * @param string projectId - * @param string webhookId - * @throws Exception - * @return {} - */ - async deleteWebhook(projectId, webhookId) { - let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); - - return await this.client.call('delete', path, { - 'content-type': 'application/json', - }, - { - }); - } -} - -module.exports = Projects; \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/teams.js b/app/sdks/nodejs/lib/services/teams.js index 5da060f2b9..b54ca076db 100644 --- a/app/sdks/nodejs/lib/services/teams.js +++ b/app/sdks/nodejs/lib/services/teams.js @@ -197,44 +197,6 @@ class Teams extends Service { { }); } - - /** - * Update Team Membership Status - * - * Use this endpoint to let user accept an invitation to join a team after he - * is being redirect back to your app from the invitation email. Use the - * success and failure URL's to redirect users back to your application after - * the request completes. - * - * Please note that in order to avoid a [Redirect - * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URL's are the once from domains you have set when - * added your platforms in the console interface. - * - * When not using the success or failure redirect arguments this endpoint will - * result with a 200 status code on success and with 401 status error on - * failure. This behavior was applied to help the web clients deal with - * browsers who don't allow to set 3rd party HTTP cookies needed for saving - * the account session key. - * - * @param string teamId - * @param string inviteId - * @param string userId - * @param string secret - * @throws Exception - * @return {} - */ - async updateTeamMembershipStatus(teamId, inviteId, userId, secret) { - let path = '/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); - - return await this.client.call('patch', path, { - 'content-type': 'application/json', - }, - { - 'userId': userId, - 'secret': secret - }); - } } module.exports = Teams; \ No newline at end of file diff --git a/app/sdks/php/docs/account.md b/app/sdks/php/docs/account.md deleted file mode 100644 index 26e195d673..0000000000 --- a/app/sdks/php/docs/account.md +++ /dev/null @@ -1,253 +0,0 @@ -# Account Service - -## Get Account - -```http request -GET https://appwrite.io/v1/account -``` - -** Get currently logged in user data as JSON object. ** - -## Create Account - -```http request -POST https://appwrite.io/v1/account -``` - -** Use this endpoint to allow a new user to register an account in your project. Use the success and failure URLs to redirect users back to your application after signup completes. - -If registration completes successfully user will be sent with a confirmation email in order to confirm he is the owner of the account email address. Use the confirmation parameter to redirect the user from the confirmation email back to your app. When the user is redirected, use the /auth/confirm endpoint to complete the account confirmation. - -Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. - -When accessing this route using Javascript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| email | string | Account email | | -| password | string | User password | | -| name | string | User name | | - -## Delete Account - -```http request -DELETE https://appwrite.io/v1/account -``` - -** Delete a currently logged in user account. Behind the scene, the user record is not deleted but permanently blocked from any access. This is done to avoid deleted accounts being overtaken by new users with the same email address. Any user-related resources like documents or storage files should be deleted separately. ** - -## Update Account Email - -```http request -PATCH https://appwrite.io/v1/account/email -``` - -** Update currently logged in user account email address. After changing user address, user confirmation status is being reset and a new confirmation mail is sent. For security measures, user password is required to complete this request. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| email | string | Email address | | -| password | string | User password | | - -## Get Account Logs - -```http request -GET https://appwrite.io/v1/account/logs -``` - -** Get currently logged in user list of latest security activity logs. Each log returns user IP address, location and date and time of log. ** - -## Update Account Name - -```http request -PATCH https://appwrite.io/v1/account/name -``` - -** Update currently logged in user account name. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| name | string | User name | | - -## Update Account Password - -```http request -PATCH https://appwrite.io/v1/account/password -``` - -** Update currently logged in user password. For validation, user is required to pass the password twice. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| password | string | New password | | -| old-password | string | Old password | | - -## Get Account Preferences - -```http request -GET https://appwrite.io/v1/account/prefs -``` - -** Get currently logged in user preferences key-value object. ** - -## Update Account Preferences - -```http request -PATCH https://appwrite.io/v1/account/prefs -``` - -** Update currently logged in user account preferences. You can pass only the specific settings you wish to update. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| prefs | string | Prefs key-value JSON object. | | - -## Password Recovery - -```http request -POST https://appwrite.io/v1/account/recovery -``` - -** Sends the user an email with a temporary secret key for password reset. When the user clicks the confirmation link he is redirected back to your app password reset URL with the secret key and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| email | string | User account email address. | | -| url | string | URL to redirect the user back to your app from the recovery email. | | - -## Password Reset - -```http request -PUT https://appwrite.io/v1/account/recovery -``` - -** Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. - -Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| userId | string | User account UID address. | | -| secret | string | Valid reset token. | | -| password-a | string | New password. | | -| password-b | string | New password again. | | - -## Get Account Sessions - -```http request -GET https://appwrite.io/v1/account/sessions -``` - -** Get currently logged in user list of active sessions across different devices. ** - -## Create Account Session - -```http request -POST https://appwrite.io/v1/account/sessions -``` - -** Allow the user to login into his account by providing a valid email and password combination. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. - -Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. - -When accessing this route using Javascript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| email | string | User account email address | | -| password | string | User account password | | - -## Delete All Account Sessions - -```http request -DELETE https://appwrite.io/v1/account/sessions -``` - -** Delete all sessions from the user account and remove any sessions cookies from the end client. ** - -## Delete Current Account Session - -```http request -DELETE https://appwrite.io/v1/account/sessions/current -``` - -** Use this endpoint to log out the currently logged in user from his account. When successful this endpoint will delete the user session and remove the session secret cookie from the user client. ** - -## Create Account Session with OAuth - -```http request -GET https://appwrite.io/v1/account/sessions/oauth/{provider} -``` - -** Allow the user to login to his account using the OAuth provider of his choice. Each OAuth provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| provider | string | **Required** OAuth Provider. Currently, supported providers are: bitbucket, facebook, github, gitlab, google, microsoft, linkedin, slack, dropbox, salesforce, amazon, vk, discord, twitch, spotify, yahoo, yandex, twitter, paypal, bitly, mock | | -| success | string | **Required** URL to redirect back to your app after a successful login attempt. | | -| failure | string | **Required** URL to redirect back to your app after a failed login attempt. | | - -## Delete Account Session - -```http request -DELETE https://appwrite.io/v1/account/sessions/{id} -``` - -** Use this endpoint to log out the currently logged in user from all his account sessions across all his different devices. When using the option id argument, only the session unique ID provider will be deleted. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| id | string | **Required** Session unique ID. | | - -## Create Verification - -```http request -POST https://appwrite.io/v1/account/verification -``` - -** Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provider to be attached to the verification email. The provided URL should redirect the user back for your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](/docs/account#updateAccountVerification). - -Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| url | string | URL to redirect the user back to your app from the verification email. | | - -## Updated Verification - -```http request -PUT https://appwrite.io/v1/account/verification -``` - -** Use this endpoint to complete the user email verification process. Use both the **userId** and **secret** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| userId | string | User account UID address. | | -| secret | string | Valid reset token. | | -| password-b | string | New password again. | | - diff --git a/app/sdks/php/docs/auth.md b/app/sdks/php/docs/auth.md deleted file mode 100644 index 2af37f5239..0000000000 --- a/app/sdks/php/docs/auth.md +++ /dev/null @@ -1,151 +0,0 @@ -# Auth Service - -## Login - -```http request -POST https://appwrite.io/v1/auth/login -``` - -** Allow the user to login into his account by providing a valid email and password combination. Use the success and failure arguments to provide a redirect URL\'s back to your app when login is completed. - -Please notice that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. - -When accessing this route using Javascript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| email | string | User account email address | | -| password | string | User account password | | -| success | string | URL to redirect back to your app after a successful login attempt. | | -| failure | string | URL to redirect back to your app after a failed login attempt. | | - -## Login with OAuth - -```http request -GET https://appwrite.io/v1/auth/login/oauth/{provider} -``` - -** Allow the user to login to his account using the OAuth provider of his choice. Each OAuth provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| provider | string | **Required** OAuth Provider. Currently, supported providers are: bitbucket, facebook, github, gitlab, google, microsoft, linkedin, slack, dropbox, amazon, vk | | -| success | string | **Required** URL to redirect back to your app after a successful login attempt. | | -| failure | string | **Required** URL to redirect back to your app after a failed login attempt. | | - -## Logout Current Session - -```http request -DELETE https://appwrite.io/v1/auth/logout -``` - -** Use this endpoint to log out the currently logged in user from his account. When successful this endpoint will delete the user session and remove the session secret cookie from the user client. ** - -## Logout Specific Session - -```http request -DELETE https://appwrite.io/v1/auth/logout/{id} -``` - -** Use this endpoint to log out the currently logged in user from all his account sessions across all his different devices. When using the option id argument, only the session unique ID provider will be deleted. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| id | string | **Required** User specific session unique ID number. if 0 delete all sessions. | | - -## Password Recovery - -```http request -POST https://appwrite.io/v1/auth/recovery -``` - -** Sends the user an email with a temporary secret token for password reset. When the user clicks the confirmation link he is redirected back to your app password reset redirect URL with a secret token and email address values attached to the URL query string. Use the query string params to submit a request to the /auth/password/reset endpoint to complete the process. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| email | string | User account email address. | | -| reset | string | Reset URL in your app to redirect the user after the reset token has been sent to the user email. | | - -## Password Reset - -```http request -PUT https://appwrite.io/v1/auth/recovery/reset -``` - -** Use this endpoint to complete the user account password reset. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/recovery endpoint. - -Please notice that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| userId | string | User account email address. | | -| token | string | Valid reset token. | | -| password-a | string | New password. | | -| password-b | string | New password again. | | - -## Register - -```http request -POST https://appwrite.io/v1/auth/register -``` - -** Use this endpoint to allow a new user to register an account in your project. Use the success and failure URLs to redirect users back to your application after signup completes. - -If registration completes successfully user will be sent with a confirmation email in order to confirm he is the owner of the account email address. Use the confirmation parameter to redirect the user from the confirmation email back to your app. When the user is redirected, use the /auth/confirm endpoint to complete the account confirmation. - -Please notice that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. - -When accessing this route using Javascript from the browser, success and failure parameter URLs are required. Appwrite server will respond with a 301 redirect status code and will set the user session cookie. This behavior is enforced because modern browsers are limiting 3rd party cookies in XHR of fetch requests to protect user privacy. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| email | string | Account email | | -| password | string | User password | | -| confirm | string | Confirmation URL to redirect user after confirm token has been sent to user email | | -| success | string | Redirect when registration succeed | | -| failure | string | Redirect when registration failed | | -| name | string | User name | | - -## Confirmation - -```http request -POST https://appwrite.io/v1/auth/register/confirm -``` - -** Use this endpoint to complete the confirmation of the user account email address. Both the **userId** and **token** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the /auth/register endpoint. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| userId | string | User unique ID | | -| token | string | Confirmation secret token | | - -## Resend Confirmation - -```http request -POST https://appwrite.io/v1/auth/register/confirm/resend -``` - -** This endpoint allows the user to request your app to resend him his email confirmation message. The redirect arguments act the same way as in /auth/register endpoint. - -Please notice that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| confirm | string | Confirmation URL to redirect user to your app after confirm token has been sent to user email. | | - diff --git a/app/sdks/php/docs/examples/account/create-account-recovery.md b/app/sdks/php/docs/examples/account/create-account-recovery.md deleted file mode 100644 index 0ba77c1e1f..0000000000 --- a/app/sdks/php/docs/examples/account/create-account-recovery.md +++ /dev/null @@ -1,13 +0,0 @@ -createAccountRecovery('email@example.com', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/create-account-session-o-auth.md b/app/sdks/php/docs/examples/account/create-account-session-o-auth.md deleted file mode 100644 index 7e0e4decaf..0000000000 --- a/app/sdks/php/docs/examples/account/create-account-session-o-auth.md +++ /dev/null @@ -1,13 +0,0 @@ -createAccountSessionOAuth('bitbucket', 'https://example.com', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/create-account-session.md b/app/sdks/php/docs/examples/account/create-account-session.md deleted file mode 100644 index daa9aefab6..0000000000 --- a/app/sdks/php/docs/examples/account/create-account-session.md +++ /dev/null @@ -1,13 +0,0 @@ -createAccountSession('email@example.com', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/create-account-verification.md b/app/sdks/php/docs/examples/account/create-account-verification.md deleted file mode 100644 index a7cbb8da35..0000000000 --- a/app/sdks/php/docs/examples/account/create-account-verification.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->createAccountVerification('https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/create-account.md b/app/sdks/php/docs/examples/account/create-account.md deleted file mode 100644 index d6425fc205..0000000000 --- a/app/sdks/php/docs/examples/account/create-account.md +++ /dev/null @@ -1,13 +0,0 @@ -createAccount('email@example.com', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/delete-account-current-session.md b/app/sdks/php/docs/examples/account/delete-account-current-session.md deleted file mode 100644 index 85f7d27622..0000000000 --- a/app/sdks/php/docs/examples/account/delete-account-current-session.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->deleteAccountCurrentSession(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/delete-account-session.md b/app/sdks/php/docs/examples/account/delete-account-session.md deleted file mode 100644 index b7581763c9..0000000000 --- a/app/sdks/php/docs/examples/account/delete-account-session.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->deleteAccountSession('[ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/delete-account-sessions.md b/app/sdks/php/docs/examples/account/delete-account-sessions.md deleted file mode 100644 index 45799e649c..0000000000 --- a/app/sdks/php/docs/examples/account/delete-account-sessions.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->deleteAccountSessions(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/delete.md b/app/sdks/php/docs/examples/account/delete.md deleted file mode 100644 index 2e3b5553a5..0000000000 --- a/app/sdks/php/docs/examples/account/delete.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->delete(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-account-logs.md b/app/sdks/php/docs/examples/account/get-account-logs.md deleted file mode 100644 index 48809b17cb..0000000000 --- a/app/sdks/php/docs/examples/account/get-account-logs.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->getAccountLogs(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-account-prefs.md b/app/sdks/php/docs/examples/account/get-account-prefs.md deleted file mode 100644 index f480df1927..0000000000 --- a/app/sdks/php/docs/examples/account/get-account-prefs.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->getAccountPrefs(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-account-sessions.md b/app/sdks/php/docs/examples/account/get-account-sessions.md deleted file mode 100644 index 60b8cdc97c..0000000000 --- a/app/sdks/php/docs/examples/account/get-account-sessions.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->getAccountSessions(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-account.md b/app/sdks/php/docs/examples/account/get-account.md deleted file mode 100644 index 14226f7014..0000000000 --- a/app/sdks/php/docs/examples/account/get-account.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->getAccount(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-prefs.md b/app/sdks/php/docs/examples/account/get-prefs.md deleted file mode 100644 index f3f6d72519..0000000000 --- a/app/sdks/php/docs/examples/account/get-prefs.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$account = new Account($client); - -$result = $account->getPrefs(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-security.md b/app/sdks/php/docs/examples/account/get-security.md deleted file mode 100644 index 381d0bd755..0000000000 --- a/app/sdks/php/docs/examples/account/get-security.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$account = new Account($client); - -$result = $account->getSecurity(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get-sessions.md b/app/sdks/php/docs/examples/account/get-sessions.md deleted file mode 100644 index 8af7a7cd82..0000000000 --- a/app/sdks/php/docs/examples/account/get-sessions.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$account = new Account($client); - -$result = $account->getSessions(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/get.md b/app/sdks/php/docs/examples/account/get.md deleted file mode 100644 index c7241e576f..0000000000 --- a/app/sdks/php/docs/examples/account/get.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$account = new Account($client); - -$result = $account->get(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-account-name.md b/app/sdks/php/docs/examples/account/update-account-name.md deleted file mode 100644 index a8701822ce..0000000000 --- a/app/sdks/php/docs/examples/account/update-account-name.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->updateAccountName('[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-account-password.md b/app/sdks/php/docs/examples/account/update-account-password.md deleted file mode 100644 index 5a6135fea2..0000000000 --- a/app/sdks/php/docs/examples/account/update-account-password.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->updateAccountPassword('password', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-account-recovery.md b/app/sdks/php/docs/examples/account/update-account-recovery.md deleted file mode 100644 index dcd8dda921..0000000000 --- a/app/sdks/php/docs/examples/account/update-account-recovery.md +++ /dev/null @@ -1,13 +0,0 @@ -updateAccountRecovery('[USER_ID]', '[SECRET]', 'password', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-account-verification.md b/app/sdks/php/docs/examples/account/update-account-verification.md deleted file mode 100644 index 1a2a788984..0000000000 --- a/app/sdks/php/docs/examples/account/update-account-verification.md +++ /dev/null @@ -1,13 +0,0 @@ -updateAccountVerification('[USER_ID]', '[SECRET]', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-email.md b/app/sdks/php/docs/examples/account/update-email.md deleted file mode 100644 index 3e2ed0f62b..0000000000 --- a/app/sdks/php/docs/examples/account/update-email.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->updateEmail('email@example.com', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-name.md b/app/sdks/php/docs/examples/account/update-name.md deleted file mode 100644 index 068f824863..0000000000 --- a/app/sdks/php/docs/examples/account/update-name.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$account = new Account($client); - -$result = $account->updateName('[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-password.md b/app/sdks/php/docs/examples/account/update-password.md deleted file mode 100644 index 124bc26dab..0000000000 --- a/app/sdks/php/docs/examples/account/update-password.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$account = new Account($client); - -$result = $account->updatePassword('password', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/account/update-prefs.md b/app/sdks/php/docs/examples/account/update-prefs.md deleted file mode 100644 index 66f70fa643..0000000000 --- a/app/sdks/php/docs/examples/account/update-prefs.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$account = new Account($client); - -$result = $account->updatePrefs(''); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/confirm-resend.md b/app/sdks/php/docs/examples/auth/confirm-resend.md deleted file mode 100644 index 643e600d2f..0000000000 --- a/app/sdks/php/docs/examples/auth/confirm-resend.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$auth = new Auth($client); - -$result = $auth->confirmResend('https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/confirm.md b/app/sdks/php/docs/examples/auth/confirm.md deleted file mode 100644 index c60b7fb01d..0000000000 --- a/app/sdks/php/docs/examples/auth/confirm.md +++ /dev/null @@ -1,13 +0,0 @@ -confirm('[USER_ID]', '[TOKEN]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/login.md b/app/sdks/php/docs/examples/auth/login.md deleted file mode 100644 index f282a88e64..0000000000 --- a/app/sdks/php/docs/examples/auth/login.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$auth = new Auth($client); - -$result = $auth->login('email@example.com', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/logout-by-session.md b/app/sdks/php/docs/examples/auth/logout-by-session.md deleted file mode 100644 index 90a1f23fd6..0000000000 --- a/app/sdks/php/docs/examples/auth/logout-by-session.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$auth = new Auth($client); - -$result = $auth->logoutBySession('[ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/logout.md b/app/sdks/php/docs/examples/auth/logout.md deleted file mode 100644 index 78bd0275cc..0000000000 --- a/app/sdks/php/docs/examples/auth/logout.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$auth = new Auth($client); - -$result = $auth->logout(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/oauth-callback.md b/app/sdks/php/docs/examples/auth/oauth-callback.md deleted file mode 100644 index 437a7c427f..0000000000 --- a/app/sdks/php/docs/examples/auth/oauth-callback.md +++ /dev/null @@ -1,15 +0,0 @@ -oauthCallback('[PROJECT_ID]', 'bitbucket', '[CODE]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/oauth.md b/app/sdks/php/docs/examples/auth/oauth.md deleted file mode 100644 index 25b8d17613..0000000000 --- a/app/sdks/php/docs/examples/auth/oauth.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$auth = new Auth($client); - -$result = $auth->oauth('bitbucket', 'https://example.com', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/recovery-reset.md b/app/sdks/php/docs/examples/auth/recovery-reset.md deleted file mode 100644 index 19a4d83cfc..0000000000 --- a/app/sdks/php/docs/examples/auth/recovery-reset.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$auth = new Auth($client); - -$result = $auth->recoveryReset('[USER_ID]', '[TOKEN]', 'password', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/recovery.md b/app/sdks/php/docs/examples/auth/recovery.md deleted file mode 100644 index b52ddcb6ed..0000000000 --- a/app/sdks/php/docs/examples/auth/recovery.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$auth = new Auth($client); - -$result = $auth->recovery('email@example.com', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/auth/register.md b/app/sdks/php/docs/examples/auth/register.md deleted file mode 100644 index c34b859808..0000000000 --- a/app/sdks/php/docs/examples/auth/register.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$auth = new Auth($client); - -$result = $auth->register('email@example.com', 'password', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/avatars/get-browser.md b/app/sdks/php/docs/examples/avatars/get-browser.md index 464ca10e9d..c9a6a6b6c0 100644 --- a/app/sdks/php/docs/examples/avatars/get-browser.md +++ b/app/sdks/php/docs/examples/avatars/get-browser.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-credit-card.md b/app/sdks/php/docs/examples/avatars/get-credit-card.md index 88fa1299b9..206b0cc8c8 100644 --- a/app/sdks/php/docs/examples/avatars/get-credit-card.md +++ b/app/sdks/php/docs/examples/avatars/get-credit-card.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-favicon.md b/app/sdks/php/docs/examples/avatars/get-favicon.md index 982408e5e2..01f28add89 100644 --- a/app/sdks/php/docs/examples/avatars/get-favicon.md +++ b/app/sdks/php/docs/examples/avatars/get-favicon.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-flag.md b/app/sdks/php/docs/examples/avatars/get-flag.md index 9a254b5907..26740446cd 100644 --- a/app/sdks/php/docs/examples/avatars/get-flag.md +++ b/app/sdks/php/docs/examples/avatars/get-flag.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-image.md b/app/sdks/php/docs/examples/avatars/get-image.md index a3810f2dde..bbbe68d2d0 100644 --- a/app/sdks/php/docs/examples/avatars/get-image.md +++ b/app/sdks/php/docs/examples/avatars/get-image.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/avatars/get-q-r.md b/app/sdks/php/docs/examples/avatars/get-q-r.md index ebb4a9dc15..e10ec33d59 100644 --- a/app/sdks/php/docs/examples/avatars/get-q-r.md +++ b/app/sdks/php/docs/examples/avatars/get-q-r.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $avatars = new Avatars($client); diff --git a/app/sdks/php/docs/examples/database/create-collection.md b/app/sdks/php/docs/examples/database/create-collection.md index 8be0238d10..183d906905 100644 --- a/app/sdks/php/docs/examples/database/create-collection.md +++ b/app/sdks/php/docs/examples/database/create-collection.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/create-document.md b/app/sdks/php/docs/examples/database/create-document.md index aff513cf42..84c4d7fd06 100644 --- a/app/sdks/php/docs/examples/database/create-document.md +++ b/app/sdks/php/docs/examples/database/create-document.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/delete-collection.md b/app/sdks/php/docs/examples/database/delete-collection.md index 35594a5d95..2319d52c57 100644 --- a/app/sdks/php/docs/examples/database/delete-collection.md +++ b/app/sdks/php/docs/examples/database/delete-collection.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/delete-document.md b/app/sdks/php/docs/examples/database/delete-document.md index 4193c27d3f..b364e0bcd5 100644 --- a/app/sdks/php/docs/examples/database/delete-document.md +++ b/app/sdks/php/docs/examples/database/delete-document.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/get-collection.md b/app/sdks/php/docs/examples/database/get-collection.md index 3e967c5829..9daa61ddfc 100644 --- a/app/sdks/php/docs/examples/database/get-collection.md +++ b/app/sdks/php/docs/examples/database/get-collection.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/get-document.md b/app/sdks/php/docs/examples/database/get-document.md index 9644378337..da72bd8f1b 100644 --- a/app/sdks/php/docs/examples/database/get-document.md +++ b/app/sdks/php/docs/examples/database/get-document.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/list-collections.md b/app/sdks/php/docs/examples/database/list-collections.md index b522cfc989..c46daa2cda 100644 --- a/app/sdks/php/docs/examples/database/list-collections.md +++ b/app/sdks/php/docs/examples/database/list-collections.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/list-documents.md b/app/sdks/php/docs/examples/database/list-documents.md index 21ea55d9da..973f9c477e 100644 --- a/app/sdks/php/docs/examples/database/list-documents.md +++ b/app/sdks/php/docs/examples/database/list-documents.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/update-collection.md b/app/sdks/php/docs/examples/database/update-collection.md index f6ea3a8593..2576449e5c 100644 --- a/app/sdks/php/docs/examples/database/update-collection.md +++ b/app/sdks/php/docs/examples/database/update-collection.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/database/update-document.md b/app/sdks/php/docs/examples/database/update-document.md index eff2b554e6..2051d09772 100644 --- a/app/sdks/php/docs/examples/database/update-document.md +++ b/app/sdks/php/docs/examples/database/update-document.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $database = new Database($client); diff --git a/app/sdks/php/docs/examples/locale/get-continents.md b/app/sdks/php/docs/examples/locale/get-continents.md index 96c8b219cd..22b1528c0a 100644 --- a/app/sdks/php/docs/examples/locale/get-continents.md +++ b/app/sdks/php/docs/examples/locale/get-continents.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-countries-e-u.md b/app/sdks/php/docs/examples/locale/get-countries-e-u.md index 7c3fd4d285..9f0f1973cc 100644 --- a/app/sdks/php/docs/examples/locale/get-countries-e-u.md +++ b/app/sdks/php/docs/examples/locale/get-countries-e-u.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-countries-phones.md b/app/sdks/php/docs/examples/locale/get-countries-phones.md index 73726aab03..2478c7c730 100644 --- a/app/sdks/php/docs/examples/locale/get-countries-phones.md +++ b/app/sdks/php/docs/examples/locale/get-countries-phones.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-countries.md b/app/sdks/php/docs/examples/locale/get-countries.md index 0433724631..111dc52777 100644 --- a/app/sdks/php/docs/examples/locale/get-countries.md +++ b/app/sdks/php/docs/examples/locale/get-countries.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-currencies.md b/app/sdks/php/docs/examples/locale/get-currencies.md index f8f3c77d3a..e01d5fd623 100644 --- a/app/sdks/php/docs/examples/locale/get-currencies.md +++ b/app/sdks/php/docs/examples/locale/get-currencies.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/locale/get-locale.md b/app/sdks/php/docs/examples/locale/get-locale.md index edec17a38f..ac56f068de 100644 --- a/app/sdks/php/docs/examples/locale/get-locale.md +++ b/app/sdks/php/docs/examples/locale/get-locale.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $locale = new Locale($client); diff --git a/app/sdks/php/docs/examples/projects/create-key.md b/app/sdks/php/docs/examples/projects/create-key.md deleted file mode 100644 index 5eb7f27687..0000000000 --- a/app/sdks/php/docs/examples/projects/create-key.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->createKey('[PROJECT_ID]', '[NAME]', []); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/create-platform.md b/app/sdks/php/docs/examples/projects/create-platform.md deleted file mode 100644 index cde5eddad8..0000000000 --- a/app/sdks/php/docs/examples/projects/create-platform.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->createPlatform('[PROJECT_ID]', 'web', '[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/create-project.md b/app/sdks/php/docs/examples/projects/create-project.md deleted file mode 100644 index edb6bb6ab0..0000000000 --- a/app/sdks/php/docs/examples/projects/create-project.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->createProject('[NAME]', '[TEAM_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/create-task.md b/app/sdks/php/docs/examples/projects/create-task.md deleted file mode 100644 index aaa12d98cc..0000000000 --- a/app/sdks/php/docs/examples/projects/create-task.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->createTask('[PROJECT_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/create-webhook.md b/app/sdks/php/docs/examples/projects/create-webhook.md deleted file mode 100644 index 5721c423a2..0000000000 --- a/app/sdks/php/docs/examples/projects/create-webhook.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->createWebhook('[PROJECT_ID]', '[NAME]', [], '[URL]', 0); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/delete-key.md b/app/sdks/php/docs/examples/projects/delete-key.md deleted file mode 100644 index da74fa05c8..0000000000 --- a/app/sdks/php/docs/examples/projects/delete-key.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->deleteKey('[PROJECT_ID]', '[KEY_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/delete-platform.md b/app/sdks/php/docs/examples/projects/delete-platform.md deleted file mode 100644 index c21a7bb93c..0000000000 --- a/app/sdks/php/docs/examples/projects/delete-platform.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->deletePlatform('[PROJECT_ID]', '[PLATFORM_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/delete-project.md b/app/sdks/php/docs/examples/projects/delete-project.md deleted file mode 100644 index 10158026d8..0000000000 --- a/app/sdks/php/docs/examples/projects/delete-project.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->deleteProject('[PROJECT_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/delete-task.md b/app/sdks/php/docs/examples/projects/delete-task.md deleted file mode 100644 index 1e62f3401a..0000000000 --- a/app/sdks/php/docs/examples/projects/delete-task.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->deleteTask('[PROJECT_ID]', '[TASK_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/delete-webhook.md b/app/sdks/php/docs/examples/projects/delete-webhook.md deleted file mode 100644 index 7ec160d048..0000000000 --- a/app/sdks/php/docs/examples/projects/delete-webhook.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->deleteWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/get-key.md b/app/sdks/php/docs/examples/projects/get-key.md deleted file mode 100644 index d5b5ed742f..0000000000 --- a/app/sdks/php/docs/examples/projects/get-key.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->getKey('[PROJECT_ID]', '[KEY_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/get-platform.md b/app/sdks/php/docs/examples/projects/get-platform.md deleted file mode 100644 index 13777df0f4..0000000000 --- a/app/sdks/php/docs/examples/projects/get-platform.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->getPlatform('[PROJECT_ID]', '[PLATFORM_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/get-project-usage.md b/app/sdks/php/docs/examples/projects/get-project-usage.md deleted file mode 100644 index f4ebfa5d2e..0000000000 --- a/app/sdks/php/docs/examples/projects/get-project-usage.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->getProjectUsage('[PROJECT_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/get-project.md b/app/sdks/php/docs/examples/projects/get-project.md deleted file mode 100644 index f3bbd65043..0000000000 --- a/app/sdks/php/docs/examples/projects/get-project.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->getProject('[PROJECT_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/get-task.md b/app/sdks/php/docs/examples/projects/get-task.md deleted file mode 100644 index 3ca455c2bc..0000000000 --- a/app/sdks/php/docs/examples/projects/get-task.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->getTask('[PROJECT_ID]', '[TASK_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/get-webhook.md b/app/sdks/php/docs/examples/projects/get-webhook.md deleted file mode 100644 index bfde5a94e3..0000000000 --- a/app/sdks/php/docs/examples/projects/get-webhook.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->getWebhook('[PROJECT_ID]', '[WEBHOOK_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/list-keys.md b/app/sdks/php/docs/examples/projects/list-keys.md deleted file mode 100644 index ec00ca41ad..0000000000 --- a/app/sdks/php/docs/examples/projects/list-keys.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->listKeys('[PROJECT_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/list-platforms.md b/app/sdks/php/docs/examples/projects/list-platforms.md deleted file mode 100644 index c9272711e7..0000000000 --- a/app/sdks/php/docs/examples/projects/list-platforms.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->listPlatforms('[PROJECT_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/list-projects.md b/app/sdks/php/docs/examples/projects/list-projects.md deleted file mode 100644 index 53b7047e57..0000000000 --- a/app/sdks/php/docs/examples/projects/list-projects.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->listProjects(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/list-tasks.md b/app/sdks/php/docs/examples/projects/list-tasks.md deleted file mode 100644 index 175b580420..0000000000 --- a/app/sdks/php/docs/examples/projects/list-tasks.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->listTasks('[PROJECT_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/list-webhooks.md b/app/sdks/php/docs/examples/projects/list-webhooks.md deleted file mode 100644 index 299b9e3ecc..0000000000 --- a/app/sdks/php/docs/examples/projects/list-webhooks.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->listWebhooks('[PROJECT_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-key.md b/app/sdks/php/docs/examples/projects/update-key.md deleted file mode 100644 index 960761c01c..0000000000 --- a/app/sdks/php/docs/examples/projects/update-key.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->updateKey('[PROJECT_ID]', '[KEY_ID]', '[NAME]', []); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-platform.md b/app/sdks/php/docs/examples/projects/update-platform.md deleted file mode 100644 index 0537dec85a..0000000000 --- a/app/sdks/php/docs/examples/projects/update-platform.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->updatePlatform('[PROJECT_ID]', '[PLATFORM_ID]', '[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-project-o-auth.md b/app/sdks/php/docs/examples/projects/update-project-o-auth.md deleted file mode 100644 index 283ecbddff..0000000000 --- a/app/sdks/php/docs/examples/projects/update-project-o-auth.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->updateProjectOAuth('[PROJECT_ID]', 'bitbucket'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-project.md b/app/sdks/php/docs/examples/projects/update-project.md deleted file mode 100644 index f878bc9119..0000000000 --- a/app/sdks/php/docs/examples/projects/update-project.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->updateProject('[PROJECT_ID]', '[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-task.md b/app/sdks/php/docs/examples/projects/update-task.md deleted file mode 100644 index 95f64e6188..0000000000 --- a/app/sdks/php/docs/examples/projects/update-task.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->updateTask('[PROJECT_ID]', '[TASK_ID]', '[NAME]', 'play', '', 0, 'GET', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/projects/update-webhook.md b/app/sdks/php/docs/examples/projects/update-webhook.md deleted file mode 100644 index d550c0c178..0000000000 --- a/app/sdks/php/docs/examples/projects/update-webhook.md +++ /dev/null @@ -1,14 +0,0 @@ -setProject('') -; - -$projects = new Projects($client); - -$result = $projects->updateWebhook('[PROJECT_ID]', '[WEBHOOK_ID]', '[NAME]', [], '[URL]', 0); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/create-file.md b/app/sdks/php/docs/examples/storage/create-file.md index 1e8df67482..225b9e2bec 100644 --- a/app/sdks/php/docs/examples/storage/create-file.md +++ b/app/sdks/php/docs/examples/storage/create-file.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/delete-file.md b/app/sdks/php/docs/examples/storage/delete-file.md index 21755b6cfb..74448e5a7c 100644 --- a/app/sdks/php/docs/examples/storage/delete-file.md +++ b/app/sdks/php/docs/examples/storage/delete-file.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/get-file-download.md b/app/sdks/php/docs/examples/storage/get-file-download.md index 545cf88bbf..3a6db00081 100644 --- a/app/sdks/php/docs/examples/storage/get-file-download.md +++ b/app/sdks/php/docs/examples/storage/get-file-download.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/get-file-preview.md b/app/sdks/php/docs/examples/storage/get-file-preview.md index 6cfc61ffb0..8b02bdd2a9 100644 --- a/app/sdks/php/docs/examples/storage/get-file-preview.md +++ b/app/sdks/php/docs/examples/storage/get-file-preview.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/get-file-view.md b/app/sdks/php/docs/examples/storage/get-file-view.md index 438e18479c..59cc25bc74 100644 --- a/app/sdks/php/docs/examples/storage/get-file-view.md +++ b/app/sdks/php/docs/examples/storage/get-file-view.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/get-file.md b/app/sdks/php/docs/examples/storage/get-file.md index ae442c8924..63fa59b40a 100644 --- a/app/sdks/php/docs/examples/storage/get-file.md +++ b/app/sdks/php/docs/examples/storage/get-file.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/list-files.md b/app/sdks/php/docs/examples/storage/list-files.md index 3384a3f6fd..434e1fe70d 100644 --- a/app/sdks/php/docs/examples/storage/list-files.md +++ b/app/sdks/php/docs/examples/storage/list-files.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/storage/update-file.md b/app/sdks/php/docs/examples/storage/update-file.md index 0a9a17f9eb..637870a7a6 100644 --- a/app/sdks/php/docs/examples/storage/update-file.md +++ b/app/sdks/php/docs/examples/storage/update-file.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $storage = new Storage($client); diff --git a/app/sdks/php/docs/examples/teams/create-team-membership-resend.md b/app/sdks/php/docs/examples/teams/create-team-membership-resend.md deleted file mode 100644 index 0789412121..0000000000 --- a/app/sdks/php/docs/examples/teams/create-team-membership-resend.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$teams = new Teams($client); - -$result = $teams->createTeamMembershipResend('[TEAM_ID]', '[INVITE_ID]', 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/create-team-membership.md b/app/sdks/php/docs/examples/teams/create-team-membership.md index f43d527a8c..12a47b6f15 100644 --- a/app/sdks/php/docs/examples/teams/create-team-membership.md +++ b/app/sdks/php/docs/examples/teams/create-team-membership.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/create-team.md b/app/sdks/php/docs/examples/teams/create-team.md index 7f51f15152..11928b37cc 100644 --- a/app/sdks/php/docs/examples/teams/create-team.md +++ b/app/sdks/php/docs/examples/teams/create-team.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/delete-team-membership.md b/app/sdks/php/docs/examples/teams/delete-team-membership.md index 80e324d83b..d53e1ed7ce 100644 --- a/app/sdks/php/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/php/docs/examples/teams/delete-team-membership.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/delete-team.md b/app/sdks/php/docs/examples/teams/delete-team.md index 4647a11e75..7fb04015be 100644 --- a/app/sdks/php/docs/examples/teams/delete-team.md +++ b/app/sdks/php/docs/examples/teams/delete-team.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/get-team-members.md b/app/sdks/php/docs/examples/teams/get-team-members.md deleted file mode 100644 index 7f7b4c88bf..0000000000 --- a/app/sdks/php/docs/examples/teams/get-team-members.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$teams = new Teams($client); - -$result = $teams->getTeamMembers('[TEAM_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/get-team-memberships.md b/app/sdks/php/docs/examples/teams/get-team-memberships.md index 10c19ab59c..e7868f6a8c 100644 --- a/app/sdks/php/docs/examples/teams/get-team-memberships.md +++ b/app/sdks/php/docs/examples/teams/get-team-memberships.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/get-team.md b/app/sdks/php/docs/examples/teams/get-team.md index e9307dc934..e58a9d0dc2 100644 --- a/app/sdks/php/docs/examples/teams/get-team.md +++ b/app/sdks/php/docs/examples/teams/get-team.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/list-teams.md b/app/sdks/php/docs/examples/teams/list-teams.md index 2b8d208c7e..9b753c6d16 100644 --- a/app/sdks/php/docs/examples/teams/list-teams.md +++ b/app/sdks/php/docs/examples/teams/list-teams.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/teams/update-team-membership-status.md b/app/sdks/php/docs/examples/teams/update-team-membership-status.md deleted file mode 100644 index cd387f598e..0000000000 --- a/app/sdks/php/docs/examples/teams/update-team-membership-status.md +++ /dev/null @@ -1,13 +0,0 @@ -updateTeamMembershipStatus('[TEAM_ID]', '[INVITE_ID]', '[USER_ID]', '[SECRET]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/update-team.md b/app/sdks/php/docs/examples/teams/update-team.md index 1047fd8ce3..a76fce3a83 100644 --- a/app/sdks/php/docs/examples/teams/update-team.md +++ b/app/sdks/php/docs/examples/teams/update-team.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $teams = new Teams($client); diff --git a/app/sdks/php/docs/examples/users/create-user.md b/app/sdks/php/docs/examples/users/create-user.md index e0db30a5f2..b25a479c89 100644 --- a/app/sdks/php/docs/examples/users/create-user.md +++ b/app/sdks/php/docs/examples/users/create-user.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/delete-user-session.md b/app/sdks/php/docs/examples/users/delete-user-session.md index 40db227ec1..28ad6dd165 100644 --- a/app/sdks/php/docs/examples/users/delete-user-session.md +++ b/app/sdks/php/docs/examples/users/delete-user-session.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/delete-user-sessions.md b/app/sdks/php/docs/examples/users/delete-user-sessions.md index 346eff92b0..a83c648f69 100644 --- a/app/sdks/php/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/php/docs/examples/users/delete-user-sessions.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/delete-users-session.md b/app/sdks/php/docs/examples/users/delete-users-session.md deleted file mode 100644 index f5a9c6fa1b..0000000000 --- a/app/sdks/php/docs/examples/users/delete-users-session.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$users = new Users($client); - -$result = $users->deleteUsersSession('[USER_ID]', '[SESSION_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/get-user-logs.md b/app/sdks/php/docs/examples/users/get-user-logs.md index 926d83ac78..bb9a70e975 100644 --- a/app/sdks/php/docs/examples/users/get-user-logs.md +++ b/app/sdks/php/docs/examples/users/get-user-logs.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/get-user-prefs.md b/app/sdks/php/docs/examples/users/get-user-prefs.md index 68b6c7c894..949d206065 100644 --- a/app/sdks/php/docs/examples/users/get-user-prefs.md +++ b/app/sdks/php/docs/examples/users/get-user-prefs.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/get-user-sessions.md b/app/sdks/php/docs/examples/users/get-user-sessions.md index 2b7eb49666..9f29697960 100644 --- a/app/sdks/php/docs/examples/users/get-user-sessions.md +++ b/app/sdks/php/docs/examples/users/get-user-sessions.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/get-user.md b/app/sdks/php/docs/examples/users/get-user.md index abf6c1f32c..bc776d4313 100644 --- a/app/sdks/php/docs/examples/users/get-user.md +++ b/app/sdks/php/docs/examples/users/get-user.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/list-users.md b/app/sdks/php/docs/examples/users/list-users.md index c5f8d92b35..d3824540fc 100644 --- a/app/sdks/php/docs/examples/users/list-users.md +++ b/app/sdks/php/docs/examples/users/list-users.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/update-user-prefs.md b/app/sdks/php/docs/examples/users/update-user-prefs.md index a42aedb9fa..873bbc2912 100644 --- a/app/sdks/php/docs/examples/users/update-user-prefs.md +++ b/app/sdks/php/docs/examples/users/update-user-prefs.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/examples/users/update-user-status.md b/app/sdks/php/docs/examples/users/update-user-status.md index 7cc61dd05b..918d827962 100644 --- a/app/sdks/php/docs/examples/users/update-user-status.md +++ b/app/sdks/php/docs/examples/users/update-user-status.md @@ -7,6 +7,7 @@ $client = new Client(); $client ->setProject('') + ->setKey('') ; $users = new Users($client); diff --git a/app/sdks/php/docs/projects.md b/app/sdks/php/docs/projects.md deleted file mode 100644 index bc4026970d..0000000000 --- a/app/sdks/php/docs/projects.md +++ /dev/null @@ -1,398 +0,0 @@ -# Projects Service - -## List Projects - -```http request -GET https://appwrite.io/v1/projects -``` - -## Create Project - -```http request -POST https://appwrite.io/v1/projects -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| name | string | Project name | | -| teamId | string | Team unique ID. | | -| description | string | Project description | | -| logo | string | Project logo | | -| url | string | Project URL | | -| legalName | string | Project Legal Name | | -| legalCountry | string | Project Legal Country | | -| legalState | string | Project Legal State | | -| legalCity | string | Project Legal City | | -| legalAddress | string | Project Legal Address | | -| legalTaxId | string | Project Legal Tax ID | | - -## Get Project - -```http request -GET https://appwrite.io/v1/projects/{projectId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | - -## Update Project - -```http request -PATCH https://appwrite.io/v1/projects/{projectId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| name | string | Project name | | -| description | string | Project description | | -| logo | string | Project logo | | -| url | string | Project URL | | -| legalName | string | Project Legal Name | | -| legalCountry | string | Project Legal Country | | -| legalState | string | Project Legal State | | -| legalCity | string | Project Legal City | | -| legalAddress | string | Project Legal Address | | -| legalTaxId | string | Project Legal Tax ID | | - -## Delete Project - -```http request -DELETE https://appwrite.io/v1/projects/{projectId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | - -## List Keys - -```http request -GET https://appwrite.io/v1/projects/{projectId}/keys -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | - -## Create Key - -```http request -POST https://appwrite.io/v1/projects/{projectId}/keys -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| name | string | Key name | | -| scopes | array | Key scopes list | | - -## Get Key - -```http request -GET https://appwrite.io/v1/projects/{projectId}/keys/{keyId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| keyId | string | **Required** Key unique ID. | | - -## Update Key - -```http request -PUT https://appwrite.io/v1/projects/{projectId}/keys/{keyId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| keyId | string | **Required** Key unique ID. | | -| name | string | Key name | | -| scopes | array | Key scopes list | | - -## Delete Key - -```http request -DELETE https://appwrite.io/v1/projects/{projectId}/keys/{keyId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| keyId | string | **Required** Key unique ID. | | - -## Update Project OAuth - -```http request -PATCH https://appwrite.io/v1/projects/{projectId}/oauth -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| provider | string | Provider Name | | -| appId | string | Provider App ID | | -| secret | string | Provider Secret Key | | - -## List Platforms - -```http request -GET https://appwrite.io/v1/projects/{projectId}/platforms -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | - -## Create Platform - -```http request -POST https://appwrite.io/v1/projects/{projectId}/platforms -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| type | string | Platform name | | -| name | string | Platform name | | -| key | string | Package name for android or bundle ID for iOS | | -| store | string | App store or Google Play store ID | | -| url | string | Platform client URL | | - -## Get Platform - -```http request -GET https://appwrite.io/v1/projects/{projectId}/platforms/{platformId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| platformId | string | **Required** Platform unique ID. | | - -## Update Platform - -```http request -PUT https://appwrite.io/v1/projects/{projectId}/platforms/{platformId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| platformId | string | **Required** Platform unique ID. | | -| name | string | Platform name | | -| key | string | Package name for android or bundle ID for iOS | | -| store | string | App store or Google Play store ID | | -| url | string | Platform client URL | | - -## Delete Platform - -```http request -DELETE https://appwrite.io/v1/projects/{projectId}/platforms/{platformId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| platformId | string | **Required** Platform unique ID. | | - -## List Tasks - -```http request -GET https://appwrite.io/v1/projects/{projectId}/tasks -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | - -## Create Task - -```http request -POST https://appwrite.io/v1/projects/{projectId}/tasks -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| name | string | Task name | | -| status | string | Task status | | -| schedule | string | Task schedule syntax | | -| security | integer | Certificate verification, 0 for disabled or 1 for enabled | | -| httpMethod | string | Task HTTP method | | -| httpUrl | string | Task HTTP URL | | -| httpHeaders | array | Task HTTP headers list | | -| httpUser | string | Task HTTP user | | -| httpPass | string | Task HTTP password | | - -## Get Task - -```http request -GET https://appwrite.io/v1/projects/{projectId}/tasks/{taskId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| taskId | string | **Required** Task unique ID. | | - -## Update Task - -```http request -PUT https://appwrite.io/v1/projects/{projectId}/tasks/{taskId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| taskId | string | **Required** Task unique ID. | | -| name | string | Task name | | -| status | string | Task status | | -| schedule | string | Task schedule syntax | | -| security | integer | Certificate verification, 0 for disabled or 1 for enabled | | -| httpMethod | string | Task HTTP method | | -| httpUrl | string | Task HTTP URL | | -| httpHeaders | array | Task HTTP headers list | | -| httpUser | string | Task HTTP user | | -| httpPass | string | Task HTTP password | | - -## Delete Task - -```http request -DELETE https://appwrite.io/v1/projects/{projectId}/tasks/{taskId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| taskId | string | **Required** Task unique ID. | | - -## Get Project - -```http request -GET https://appwrite.io/v1/projects/{projectId}/usage -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | - -## List Webhooks - -```http request -GET https://appwrite.io/v1/projects/{projectId}/webhooks -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | - -## Create Webhook - -```http request -POST https://appwrite.io/v1/projects/{projectId}/webhooks -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| name | string | Webhook name | | -| events | array | Webhook events list | | -| url | string | Webhook URL | | -| security | integer | Certificate verification, 0 for disabled or 1 for enabled | | -| httpUser | string | Webhook HTTP user | | -| httpPass | string | Webhook HTTP password | | - -## Get Webhook - -```http request -GET https://appwrite.io/v1/projects/{projectId}/webhooks/{webhookId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| webhookId | string | **Required** Webhook unique ID. | | - -## Update Webhook - -```http request -PUT https://appwrite.io/v1/projects/{projectId}/webhooks/{webhookId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| webhookId | string | **Required** Webhook unique ID. | | -| name | string | Webhook name | | -| events | array | Webhook events list | | -| url | string | Webhook URL | | -| security | integer | Certificate verification, 0 for disabled or 1 for enabled | | -| httpUser | string | Webhook HTTP user | | -| httpPass | string | Webhook HTTP password | | - -## Delete Webhook - -```http request -DELETE https://appwrite.io/v1/projects/{projectId}/webhooks/{webhookId} -``` - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| projectId | string | **Required** Project unique ID. | | -| webhookId | string | **Required** Webhook unique ID. | | - diff --git a/app/sdks/php/docs/teams.md b/app/sdks/php/docs/teams.md index 499a52ee49..5f181ad21e 100644 --- a/app/sdks/php/docs/teams.md +++ b/app/sdks/php/docs/teams.md @@ -126,24 +126,3 @@ DELETE https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId} | teamId | string | **Required** Team unique ID. | | | inviteId | string | **Required** Invite unique ID | | -## Update Team Membership Status - -```http request -PATCH https://appwrite.io/v1/teams/{teamId}/memberships/{inviteId}/status -``` - -** Use this endpoint to let user accept an invitation to join a team after he is being redirect back to your app from the invitation email. Use the success and failure URL's to redirect users back to your application after the request completes. - -Please note that in order to avoid a [Redirect Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URL's are the once from domains you have set when added your platforms in the console interface. - -When not using the success or failure redirect arguments this endpoint will result with a 200 status code on success and with 401 status error on failure. This behavior was applied to help the web clients deal with browsers who don't allow to set 3rd party HTTP cookies needed for saving the account session key. ** - -### Parameters - -| Field Name | Type | Description | Default | -| --- | --- | --- | --- | -| teamId | string | **Required** Team unique ID. | | -| inviteId | string | **Required** Invite unique ID | | -| userId | string | User unique ID | | -| secret | string | Secret Key | | - diff --git a/app/sdks/php/src/Appwrite/Services/Account.php b/app/sdks/php/src/Appwrite/Services/Account.php deleted file mode 100644 index b1aa6a1ad3..0000000000 --- a/app/sdks/php/src/Appwrite/Services/Account.php +++ /dev/null @@ -1,498 +0,0 @@ -client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Account - * - * Use this endpoint to allow a new user to register an account in your - * project. Use the success and failure URLs to redirect users back to your - * application after signup completes. - * - * If registration completes successfully user will be sent with a - * confirmation email in order to confirm he is the owner of the account email - * address. Use the confirmation parameter to redirect the user from the - * confirmation email back to your app. When the user is redirected, use the - * /auth/confirm endpoint to complete the account confirmation. - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param string $email - * @param string $password - * @param string $name - * @throws Exception - * @return array - */ - public function createAccount(string $email, string $password, string $name = ''):array - { - $path = str_replace([], [], '/account'); - $params = []; - - $params['email'] = $email; - $params['password'] = $password; - $params['name'] = $name; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete Account - * - * Delete a currently logged in user account. Behind the scene, the user - * record is not deleted but permanently blocked from any access. This is done - * to avoid deleted accounts being overtaken by new users with the same email - * address. Any user-related resources like documents or storage files should - * be deleted separately. - * - * @throws Exception - * @return array - */ - public function delete():array - { - $path = str_replace([], [], '/account'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Account Email - * - * Update currently logged in user account email address. After changing user - * address, user confirmation status is being reset and a new confirmation - * mail is sent. For security measures, user password is required to complete - * this request. - * - * @param string $email - * @param string $password - * @throws Exception - * @return array - */ - public function updateEmail(string $email, string $password):array - { - $path = str_replace([], [], '/account/email'); - $params = []; - - $params['email'] = $email; - $params['password'] = $password; - - return $this->client->call(Client::METHOD_PATCH, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Account Logs - * - * Get currently logged in user list of latest security activity logs. Each - * log returns user IP address, location and date and time of log. - * - * @throws Exception - * @return array - */ - public function getAccountLogs():array - { - $path = str_replace([], [], '/account/logs'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Account Name - * - * Update currently logged in user account name. - * - * @param string $name - * @throws Exception - * @return array - */ - public function updateAccountName(string $name):array - { - $path = str_replace([], [], '/account/name'); - $params = []; - - $params['name'] = $name; - - return $this->client->call(Client::METHOD_PATCH, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Account Password - * - * Update currently logged in user password. For validation, user is required - * to pass the password twice. - * - * @param string $password - * @param string $oldPassword - * @throws Exception - * @return array - */ - public function updateAccountPassword(string $password, string $oldPassword):array - { - $path = str_replace([], [], '/account/password'); - $params = []; - - $params['password'] = $password; - $params['old-password'] = $oldPassword; - - return $this->client->call(Client::METHOD_PATCH, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Account Preferences - * - * Get currently logged in user preferences key-value object. - * - * @throws Exception - * @return array - */ - public function getAccountPrefs():array - { - $path = str_replace([], [], '/account/prefs'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Account Preferences - * - * Update currently logged in user account preferences. You can pass only the - * specific settings you wish to update. - * - * @param string $prefs - * @throws Exception - * @return array - */ - public function updatePrefs(string $prefs):array - { - $path = str_replace([], [], '/account/prefs'); - $params = []; - - $params['prefs'] = $prefs; - - return $this->client->call(Client::METHOD_PATCH, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Password Recovery - * - * Sends the user an email with a temporary secret key for password reset. - * When the user clicks the confirmation link he is redirected back to your - * app password reset URL with the secret key and email address values - * attached to the URL query string. Use the query string params to submit a - * request to the /auth/password/reset endpoint to complete the process. - * - * @param string $email - * @param string $url - * @throws Exception - * @return array - */ - public function createAccountRecovery(string $email, string $url):array - { - $path = str_replace([], [], '/account/recovery'); - $params = []; - - $params['email'] = $email; - $params['url'] = $url; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Password Reset - * - * Use this endpoint to complete the user account password reset. Both the - * **userId** and **secret** arguments will be passed as query parameters to - * the redirect URL you have provided when sending your request to the - * /auth/recovery endpoint. - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param string $userId - * @param string $secret - * @param string $passwordA - * @param string $passwordB - * @throws Exception - * @return array - */ - public function updateAccountRecovery(string $userId, string $secret, string $passwordA, string $passwordB):array - { - $path = str_replace([], [], '/account/recovery'); - $params = []; - - $params['userId'] = $userId; - $params['secret'] = $secret; - $params['password-a'] = $passwordA; - $params['password-b'] = $passwordB; - - return $this->client->call(Client::METHOD_PUT, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Account Sessions - * - * Get currently logged in user list of active sessions across different - * devices. - * - * @throws Exception - * @return array - */ - public function getAccountSessions():array - { - $path = str_replace([], [], '/account/sessions'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Account Session - * - * Allow the user to login into his account by providing a valid email and - * password combination. Use the success and failure arguments to provide a - * redirect URL's back to your app when login is completed. - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param string $email - * @param string $password - * @throws Exception - * @return array - */ - public function createAccountSession(string $email, string $password):array - { - $path = str_replace([], [], '/account/sessions'); - $params = []; - - $params['email'] = $email; - $params['password'] = $password; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete All Account Sessions - * - * Delete all sessions from the user account and remove any sessions cookies - * from the end client. - * - * @throws Exception - * @return array - */ - public function deleteAccountSessions():array - { - $path = str_replace([], [], '/account/sessions'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete Current Account Session - * - * Use this endpoint to log out the currently logged in user from his account. - * When successful this endpoint will delete the user session and remove the - * session secret cookie from the user client. - * - * @throws Exception - * @return array - */ - public function deleteAccountCurrentSession():array - { - $path = str_replace([], [], '/account/sessions/current'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Account Session with OAuth - * - * Allow the user to login to his account using the OAuth provider of his - * choice. Each OAuth provider should be enabled from the Appwrite console - * first. Use the success and failure arguments to provide a redirect URL's - * back to your app when login is completed. - * - * @param string $provider - * @param string $success - * @param string $failure - * @throws Exception - * @return array - */ - public function createAccountSessionOAuth(string $provider, string $success, string $failure):array - { - $path = str_replace(['{provider}'], [$provider], '/account/sessions/oauth/{provider}'); - $params = []; - - $params['success'] = $success; - $params['failure'] = $failure; - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete Account Session - * - * Use this endpoint to log out the currently logged in user from all his - * account sessions across all his different devices. When using the option id - * argument, only the session unique ID provider will be deleted. - * - * @param string $id - * @throws Exception - * @return array - */ - public function deleteAccountSession(string $id):array - { - $path = str_replace(['{id}'], [$id], '/account/sessions/{id}'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Verification - * - * Use this endpoint to send a verification message to your user email address - * to confirm they are the valid owners of that address. Both the **userId** - * and **secret** arguments will be passed as query parameters to the URL you - * have provider to be attached to the verification email. The provided URL - * should redirect the user back for your app and allow you to complete the - * verification process by verifying both the **userId** and **secret** - * parameters. Learn more about how to [complete the verification - * process](/docs/account#updateAccountVerification). - * - * Please note that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param string $url - * @throws Exception - * @return array - */ - public function createAccountVerification(string $url):array - { - $path = str_replace([], [], '/account/verification'); - $params = []; - - $params['url'] = $url; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Updated Verification - * - * Use this endpoint to complete the user email verification process. Use both - * the **userId** and **secret** parameters that were attached to your app URL - * to verify the user email ownership. If confirmed this route will return a - * 200 status code. - * - * @param string $userId - * @param string $secret - * @param string $passwordB - * @throws Exception - * @return array - */ - public function updateAccountVerification(string $userId, string $secret, string $passwordB):array - { - $path = str_replace([], [], '/account/verification'); - $params = []; - - $params['userId'] = $userId; - $params['secret'] = $secret; - $params['password-b'] = $passwordB; - - return $this->client->call(Client::METHOD_PUT, $path, [ - 'content-type' => 'application/json', - ], $params); - } - -} \ No newline at end of file diff --git a/app/sdks/php/src/Appwrite/Services/Auth.php b/app/sdks/php/src/Appwrite/Services/Auth.php deleted file mode 100644 index 31a48ebebd..0000000000 --- a/app/sdks/php/src/Appwrite/Services/Auth.php +++ /dev/null @@ -1,288 +0,0 @@ -client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Login with OAuth - * - * Allow the user to login to his account using the OAuth provider of his - * choice. Each OAuth provider should be enabled from the Appwrite console - * first. Use the success and failure arguments to provide a redirect URL's - * back to your app when login is completed. - * - * @param string $provider - * @param string $success - * @param string $failure - * @throws Exception - * @return array - */ - public function oauth(string $provider, string $success, string $failure):array - { - $path = str_replace(['{provider}'], [$provider], '/auth/login/oauth/{provider}'); - $params = []; - - $params['success'] = $success; - $params['failure'] = $failure; - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Logout Current Session - * - * Use this endpoint to log out the currently logged in user from his account. - * When successful this endpoint will delete the user session and remove the - * session secret cookie from the user client. - * - * @throws Exception - * @return array - */ - public function logout():array - { - $path = str_replace([], [], '/auth/logout'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Logout Specific Session - * - * Use this endpoint to log out the currently logged in user from all his - * account sessions across all his different devices. When using the option id - * argument, only the session unique ID provider will be deleted. - * - * @param string $id - * @throws Exception - * @return array - */ - public function logoutBySession(string $id):array - { - $path = str_replace(['{id}'], [$id], '/auth/logout/{id}'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Password Recovery - * - * Sends the user an email with a temporary secret token for password reset. - * When the user clicks the confirmation link he is redirected back to your - * app password reset redirect URL with a secret token and email address - * values attached to the URL query string. Use the query string params to - * submit a request to the /auth/password/reset endpoint to complete the - * process. - * - * @param string $email - * @param string $reset - * @throws Exception - * @return array - */ - public function recovery(string $email, string $reset):array - { - $path = str_replace([], [], '/auth/recovery'); - $params = []; - - $params['email'] = $email; - $params['reset'] = $reset; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Password Reset - * - * Use this endpoint to complete the user account password reset. Both the - * **userId** and **token** arguments will be passed as query parameters to - * the redirect URL you have provided when sending your request to the - * /auth/recovery endpoint. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param string $userId - * @param string $token - * @param string $passwordA - * @param string $passwordB - * @throws Exception - * @return array - */ - public function recoveryReset(string $userId, string $token, string $passwordA, string $passwordB):array - { - $path = str_replace([], [], '/auth/recovery/reset'); - $params = []; - - $params['userId'] = $userId; - $params['token'] = $token; - $params['password-a'] = $passwordA; - $params['password-b'] = $passwordB; - - return $this->client->call(Client::METHOD_PUT, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Register - * - * Use this endpoint to allow a new user to register an account in your - * project. Use the success and failure URLs to redirect users back to your - * application after signup completes. - * - * If registration completes successfully user will be sent with a - * confirmation email in order to confirm he is the owner of the account email - * address. Use the confirmation parameter to redirect the user from the - * confirmation email back to your app. When the user is redirected, use the - * /auth/confirm endpoint to complete the account confirmation. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * When accessing this route using Javascript from the browser, success and - * failure parameter URLs are required. Appwrite server will respond with a - * 301 redirect status code and will set the user session cookie. This - * behavior is enforced because modern browsers are limiting 3rd party cookies - * in XHR of fetch requests to protect user privacy. - * - * @param string $email - * @param string $password - * @param string $confirm - * @param string $success - * @param string $failure - * @param string $name - * @throws Exception - * @return array - */ - public function register(string $email, string $password, string $confirm, string $success = '', string $failure = '', string $name = ''):array - { - $path = str_replace([], [], '/auth/register'); - $params = []; - - $params['email'] = $email; - $params['password'] = $password; - $params['confirm'] = $confirm; - $params['success'] = $success; - $params['failure'] = $failure; - $params['name'] = $name; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Confirmation - * - * Use this endpoint to complete the confirmation of the user account email - * address. Both the **userId** and **token** arguments will be passed as - * query parameters to the redirect URL you have provided when sending your - * request to the /auth/register endpoint. - * - * @param string $userId - * @param string $token - * @throws Exception - * @return array - */ - public function confirm(string $userId, string $token):array - { - $path = str_replace([], [], '/auth/register/confirm'); - $params = []; - - $params['userId'] = $userId; - $params['token'] = $token; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Resend Confirmation - * - * This endpoint allows the user to request your app to resend him his email - * confirmation message. The redirect arguments act the same way as in - * /auth/register endpoint. - * - * Please notice that in order to avoid a [Redirect - * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URLs are the ones from domains you have set when - * adding your platforms in the console interface. - * - * @param string $confirm - * @throws Exception - * @return array - */ - public function confirmResend(string $confirm):array - { - $path = str_replace([], [], '/auth/register/confirm/resend'); - $params = []; - - $params['confirm'] = $confirm; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - -} \ No newline at end of file diff --git a/app/sdks/php/src/Appwrite/Services/Projects.php b/app/sdks/php/src/Appwrite/Services/Projects.php deleted file mode 100644 index 701c3cc523..0000000000 --- a/app/sdks/php/src/Appwrite/Services/Projects.php +++ /dev/null @@ -1,641 +0,0 @@ -client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Project - * - * @param string $name - * @param string $teamId - * @param string $description - * @param string $logo - * @param string $url - * @param string $legalName - * @param string $legalCountry - * @param string $legalState - * @param string $legalCity - * @param string $legalAddress - * @param string $legalTaxId - * @throws Exception - * @return array - */ - public function createProject(string $name, string $teamId, string $description = '', string $logo = '', string $url = '', string $legalName = '', string $legalCountry = '', string $legalState = '', string $legalCity = '', string $legalAddress = '', string $legalTaxId = ''):array - { - $path = str_replace([], [], '/projects'); - $params = []; - - $params['name'] = $name; - $params['teamId'] = $teamId; - $params['description'] = $description; - $params['logo'] = $logo; - $params['url'] = $url; - $params['legalName'] = $legalName; - $params['legalCountry'] = $legalCountry; - $params['legalState'] = $legalState; - $params['legalCity'] = $legalCity; - $params['legalAddress'] = $legalAddress; - $params['legalTaxId'] = $legalTaxId; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Project - * - * @param string $projectId - * @throws Exception - * @return array - */ - public function getProject(string $projectId):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Project - * - * @param string $projectId - * @param string $name - * @param string $description - * @param string $logo - * @param string $url - * @param string $legalName - * @param string $legalCountry - * @param string $legalState - * @param string $legalCity - * @param string $legalAddress - * @param string $legalTaxId - * @throws Exception - * @return array - */ - public function updateProject(string $projectId, string $name, string $description = '', string $logo = '', string $url = '', string $legalName = '', string $legalCountry = '', string $legalState = '', string $legalCity = '', string $legalAddress = '', string $legalTaxId = ''):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}'); - $params = []; - - $params['name'] = $name; - $params['description'] = $description; - $params['logo'] = $logo; - $params['url'] = $url; - $params['legalName'] = $legalName; - $params['legalCountry'] = $legalCountry; - $params['legalState'] = $legalState; - $params['legalCity'] = $legalCity; - $params['legalAddress'] = $legalAddress; - $params['legalTaxId'] = $legalTaxId; - - return $this->client->call(Client::METHOD_PATCH, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete Project - * - * @param string $projectId - * @throws Exception - * @return array - */ - public function deleteProject(string $projectId):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * List Keys - * - * @param string $projectId - * @throws Exception - * @return array - */ - public function listKeys(string $projectId):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/keys'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Key - * - * @param string $projectId - * @param string $name - * @param array $scopes - * @throws Exception - * @return array - */ - public function createKey(string $projectId, string $name, array $scopes):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/keys'); - $params = []; - - $params['name'] = $name; - $params['scopes'] = $scopes; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Key - * - * @param string $projectId - * @param string $keyId - * @throws Exception - * @return array - */ - public function getKey(string $projectId, string $keyId):array - { - $path = str_replace(['{projectId}', '{keyId}'], [$projectId, $keyId], '/projects/{projectId}/keys/{keyId}'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Key - * - * @param string $projectId - * @param string $keyId - * @param string $name - * @param array $scopes - * @throws Exception - * @return array - */ - public function updateKey(string $projectId, string $keyId, string $name, array $scopes):array - { - $path = str_replace(['{projectId}', '{keyId}'], [$projectId, $keyId], '/projects/{projectId}/keys/{keyId}'); - $params = []; - - $params['name'] = $name; - $params['scopes'] = $scopes; - - return $this->client->call(Client::METHOD_PUT, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete Key - * - * @param string $projectId - * @param string $keyId - * @throws Exception - * @return array - */ - public function deleteKey(string $projectId, string $keyId):array - { - $path = str_replace(['{projectId}', '{keyId}'], [$projectId, $keyId], '/projects/{projectId}/keys/{keyId}'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Project OAuth - * - * @param string $projectId - * @param string $provider - * @param string $appId - * @param string $secret - * @throws Exception - * @return array - */ - public function updateProjectOAuth(string $projectId, string $provider, string $appId = '', string $secret = ''):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/oauth'); - $params = []; - - $params['provider'] = $provider; - $params['appId'] = $appId; - $params['secret'] = $secret; - - return $this->client->call(Client::METHOD_PATCH, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * List Platforms - * - * @param string $projectId - * @throws Exception - * @return array - */ - public function listPlatforms(string $projectId):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/platforms'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Platform - * - * @param string $projectId - * @param string $type - * @param string $name - * @param string $key - * @param string $store - * @param string $url - * @throws Exception - * @return array - */ - public function createPlatform(string $projectId, string $type, string $name, string $key = '', string $store = '', string $url = ''):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/platforms'); - $params = []; - - $params['type'] = $type; - $params['name'] = $name; - $params['key'] = $key; - $params['store'] = $store; - $params['url'] = $url; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Platform - * - * @param string $projectId - * @param string $platformId - * @throws Exception - * @return array - */ - public function getPlatform(string $projectId, string $platformId):array - { - $path = str_replace(['{projectId}', '{platformId}'], [$projectId, $platformId], '/projects/{projectId}/platforms/{platformId}'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Platform - * - * @param string $projectId - * @param string $platformId - * @param string $name - * @param string $key - * @param string $store - * @param string $url - * @throws Exception - * @return array - */ - public function updatePlatform(string $projectId, string $platformId, string $name, string $key = '', string $store = '', string $url = ''):array - { - $path = str_replace(['{projectId}', '{platformId}'], [$projectId, $platformId], '/projects/{projectId}/platforms/{platformId}'); - $params = []; - - $params['name'] = $name; - $params['key'] = $key; - $params['store'] = $store; - $params['url'] = $url; - - return $this->client->call(Client::METHOD_PUT, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete Platform - * - * @param string $projectId - * @param string $platformId - * @throws Exception - * @return array - */ - public function deletePlatform(string $projectId, string $platformId):array - { - $path = str_replace(['{projectId}', '{platformId}'], [$projectId, $platformId], '/projects/{projectId}/platforms/{platformId}'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * List Tasks - * - * @param string $projectId - * @throws Exception - * @return array - */ - public function listTasks(string $projectId):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/tasks'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Task - * - * @param string $projectId - * @param string $name - * @param string $status - * @param string $schedule - * @param int $security - * @param string $httpMethod - * @param string $httpUrl - * @param array $httpHeaders - * @param string $httpUser - * @param string $httpPass - * @throws Exception - * @return array - */ - public function createTask(string $projectId, string $name, string $status, string $schedule, int $security, string $httpMethod, string $httpUrl, array $httpHeaders = [], string $httpUser = '', string $httpPass = ''):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/tasks'); - $params = []; - - $params['name'] = $name; - $params['status'] = $status; - $params['schedule'] = $schedule; - $params['security'] = $security; - $params['httpMethod'] = $httpMethod; - $params['httpUrl'] = $httpUrl; - $params['httpHeaders'] = $httpHeaders; - $params['httpUser'] = $httpUser; - $params['httpPass'] = $httpPass; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Task - * - * @param string $projectId - * @param string $taskId - * @throws Exception - * @return array - */ - public function getTask(string $projectId, string $taskId):array - { - $path = str_replace(['{projectId}', '{taskId}'], [$projectId, $taskId], '/projects/{projectId}/tasks/{taskId}'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Task - * - * @param string $projectId - * @param string $taskId - * @param string $name - * @param string $status - * @param string $schedule - * @param int $security - * @param string $httpMethod - * @param string $httpUrl - * @param array $httpHeaders - * @param string $httpUser - * @param string $httpPass - * @throws Exception - * @return array - */ - public function updateTask(string $projectId, string $taskId, string $name, string $status, string $schedule, int $security, string $httpMethod, string $httpUrl, array $httpHeaders = [], string $httpUser = '', string $httpPass = ''):array - { - $path = str_replace(['{projectId}', '{taskId}'], [$projectId, $taskId], '/projects/{projectId}/tasks/{taskId}'); - $params = []; - - $params['name'] = $name; - $params['status'] = $status; - $params['schedule'] = $schedule; - $params['security'] = $security; - $params['httpMethod'] = $httpMethod; - $params['httpUrl'] = $httpUrl; - $params['httpHeaders'] = $httpHeaders; - $params['httpUser'] = $httpUser; - $params['httpPass'] = $httpPass; - - return $this->client->call(Client::METHOD_PUT, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete Task - * - * @param string $projectId - * @param string $taskId - * @throws Exception - * @return array - */ - public function deleteTask(string $projectId, string $taskId):array - { - $path = str_replace(['{projectId}', '{taskId}'], [$projectId, $taskId], '/projects/{projectId}/tasks/{taskId}'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Project - * - * @param string $projectId - * @throws Exception - * @return array - */ - public function getProjectUsage(string $projectId):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/usage'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * List Webhooks - * - * @param string $projectId - * @throws Exception - * @return array - */ - public function listWebhooks(string $projectId):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/webhooks'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Create Webhook - * - * @param string $projectId - * @param string $name - * @param array $events - * @param string $url - * @param int $security - * @param string $httpUser - * @param string $httpPass - * @throws Exception - * @return array - */ - public function createWebhook(string $projectId, string $name, array $events, string $url, int $security, string $httpUser = '', string $httpPass = ''):array - { - $path = str_replace(['{projectId}'], [$projectId], '/projects/{projectId}/webhooks'); - $params = []; - - $params['name'] = $name; - $params['events'] = $events; - $params['url'] = $url; - $params['security'] = $security; - $params['httpUser'] = $httpUser; - $params['httpPass'] = $httpPass; - - return $this->client->call(Client::METHOD_POST, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Get Webhook - * - * @param string $projectId - * @param string $webhookId - * @throws Exception - * @return array - */ - public function getWebhook(string $projectId, string $webhookId):array - { - $path = str_replace(['{projectId}', '{webhookId}'], [$projectId, $webhookId], '/projects/{projectId}/webhooks/{webhookId}'); - $params = []; - - - return $this->client->call(Client::METHOD_GET, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Update Webhook - * - * @param string $projectId - * @param string $webhookId - * @param string $name - * @param array $events - * @param string $url - * @param int $security - * @param string $httpUser - * @param string $httpPass - * @throws Exception - * @return array - */ - public function updateWebhook(string $projectId, string $webhookId, string $name, array $events, string $url, int $security, string $httpUser = '', string $httpPass = ''):array - { - $path = str_replace(['{projectId}', '{webhookId}'], [$projectId, $webhookId], '/projects/{projectId}/webhooks/{webhookId}'); - $params = []; - - $params['name'] = $name; - $params['events'] = $events; - $params['url'] = $url; - $params['security'] = $security; - $params['httpUser'] = $httpUser; - $params['httpPass'] = $httpPass; - - return $this->client->call(Client::METHOD_PUT, $path, [ - 'content-type' => 'application/json', - ], $params); - } - - /** - * Delete Webhook - * - * @param string $projectId - * @param string $webhookId - * @throws Exception - * @return array - */ - public function deleteWebhook(string $projectId, string $webhookId):array - { - $path = str_replace(['{projectId}', '{webhookId}'], [$projectId, $webhookId], '/projects/{projectId}/webhooks/{webhookId}'); - $params = []; - - - return $this->client->call(Client::METHOD_DELETE, $path, [ - 'content-type' => 'application/json', - ], $params); - } - -} \ No newline at end of file diff --git a/app/sdks/php/src/Appwrite/Services/Teams.php b/app/sdks/php/src/Appwrite/Services/Teams.php index 5117caa855..4b305bf9e9 100644 --- a/app/sdks/php/src/Appwrite/Services/Teams.php +++ b/app/sdks/php/src/Appwrite/Services/Teams.php @@ -212,43 +212,4 @@ class Teams extends Service ], $params); } - /** - * Update Team Membership Status - * - * Use this endpoint to let user accept an invitation to join a team after he - * is being redirect back to your app from the invitation email. Use the - * success and failure URL's to redirect users back to your application after - * the request completes. - * - * Please note that in order to avoid a [Redirect - * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) - * the only valid redirect URL's are the once from domains you have set when - * added your platforms in the console interface. - * - * When not using the success or failure redirect arguments this endpoint will - * result with a 200 status code on success and with 401 status error on - * failure. This behavior was applied to help the web clients deal with - * browsers who don't allow to set 3rd party HTTP cookies needed for saving - * the account session key. - * - * @param string $teamId - * @param string $inviteId - * @param string $userId - * @param string $secret - * @throws Exception - * @return array - */ - public function updateTeamMembershipStatus(string $teamId, string $inviteId, string $userId, string $secret):array - { - $path = str_replace(['{teamId}', '{inviteId}'], [$teamId, $inviteId], '/teams/{teamId}/memberships/{inviteId}/status'); - $params = []; - - $params['userId'] = $userId; - $params['secret'] = $secret; - - return $this->client->call(Client::METHOD_PATCH, $path, [ - 'content-type' => 'application/json', - ], $params); - } - } \ No newline at end of file diff --git a/app/sdks/python/appwrite/services/account.py b/app/sdks/python/appwrite/services/account.py deleted file mode 100644 index ab045782da..0000000000 --- a/app/sdks/python/appwrite/services/account.py +++ /dev/null @@ -1,222 +0,0 @@ -from ..service import Service - - -class Account(Service): - - def __init__(self, client): - super(Account, self).__init__(client) - - def get_account(self): - """Get Account""" - - params = {} - path = '/account' - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def create_account(self, email, password, name=''): - """Create Account""" - - params = {} - path = '/account' - params['email'] = email - params['password'] = password - params['name'] = name - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def delete(self): - """Delete Account""" - - params = {} - path = '/account' - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def update_email(self, email, password): - """Update Account Email""" - - params = {} - path = '/account/email' - params['email'] = email - params['password'] = password - - return self.client.call('patch', path, { - 'content-type': 'application/json', - }, params) - - def get_account_logs(self): - """Get Account Logs""" - - params = {} - path = '/account/logs' - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def update_account_name(self, name): - """Update Account Name""" - - params = {} - path = '/account/name' - params['name'] = name - - return self.client.call('patch', path, { - 'content-type': 'application/json', - }, params) - - def update_account_password(self, password, old_password): - """Update Account Password""" - - params = {} - path = '/account/password' - params['password'] = password - params['old-password'] = old_password - - return self.client.call('patch', path, { - 'content-type': 'application/json', - }, params) - - def get_account_prefs(self): - """Get Account Preferences""" - - params = {} - path = '/account/prefs' - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def update_prefs(self, prefs): - """Update Account Preferences""" - - params = {} - path = '/account/prefs' - params['prefs'] = prefs - - return self.client.call('patch', path, { - 'content-type': 'application/json', - }, params) - - def create_account_recovery(self, email, url): - """Password Recovery""" - - params = {} - path = '/account/recovery' - params['email'] = email - params['url'] = url - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def update_account_recovery(self, user_id, secret, password_a, password_b): - """Password Reset""" - - params = {} - path = '/account/recovery' - params['userId'] = user_id - params['secret'] = secret - params['password-a'] = password_a - params['password-b'] = password_b - - return self.client.call('put', path, { - 'content-type': 'application/json', - }, params) - - def get_account_sessions(self): - """Get Account Sessions""" - - params = {} - path = '/account/sessions' - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def create_account_session(self, email, password): - """Create Account Session""" - - params = {} - path = '/account/sessions' - params['email'] = email - params['password'] = password - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def delete_account_sessions(self): - """Delete All Account Sessions""" - - params = {} - path = '/account/sessions' - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def delete_account_current_session(self): - """Delete Current Account Session""" - - params = {} - path = '/account/sessions/current' - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def create_account_session_o_auth(self, provider, success, failure): - """Create Account Session with OAuth""" - - params = {} - path = '/account/sessions/oauth/{provider}' - path = path.replace('{provider}', provider) - params['success'] = success - params['failure'] = failure - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def delete_account_session(self, id): - """Delete Account Session""" - - params = {} - path = '/account/sessions/{id}' - path = path.replace('{id}', id) - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def create_account_verification(self, url): - """Create Verification""" - - params = {} - path = '/account/verification' - params['url'] = url - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def update_account_verification(self, user_id, secret, password_b): - """Updated Verification""" - - params = {} - path = '/account/verification' - params['userId'] = user_id - params['secret'] = secret - params['password-b'] = password_b - - return self.client.call('put', path, { - 'content-type': 'application/json', - }, params) diff --git a/app/sdks/python/appwrite/services/auth.py b/app/sdks/python/appwrite/services/auth.py deleted file mode 100644 index ff0a894428..0000000000 --- a/app/sdks/python/appwrite/services/auth.py +++ /dev/null @@ -1,120 +0,0 @@ -from ..service import Service - - -class Auth(Service): - - def __init__(self, client): - super(Auth, self).__init__(client) - - def login(self, email, password, success='', failure=''): - """Login""" - - params = {} - path = '/auth/login' - params['email'] = email - params['password'] = password - params['success'] = success - params['failure'] = failure - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def oauth(self, provider, success, failure): - """Login with OAuth""" - - params = {} - path = '/auth/login/oauth/{provider}' - path = path.replace('{provider}', provider) - params['success'] = success - params['failure'] = failure - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def logout(self): - """Logout Current Session""" - - params = {} - path = '/auth/logout' - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def logout_by_session(self, id): - """Logout Specific Session""" - - params = {} - path = '/auth/logout/{id}' - path = path.replace('{id}', id) - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def recovery(self, email, reset): - """Password Recovery""" - - params = {} - path = '/auth/recovery' - params['email'] = email - params['reset'] = reset - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def recovery_reset(self, user_id, token, password_a, password_b): - """Password Reset""" - - params = {} - path = '/auth/recovery/reset' - params['userId'] = user_id - params['token'] = token - params['password-a'] = password_a - params['password-b'] = password_b - - return self.client.call('put', path, { - 'content-type': 'application/json', - }, params) - - def register(self, email, password, confirm, success='', failure='', name=''): - """Register""" - - params = {} - path = '/auth/register' - params['email'] = email - params['password'] = password - params['confirm'] = confirm - params['success'] = success - params['failure'] = failure - params['name'] = name - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def confirm(self, user_id, token): - """Confirmation""" - - params = {} - path = '/auth/register/confirm' - params['userId'] = user_id - params['token'] = token - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def confirm_resend(self, confirm): - """Resend Confirmation""" - - params = {} - path = '/auth/register/confirm/resend' - params['confirm'] = confirm - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) diff --git a/app/sdks/python/appwrite/services/projects.py b/app/sdks/python/appwrite/services/projects.py deleted file mode 100644 index 3dea4fbd9b..0000000000 --- a/app/sdks/python/appwrite/services/projects.py +++ /dev/null @@ -1,381 +0,0 @@ -from ..service import Service - - -class Projects(Service): - - def __init__(self, client): - super(Projects, self).__init__(client) - - def list_projects(self): - """List Projects""" - - params = {} - path = '/projects' - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def create_project(self, name, team_id, description='', logo='', url='', legal_name='', legal_country='', legal_state='', legal_city='', legal_address='', legal_tax_id=''): - """Create Project""" - - params = {} - path = '/projects' - params['name'] = name - params['teamId'] = team_id - params['description'] = description - params['logo'] = logo - params['url'] = url - params['legalName'] = legal_name - params['legalCountry'] = legal_country - params['legalState'] = legal_state - params['legalCity'] = legal_city - params['legalAddress'] = legal_address - params['legalTaxId'] = legal_tax_id - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def get_project(self, project_id): - """Get Project""" - - params = {} - path = '/projects/{projectId}' - path = path.replace('{projectId}', project_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def update_project(self, project_id, name, description='', logo='', url='', legal_name='', legal_country='', legal_state='', legal_city='', legal_address='', legal_tax_id=''): - """Update Project""" - - params = {} - path = '/projects/{projectId}' - path = path.replace('{projectId}', project_id) - params['name'] = name - params['description'] = description - params['logo'] = logo - params['url'] = url - params['legalName'] = legal_name - params['legalCountry'] = legal_country - params['legalState'] = legal_state - params['legalCity'] = legal_city - params['legalAddress'] = legal_address - params['legalTaxId'] = legal_tax_id - - return self.client.call('patch', path, { - 'content-type': 'application/json', - }, params) - - def delete_project(self, project_id): - """Delete Project""" - - params = {} - path = '/projects/{projectId}' - path = path.replace('{projectId}', project_id) - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def list_keys(self, project_id): - """List Keys""" - - params = {} - path = '/projects/{projectId}/keys' - path = path.replace('{projectId}', project_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def create_key(self, project_id, name, scopes): - """Create Key""" - - params = {} - path = '/projects/{projectId}/keys' - path = path.replace('{projectId}', project_id) - params['name'] = name - params['scopes'] = scopes - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def get_key(self, project_id, key_id): - """Get Key""" - - params = {} - path = '/projects/{projectId}/keys/{keyId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{keyId}', key_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def update_key(self, project_id, key_id, name, scopes): - """Update Key""" - - params = {} - path = '/projects/{projectId}/keys/{keyId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{keyId}', key_id) - params['name'] = name - params['scopes'] = scopes - - return self.client.call('put', path, { - 'content-type': 'application/json', - }, params) - - def delete_key(self, project_id, key_id): - """Delete Key""" - - params = {} - path = '/projects/{projectId}/keys/{keyId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{keyId}', key_id) - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def update_project_o_auth(self, project_id, provider, app_id='', secret=''): - """Update Project OAuth""" - - params = {} - path = '/projects/{projectId}/oauth' - path = path.replace('{projectId}', project_id) - params['provider'] = provider - params['appId'] = app_id - params['secret'] = secret - - return self.client.call('patch', path, { - 'content-type': 'application/json', - }, params) - - def list_platforms(self, project_id): - """List Platforms""" - - params = {} - path = '/projects/{projectId}/platforms' - path = path.replace('{projectId}', project_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def create_platform(self, project_id, type, name, key='', store='', url=''): - """Create Platform""" - - params = {} - path = '/projects/{projectId}/platforms' - path = path.replace('{projectId}', project_id) - params['type'] = type - params['name'] = name - params['key'] = key - params['store'] = store - params['url'] = url - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def get_platform(self, project_id, platform_id): - """Get Platform""" - - params = {} - path = '/projects/{projectId}/platforms/{platformId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{platformId}', platform_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def update_platform(self, project_id, platform_id, name, key='', store='', url=''): - """Update Platform""" - - params = {} - path = '/projects/{projectId}/platforms/{platformId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{platformId}', platform_id) - params['name'] = name - params['key'] = key - params['store'] = store - params['url'] = url - - return self.client.call('put', path, { - 'content-type': 'application/json', - }, params) - - def delete_platform(self, project_id, platform_id): - """Delete Platform""" - - params = {} - path = '/projects/{projectId}/platforms/{platformId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{platformId}', platform_id) - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def list_tasks(self, project_id): - """List Tasks""" - - params = {} - path = '/projects/{projectId}/tasks' - path = path.replace('{projectId}', project_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def create_task(self, project_id, name, status, schedule, security, http_method, http_url, http_headers={}, http_user='', http_pass=''): - """Create Task""" - - params = {} - path = '/projects/{projectId}/tasks' - path = path.replace('{projectId}', project_id) - params['name'] = name - params['status'] = status - params['schedule'] = schedule - params['security'] = security - params['httpMethod'] = http_method - params['httpUrl'] = http_url - params['httpHeaders'] = http_headers - params['httpUser'] = http_user - params['httpPass'] = http_pass - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def get_task(self, project_id, task_id): - """Get Task""" - - params = {} - path = '/projects/{projectId}/tasks/{taskId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{taskId}', task_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def update_task(self, project_id, task_id, name, status, schedule, security, http_method, http_url, http_headers={}, http_user='', http_pass=''): - """Update Task""" - - params = {} - path = '/projects/{projectId}/tasks/{taskId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{taskId}', task_id) - params['name'] = name - params['status'] = status - params['schedule'] = schedule - params['security'] = security - params['httpMethod'] = http_method - params['httpUrl'] = http_url - params['httpHeaders'] = http_headers - params['httpUser'] = http_user - params['httpPass'] = http_pass - - return self.client.call('put', path, { - 'content-type': 'application/json', - }, params) - - def delete_task(self, project_id, task_id): - """Delete Task""" - - params = {} - path = '/projects/{projectId}/tasks/{taskId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{taskId}', task_id) - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) - - def get_project_usage(self, project_id): - """Get Project""" - - params = {} - path = '/projects/{projectId}/usage' - path = path.replace('{projectId}', project_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def list_webhooks(self, project_id): - """List Webhooks""" - - params = {} - path = '/projects/{projectId}/webhooks' - path = path.replace('{projectId}', project_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def create_webhook(self, project_id, name, events, url, security, http_user='', http_pass=''): - """Create Webhook""" - - params = {} - path = '/projects/{projectId}/webhooks' - path = path.replace('{projectId}', project_id) - params['name'] = name - params['events'] = events - params['url'] = url - params['security'] = security - params['httpUser'] = http_user - params['httpPass'] = http_pass - - return self.client.call('post', path, { - 'content-type': 'application/json', - }, params) - - def get_webhook(self, project_id, webhook_id): - """Get Webhook""" - - params = {} - path = '/projects/{projectId}/webhooks/{webhookId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{webhookId}', webhook_id) - - return self.client.call('get', path, { - 'content-type': 'application/json', - }, params) - - def update_webhook(self, project_id, webhook_id, name, events, url, security, http_user='', http_pass=''): - """Update Webhook""" - - params = {} - path = '/projects/{projectId}/webhooks/{webhookId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{webhookId}', webhook_id) - params['name'] = name - params['events'] = events - params['url'] = url - params['security'] = security - params['httpUser'] = http_user - params['httpPass'] = http_pass - - return self.client.call('put', path, { - 'content-type': 'application/json', - }, params) - - def delete_webhook(self, project_id, webhook_id): - """Delete Webhook""" - - params = {} - path = '/projects/{projectId}/webhooks/{webhookId}' - path = path.replace('{projectId}', project_id) - path = path.replace('{webhookId}', webhook_id) - - return self.client.call('delete', path, { - 'content-type': 'application/json', - }, params) diff --git a/app/sdks/python/appwrite/services/teams.py b/app/sdks/python/appwrite/services/teams.py index 7112e45a87..bcf995929f 100644 --- a/app/sdks/python/appwrite/services/teams.py +++ b/app/sdks/python/appwrite/services/teams.py @@ -103,17 +103,3 @@ class Teams(Service): return self.client.call('delete', path, { 'content-type': 'application/json', }, params) - - def update_team_membership_status(self, team_id, invite_id, user_id, secret): - """Update Team Membership Status""" - - params = {} - path = '/teams/{teamId}/memberships/{inviteId}/status' - path = path.replace('{teamId}', team_id) - path = path.replace('{inviteId}', invite_id) - params['userId'] = user_id - params['secret'] = secret - - return self.client.call('patch', path, { - 'content-type': 'application/json', - }, params) diff --git a/app/sdks/ruby/lib/appwrite.rb b/app/sdks/ruby/lib/appwrite.rb index c93a767938..0d0dcd156e 100644 --- a/app/sdks/ruby/lib/appwrite.rb +++ b/app/sdks/ruby/lib/appwrite.rb @@ -3,11 +3,9 @@ require 'uri' require 'json' require_relative 'appwrite/client' require_relative 'appwrite/service' -require_relative 'appwrite/services/account' require_relative 'appwrite/services/avatars' require_relative 'appwrite/services/database' require_relative 'appwrite/services/locale' -require_relative 'appwrite/services/projects' require_relative 'appwrite/services/storage' require_relative 'appwrite/services/teams' require_relative 'appwrite/services/users' diff --git a/app/sdks/ruby/lib/appwrite/services/account.rb b/app/sdks/ruby/lib/appwrite/services/account.rb deleted file mode 100644 index 51c4a614f4..0000000000 --- a/app/sdks/ruby/lib/appwrite/services/account.rb +++ /dev/null @@ -1,243 +0,0 @@ -module Appwrite - class Account < Service - - def get_account() - path = '/account' - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_account(email:, password:, name: '') - path = '/account' - - params = { - 'email': email, - 'password': password, - 'name': name - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete() - path = '/account' - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_email(email:, password:) - path = '/account/email' - - params = { - 'email': email, - 'password': password - } - - return @client.call('patch', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_account_logs() - path = '/account/logs' - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_account_name(name:) - path = '/account/name' - - params = { - 'name': name - } - - return @client.call('patch', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_account_password(password:, old_password:) - path = '/account/password' - - params = { - 'password': password, - 'old-password': old_password - } - - return @client.call('patch', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_account_prefs() - path = '/account/prefs' - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_prefs(prefs:) - path = '/account/prefs' - - params = { - 'prefs': prefs - } - - return @client.call('patch', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_account_recovery(email:, url:) - path = '/account/recovery' - - params = { - 'email': email, - 'url': url - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_account_recovery(user_id:, secret:, password_a:, password_b:) - path = '/account/recovery' - - params = { - 'userId': user_id, - 'secret': secret, - 'password-a': password_a, - 'password-b': password_b - } - - return @client.call('put', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_account_sessions() - path = '/account/sessions' - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_account_session(email:, password:) - path = '/account/sessions' - - params = { - 'email': email, - 'password': password - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete_account_sessions() - path = '/account/sessions' - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete_account_current_session() - path = '/account/sessions/current' - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_account_session_o_auth(provider:, success:, failure:) - path = '/account/sessions/oauth/{provider}' - .gsub('{provider}', provider) - - params = { - 'success': success, - 'failure': failure - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete_account_session(id:) - path = '/account/sessions/{id}' - .gsub('{id}', id) - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_account_verification(url:) - path = '/account/verification' - - params = { - 'url': url - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_account_verification(user_id:, secret:, password_b:) - path = '/account/verification' - - params = { - 'userId': user_id, - 'secret': secret, - 'password-b': password_b - } - - return @client.call('put', path, { - 'content-type' => 'application/json', - }, params); - end - - - protected - - private - end -end \ No newline at end of file diff --git a/app/sdks/ruby/lib/appwrite/services/auth.rb b/app/sdks/ruby/lib/appwrite/services/auth.rb deleted file mode 100644 index bcf5e8906b..0000000000 --- a/app/sdks/ruby/lib/appwrite/services/auth.rb +++ /dev/null @@ -1,131 +0,0 @@ -module Appwrite - class Auth < Service - - def login(email:, password:, success: '', failure: '') - path = '/auth/login' - - params = { - 'email': email, - 'password': password, - 'success': success, - 'failure': failure - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def oauth(provider:, success:, failure:) - path = '/auth/login/oauth/{provider}' - .gsub('{provider}', provider) - - params = { - 'success': success, - 'failure': failure - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def logout() - path = '/auth/logout' - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def logout_by_session(id:) - path = '/auth/logout/{id}' - .gsub('{id}', id) - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def recovery(email:, reset:) - path = '/auth/recovery' - - params = { - 'email': email, - 'reset': reset - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def recovery_reset(user_id:, token:, password_a:, password_b:) - path = '/auth/recovery/reset' - - params = { - 'userId': user_id, - 'token': token, - 'password-a': password_a, - 'password-b': password_b - } - - return @client.call('put', path, { - 'content-type' => 'application/json', - }, params); - end - - def register(email:, password:, confirm:, success: '', failure: '', name: '') - path = '/auth/register' - - params = { - 'email': email, - 'password': password, - 'confirm': confirm, - 'success': success, - 'failure': failure, - 'name': name - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def confirm(user_id:, token:) - path = '/auth/register/confirm' - - params = { - 'userId': user_id, - 'token': token - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def confirm_resend(confirm:) - path = '/auth/register/confirm/resend' - - params = { - 'confirm': confirm - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - - protected - - private - end -end \ No newline at end of file diff --git a/app/sdks/ruby/lib/appwrite/services/projects.rb b/app/sdks/ruby/lib/appwrite/services/projects.rb deleted file mode 100644 index 9988708e92..0000000000 --- a/app/sdks/ruby/lib/appwrite/services/projects.rb +++ /dev/null @@ -1,410 +0,0 @@ -module Appwrite - class Projects < Service - - def list_projects() - path = '/projects' - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_project(name:, team_id:, description: '', logo: '', url: '', legal_name: '', legal_country: '', legal_state: '', legal_city: '', legal_address: '', legal_tax_id: '') - path = '/projects' - - params = { - 'name': name, - 'teamId': team_id, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legal_name, - 'legalCountry': legal_country, - 'legalState': legal_state, - 'legalCity': legal_city, - 'legalAddress': legal_address, - 'legalTaxId': legal_tax_id - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_project(project_id:) - path = '/projects/{projectId}' - .gsub('{project_id}', project_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_project(project_id:, name:, description: '', logo: '', url: '', legal_name: '', legal_country: '', legal_state: '', legal_city: '', legal_address: '', legal_tax_id: '') - path = '/projects/{projectId}' - .gsub('{project_id}', project_id) - - params = { - 'name': name, - 'description': description, - 'logo': logo, - 'url': url, - 'legalName': legal_name, - 'legalCountry': legal_country, - 'legalState': legal_state, - 'legalCity': legal_city, - 'legalAddress': legal_address, - 'legalTaxId': legal_tax_id - } - - return @client.call('patch', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete_project(project_id:) - path = '/projects/{projectId}' - .gsub('{project_id}', project_id) - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def list_keys(project_id:) - path = '/projects/{projectId}/keys' - .gsub('{project_id}', project_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_key(project_id:, name:, scopes:) - path = '/projects/{projectId}/keys' - .gsub('{project_id}', project_id) - - params = { - 'name': name, - 'scopes': scopes - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_key(project_id:, key_id:) - path = '/projects/{projectId}/keys/{keyId}' - .gsub('{project_id}', project_id) - .gsub('{key_id}', key_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_key(project_id:, key_id:, name:, scopes:) - path = '/projects/{projectId}/keys/{keyId}' - .gsub('{project_id}', project_id) - .gsub('{key_id}', key_id) - - params = { - 'name': name, - 'scopes': scopes - } - - return @client.call('put', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete_key(project_id:, key_id:) - path = '/projects/{projectId}/keys/{keyId}' - .gsub('{project_id}', project_id) - .gsub('{key_id}', key_id) - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_project_o_auth(project_id:, provider:, app_id: '', secret: '') - path = '/projects/{projectId}/oauth' - .gsub('{project_id}', project_id) - - params = { - 'provider': provider, - 'appId': app_id, - 'secret': secret - } - - return @client.call('patch', path, { - 'content-type' => 'application/json', - }, params); - end - - def list_platforms(project_id:) - path = '/projects/{projectId}/platforms' - .gsub('{project_id}', project_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_platform(project_id:, type:, name:, key: '', store: '', url: '') - path = '/projects/{projectId}/platforms' - .gsub('{project_id}', project_id) - - params = { - 'type': type, - 'name': name, - 'key': key, - 'store': store, - 'url': url - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_platform(project_id:, platform_id:) - path = '/projects/{projectId}/platforms/{platformId}' - .gsub('{project_id}', project_id) - .gsub('{platform_id}', platform_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_platform(project_id:, platform_id:, name:, key: '', store: '', url: '') - path = '/projects/{projectId}/platforms/{platformId}' - .gsub('{project_id}', project_id) - .gsub('{platform_id}', platform_id) - - params = { - 'name': name, - 'key': key, - 'store': store, - 'url': url - } - - return @client.call('put', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete_platform(project_id:, platform_id:) - path = '/projects/{projectId}/platforms/{platformId}' - .gsub('{project_id}', project_id) - .gsub('{platform_id}', platform_id) - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def list_tasks(project_id:) - path = '/projects/{projectId}/tasks' - .gsub('{project_id}', project_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_task(project_id:, name:, status:, schedule:, security:, http_method:, http_url:, http_headers: [], http_user: '', http_pass: '') - path = '/projects/{projectId}/tasks' - .gsub('{project_id}', project_id) - - params = { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': http_method, - 'httpUrl': http_url, - 'httpHeaders': http_headers, - 'httpUser': http_user, - 'httpPass': http_pass - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_task(project_id:, task_id:) - path = '/projects/{projectId}/tasks/{taskId}' - .gsub('{project_id}', project_id) - .gsub('{task_id}', task_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_task(project_id:, task_id:, name:, status:, schedule:, security:, http_method:, http_url:, http_headers: [], http_user: '', http_pass: '') - path = '/projects/{projectId}/tasks/{taskId}' - .gsub('{project_id}', project_id) - .gsub('{task_id}', task_id) - - params = { - 'name': name, - 'status': status, - 'schedule': schedule, - 'security': security, - 'httpMethod': http_method, - 'httpUrl': http_url, - 'httpHeaders': http_headers, - 'httpUser': http_user, - 'httpPass': http_pass - } - - return @client.call('put', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete_task(project_id:, task_id:) - path = '/projects/{projectId}/tasks/{taskId}' - .gsub('{project_id}', project_id) - .gsub('{task_id}', task_id) - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_project_usage(project_id:) - path = '/projects/{projectId}/usage' - .gsub('{project_id}', project_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def list_webhooks(project_id:) - path = '/projects/{projectId}/webhooks' - .gsub('{project_id}', project_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def create_webhook(project_id:, name:, events:, url:, security:, http_user: '', http_pass: '') - path = '/projects/{projectId}/webhooks' - .gsub('{project_id}', project_id) - - params = { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': http_user, - 'httpPass': http_pass - } - - return @client.call('post', path, { - 'content-type' => 'application/json', - }, params); - end - - def get_webhook(project_id:, webhook_id:) - path = '/projects/{projectId}/webhooks/{webhookId}' - .gsub('{project_id}', project_id) - .gsub('{webhook_id}', webhook_id) - - params = { - } - - return @client.call('get', path, { - 'content-type' => 'application/json', - }, params); - end - - def update_webhook(project_id:, webhook_id:, name:, events:, url:, security:, http_user: '', http_pass: '') - path = '/projects/{projectId}/webhooks/{webhookId}' - .gsub('{project_id}', project_id) - .gsub('{webhook_id}', webhook_id) - - params = { - 'name': name, - 'events': events, - 'url': url, - 'security': security, - 'httpUser': http_user, - 'httpPass': http_pass - } - - return @client.call('put', path, { - 'content-type' => 'application/json', - }, params); - end - - def delete_webhook(project_id:, webhook_id:) - path = '/projects/{projectId}/webhooks/{webhookId}' - .gsub('{project_id}', project_id) - .gsub('{webhook_id}', webhook_id) - - params = { - } - - return @client.call('delete', path, { - 'content-type' => 'application/json', - }, params); - end - - - protected - - private - end -end \ No newline at end of file diff --git a/app/sdks/ruby/lib/appwrite/services/teams.rb b/app/sdks/ruby/lib/appwrite/services/teams.rb index 143c2a650c..16ae20e676 100644 --- a/app/sdks/ruby/lib/appwrite/services/teams.rb +++ b/app/sdks/ruby/lib/appwrite/services/teams.rb @@ -107,21 +107,6 @@ module Appwrite }, params); end - def update_team_membership_status(team_id:, invite_id:, user_id:, secret:) - path = '/teams/{teamId}/memberships/{inviteId}/status' - .gsub('{team_id}', team_id) - .gsub('{invite_id}', invite_id) - - params = { - 'userId': user_id, - 'secret': secret - } - - return @client.call('patch', path, { - 'content-type' => 'application/json', - }, params); - end - protected diff --git a/app/tasks/sdks.php b/app/tasks/sdks.php index 3200540c1e..1918363fe4 100644 --- a/app/tasks/sdks.php +++ b/app/tasks/sdks.php @@ -48,8 +48,8 @@ $cli } Console::info('Fetching API Spec for '.$language['name'].' for '.$platform['name']); - - $spec = getSSLPage('http://localhost/v1/open-api-2.json?extensions=1'); + + $spec = getSSLPage('http://localhost/v1/open-api-2.json?extensions=1&platform='.$language['family']); $result = realpath(__DIR__.'/..').'/sdks/'.$language['key']; $target = realpath(__DIR__.'/..').'/sdks/git/'.$language['key'].'/'; From 464ae9ee70d77e0a36a241326580d09b1050a682 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 15:29:26 +0200 Subject: [PATCH 103/237] Added python code examples --- app/sdks/python/appwrite/client.py | 2 + .../docs/examples/avatars/get-browser.md | 13 ++ .../docs/examples/avatars/get-credit-card.md | 13 ++ .../docs/examples/avatars/get-favicon.md | 13 ++ .../python/docs/examples/avatars/get-flag.md | 13 ++ .../python/docs/examples/avatars/get-image.md | 13 ++ .../python/docs/examples/avatars/get-q-r.md | 13 ++ .../examples/database/create-collection.md | 13 ++ .../docs/examples/database/create-document.md | 13 ++ .../examples/database/delete-collection.md | 13 ++ .../docs/examples/database/delete-document.md | 13 ++ .../docs/examples/database/get-collection.md | 13 ++ .../docs/examples/database/get-document.md | 13 ++ .../examples/database/list-collections.md | 13 ++ .../docs/examples/database/list-documents.md | 13 ++ .../examples/database/update-collection.md | 13 ++ .../docs/examples/database/update-document.md | 13 ++ .../docs/examples/locale/get-continents.md | 13 ++ .../docs/examples/locale/get-countries-e-u.md | 13 ++ .../examples/locale/get-countries-phones.md | 13 ++ .../docs/examples/locale/get-countries.md | 13 ++ .../docs/examples/locale/get-currencies.md | 13 ++ .../python/docs/examples/locale/get-locale.md | 13 ++ .../docs/examples/storage/create-file.md | 13 ++ .../docs/examples/storage/delete-file.md | 13 ++ .../examples/storage/get-file-download.md | 13 ++ .../docs/examples/storage/get-file-preview.md | 13 ++ .../docs/examples/storage/get-file-view.md | 13 ++ .../python/docs/examples/storage/get-file.md | 13 ++ .../docs/examples/storage/list-files.md | 13 ++ .../docs/examples/storage/update-file.md | 13 ++ .../examples/teams/create-team-membership.md | 13 ++ .../python/docs/examples/teams/create-team.md | 13 ++ .../examples/teams/delete-team-membership.md | 13 ++ .../python/docs/examples/teams/delete-team.md | 13 ++ .../examples/teams/get-team-memberships.md | 13 ++ .../python/docs/examples/teams/get-team.md | 13 ++ .../python/docs/examples/teams/list-teams.md | 13 ++ .../python/docs/examples/teams/update-team.md | 13 ++ .../python/docs/examples/users/create-user.md | 13 ++ .../examples/users/delete-user-session.md | 13 ++ .../examples/users/delete-user-sessions.md | 13 ++ .../docs/examples/users/get-user-logs.md | 13 ++ .../docs/examples/users/get-user-prefs.md | 13 ++ .../docs/examples/users/get-user-sessions.md | 13 ++ .../python/docs/examples/users/get-user.md | 13 ++ .../python/docs/examples/users/list-users.md | 13 ++ .../docs/examples/users/update-user-prefs.md | 13 ++ .../docs/examples/users/update-user-status.md | 13 ++ composer.lock | 155 +++++++++--------- 50 files changed, 705 insertions(+), 76 deletions(-) create mode 100644 app/sdks/python/docs/examples/avatars/get-browser.md create mode 100644 app/sdks/python/docs/examples/avatars/get-credit-card.md create mode 100644 app/sdks/python/docs/examples/avatars/get-favicon.md create mode 100644 app/sdks/python/docs/examples/avatars/get-flag.md create mode 100644 app/sdks/python/docs/examples/avatars/get-image.md create mode 100644 app/sdks/python/docs/examples/avatars/get-q-r.md create mode 100644 app/sdks/python/docs/examples/database/create-collection.md create mode 100644 app/sdks/python/docs/examples/database/create-document.md create mode 100644 app/sdks/python/docs/examples/database/delete-collection.md create mode 100644 app/sdks/python/docs/examples/database/delete-document.md create mode 100644 app/sdks/python/docs/examples/database/get-collection.md create mode 100644 app/sdks/python/docs/examples/database/get-document.md create mode 100644 app/sdks/python/docs/examples/database/list-collections.md create mode 100644 app/sdks/python/docs/examples/database/list-documents.md create mode 100644 app/sdks/python/docs/examples/database/update-collection.md create mode 100644 app/sdks/python/docs/examples/database/update-document.md create mode 100644 app/sdks/python/docs/examples/locale/get-continents.md create mode 100644 app/sdks/python/docs/examples/locale/get-countries-e-u.md create mode 100644 app/sdks/python/docs/examples/locale/get-countries-phones.md create mode 100644 app/sdks/python/docs/examples/locale/get-countries.md create mode 100644 app/sdks/python/docs/examples/locale/get-currencies.md create mode 100644 app/sdks/python/docs/examples/locale/get-locale.md create mode 100644 app/sdks/python/docs/examples/storage/create-file.md create mode 100644 app/sdks/python/docs/examples/storage/delete-file.md create mode 100644 app/sdks/python/docs/examples/storage/get-file-download.md create mode 100644 app/sdks/python/docs/examples/storage/get-file-preview.md create mode 100644 app/sdks/python/docs/examples/storage/get-file-view.md create mode 100644 app/sdks/python/docs/examples/storage/get-file.md create mode 100644 app/sdks/python/docs/examples/storage/list-files.md create mode 100644 app/sdks/python/docs/examples/storage/update-file.md create mode 100644 app/sdks/python/docs/examples/teams/create-team-membership.md create mode 100644 app/sdks/python/docs/examples/teams/create-team.md create mode 100644 app/sdks/python/docs/examples/teams/delete-team-membership.md create mode 100644 app/sdks/python/docs/examples/teams/delete-team.md create mode 100644 app/sdks/python/docs/examples/teams/get-team-memberships.md create mode 100644 app/sdks/python/docs/examples/teams/get-team.md create mode 100644 app/sdks/python/docs/examples/teams/list-teams.md create mode 100644 app/sdks/python/docs/examples/teams/update-team.md create mode 100644 app/sdks/python/docs/examples/users/create-user.md create mode 100644 app/sdks/python/docs/examples/users/delete-user-session.md create mode 100644 app/sdks/python/docs/examples/users/delete-user-sessions.md create mode 100644 app/sdks/python/docs/examples/users/get-user-logs.md create mode 100644 app/sdks/python/docs/examples/users/get-user-prefs.md create mode 100644 app/sdks/python/docs/examples/users/get-user-sessions.md create mode 100644 app/sdks/python/docs/examples/users/get-user.md create mode 100644 app/sdks/python/docs/examples/users/list-users.md create mode 100644 app/sdks/python/docs/examples/users/update-user-prefs.md create mode 100644 app/sdks/python/docs/examples/users/update-user-status.md diff --git a/app/sdks/python/appwrite/client.py b/app/sdks/python/appwrite/client.py index 92d8651a55..6c0b1afec0 100644 --- a/app/sdks/python/appwrite/client.py +++ b/app/sdks/python/appwrite/client.py @@ -1,4 +1,6 @@ import requests + + class Client: def __init__(self): self._self_signed = False diff --git a/app/sdks/python/docs/examples/avatars/get-browser.md b/app/sdks/python/docs/examples/avatars/get-browser.md new file mode 100644 index 0000000000..d4a6e244c9 --- /dev/null +++ b/app/sdks/python/docs/examples/avatars/get-browser.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.avatars import Avatars + +client = Client() + +(client + .set_project('') + .set_key('') +) + +avatars = Avatars(client) + +result = avatars.get_browser('aa') diff --git a/app/sdks/python/docs/examples/avatars/get-credit-card.md b/app/sdks/python/docs/examples/avatars/get-credit-card.md new file mode 100644 index 0000000000..b468a0c0a7 --- /dev/null +++ b/app/sdks/python/docs/examples/avatars/get-credit-card.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.avatars import Avatars + +client = Client() + +(client + .set_project('') + .set_key('') +) + +avatars = Avatars(client) + +result = avatars.get_credit_card('amex') diff --git a/app/sdks/python/docs/examples/avatars/get-favicon.md b/app/sdks/python/docs/examples/avatars/get-favicon.md new file mode 100644 index 0000000000..b57fd4fe7b --- /dev/null +++ b/app/sdks/python/docs/examples/avatars/get-favicon.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.avatars import Avatars + +client = Client() + +(client + .set_project('') + .set_key('') +) + +avatars = Avatars(client) + +result = avatars.get_favicon('https://example.com') diff --git a/app/sdks/python/docs/examples/avatars/get-flag.md b/app/sdks/python/docs/examples/avatars/get-flag.md new file mode 100644 index 0000000000..3d389791f3 --- /dev/null +++ b/app/sdks/python/docs/examples/avatars/get-flag.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.avatars import Avatars + +client = Client() + +(client + .set_project('') + .set_key('') +) + +avatars = Avatars(client) + +result = avatars.get_flag('af') diff --git a/app/sdks/python/docs/examples/avatars/get-image.md b/app/sdks/python/docs/examples/avatars/get-image.md new file mode 100644 index 0000000000..afdaa7179f --- /dev/null +++ b/app/sdks/python/docs/examples/avatars/get-image.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.avatars import Avatars + +client = Client() + +(client + .set_project('') + .set_key('') +) + +avatars = Avatars(client) + +result = avatars.get_image('https://example.com') diff --git a/app/sdks/python/docs/examples/avatars/get-q-r.md b/app/sdks/python/docs/examples/avatars/get-q-r.md new file mode 100644 index 0000000000..5af4b22100 --- /dev/null +++ b/app/sdks/python/docs/examples/avatars/get-q-r.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.avatars import Avatars + +client = Client() + +(client + .set_project('') + .set_key('') +) + +avatars = Avatars(client) + +result = avatars.get_q_r('[TEXT]') diff --git a/app/sdks/python/docs/examples/database/create-collection.md b/app/sdks/python/docs/examples/database/create-collection.md new file mode 100644 index 0000000000..9bb397c8c0 --- /dev/null +++ b/app/sdks/python/docs/examples/database/create-collection.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.create_collection('[NAME]', {}, {}, {}) diff --git a/app/sdks/python/docs/examples/database/create-document.md b/app/sdks/python/docs/examples/database/create-document.md new file mode 100644 index 0000000000..353eece269 --- /dev/null +++ b/app/sdks/python/docs/examples/database/create-document.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.create_document('[COLLECTION_ID]', '{}', {}, {}) diff --git a/app/sdks/python/docs/examples/database/delete-collection.md b/app/sdks/python/docs/examples/database/delete-collection.md new file mode 100644 index 0000000000..4718da2760 --- /dev/null +++ b/app/sdks/python/docs/examples/database/delete-collection.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.delete_collection('[COLLECTION_ID]') diff --git a/app/sdks/python/docs/examples/database/delete-document.md b/app/sdks/python/docs/examples/database/delete-document.md new file mode 100644 index 0000000000..91a1118f72 --- /dev/null +++ b/app/sdks/python/docs/examples/database/delete-document.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.delete_document('[COLLECTION_ID]', '[DOCUMENT_ID]') diff --git a/app/sdks/python/docs/examples/database/get-collection.md b/app/sdks/python/docs/examples/database/get-collection.md new file mode 100644 index 0000000000..2336e1b648 --- /dev/null +++ b/app/sdks/python/docs/examples/database/get-collection.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.get_collection('[COLLECTION_ID]') diff --git a/app/sdks/python/docs/examples/database/get-document.md b/app/sdks/python/docs/examples/database/get-document.md new file mode 100644 index 0000000000..dcb8d81cd3 --- /dev/null +++ b/app/sdks/python/docs/examples/database/get-document.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.get_document('[COLLECTION_ID]', '[DOCUMENT_ID]') diff --git a/app/sdks/python/docs/examples/database/list-collections.md b/app/sdks/python/docs/examples/database/list-collections.md new file mode 100644 index 0000000000..a7bacc9220 --- /dev/null +++ b/app/sdks/python/docs/examples/database/list-collections.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.list_collections() diff --git a/app/sdks/python/docs/examples/database/list-documents.md b/app/sdks/python/docs/examples/database/list-documents.md new file mode 100644 index 0000000000..315ccd0310 --- /dev/null +++ b/app/sdks/python/docs/examples/database/list-documents.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.list_documents('[COLLECTION_ID]') diff --git a/app/sdks/python/docs/examples/database/update-collection.md b/app/sdks/python/docs/examples/database/update-collection.md new file mode 100644 index 0000000000..9a47abab3f --- /dev/null +++ b/app/sdks/python/docs/examples/database/update-collection.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.update_collection('[COLLECTION_ID]', '[NAME]', {}, {}) diff --git a/app/sdks/python/docs/examples/database/update-document.md b/app/sdks/python/docs/examples/database/update-document.md new file mode 100644 index 0000000000..9278e4a9f3 --- /dev/null +++ b/app/sdks/python/docs/examples/database/update-document.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.database import Database + +client = Client() + +(client + .set_project('') + .set_key('') +) + +database = Database(client) + +result = database.update_document('[COLLECTION_ID]', '[DOCUMENT_ID]', '{}', {}, {}) diff --git a/app/sdks/python/docs/examples/locale/get-continents.md b/app/sdks/python/docs/examples/locale/get-continents.md new file mode 100644 index 0000000000..92da50b8f7 --- /dev/null +++ b/app/sdks/python/docs/examples/locale/get-continents.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.locale import Locale + +client = Client() + +(client + .set_project('') + .set_key('') +) + +locale = Locale(client) + +result = locale.get_continents() diff --git a/app/sdks/python/docs/examples/locale/get-countries-e-u.md b/app/sdks/python/docs/examples/locale/get-countries-e-u.md new file mode 100644 index 0000000000..90c53ae59d --- /dev/null +++ b/app/sdks/python/docs/examples/locale/get-countries-e-u.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.locale import Locale + +client = Client() + +(client + .set_project('') + .set_key('') +) + +locale = Locale(client) + +result = locale.get_countries_e_u() diff --git a/app/sdks/python/docs/examples/locale/get-countries-phones.md b/app/sdks/python/docs/examples/locale/get-countries-phones.md new file mode 100644 index 0000000000..b7a3d7c631 --- /dev/null +++ b/app/sdks/python/docs/examples/locale/get-countries-phones.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.locale import Locale + +client = Client() + +(client + .set_project('') + .set_key('') +) + +locale = Locale(client) + +result = locale.get_countries_phones() diff --git a/app/sdks/python/docs/examples/locale/get-countries.md b/app/sdks/python/docs/examples/locale/get-countries.md new file mode 100644 index 0000000000..b593224600 --- /dev/null +++ b/app/sdks/python/docs/examples/locale/get-countries.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.locale import Locale + +client = Client() + +(client + .set_project('') + .set_key('') +) + +locale = Locale(client) + +result = locale.get_countries() diff --git a/app/sdks/python/docs/examples/locale/get-currencies.md b/app/sdks/python/docs/examples/locale/get-currencies.md new file mode 100644 index 0000000000..07922a6e11 --- /dev/null +++ b/app/sdks/python/docs/examples/locale/get-currencies.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.locale import Locale + +client = Client() + +(client + .set_project('') + .set_key('') +) + +locale = Locale(client) + +result = locale.get_currencies() diff --git a/app/sdks/python/docs/examples/locale/get-locale.md b/app/sdks/python/docs/examples/locale/get-locale.md new file mode 100644 index 0000000000..552e690e4b --- /dev/null +++ b/app/sdks/python/docs/examples/locale/get-locale.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.locale import Locale + +client = Client() + +(client + .set_project('') + .set_key('') +) + +locale = Locale(client) + +result = locale.get_locale() diff --git a/app/sdks/python/docs/examples/storage/create-file.md b/app/sdks/python/docs/examples/storage/create-file.md new file mode 100644 index 0000000000..9ef2aacd18 --- /dev/null +++ b/app/sdks/python/docs/examples/storage/create-file.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.create_file(document.getElementById('uploader').files[0], {}, {}) diff --git a/app/sdks/python/docs/examples/storage/delete-file.md b/app/sdks/python/docs/examples/storage/delete-file.md new file mode 100644 index 0000000000..7dbf229d28 --- /dev/null +++ b/app/sdks/python/docs/examples/storage/delete-file.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.delete_file('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/get-file-download.md b/app/sdks/python/docs/examples/storage/get-file-download.md new file mode 100644 index 0000000000..cbe8f97b41 --- /dev/null +++ b/app/sdks/python/docs/examples/storage/get-file-download.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.get_file_download('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/get-file-preview.md b/app/sdks/python/docs/examples/storage/get-file-preview.md new file mode 100644 index 0000000000..7d8ffc854e --- /dev/null +++ b/app/sdks/python/docs/examples/storage/get-file-preview.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.get_file_preview('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/get-file-view.md b/app/sdks/python/docs/examples/storage/get-file-view.md new file mode 100644 index 0000000000..72f0ec5731 --- /dev/null +++ b/app/sdks/python/docs/examples/storage/get-file-view.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.get_file_view('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/get-file.md b/app/sdks/python/docs/examples/storage/get-file.md new file mode 100644 index 0000000000..7146cbdb94 --- /dev/null +++ b/app/sdks/python/docs/examples/storage/get-file.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.get_file('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/list-files.md b/app/sdks/python/docs/examples/storage/list-files.md new file mode 100644 index 0000000000..175b3c3a5f --- /dev/null +++ b/app/sdks/python/docs/examples/storage/list-files.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.list_files() diff --git a/app/sdks/python/docs/examples/storage/update-file.md b/app/sdks/python/docs/examples/storage/update-file.md new file mode 100644 index 0000000000..b32f8e7ad0 --- /dev/null +++ b/app/sdks/python/docs/examples/storage/update-file.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.update_file('[FILE_ID]', {}, {}) diff --git a/app/sdks/python/docs/examples/teams/create-team-membership.md b/app/sdks/python/docs/examples/teams/create-team-membership.md new file mode 100644 index 0000000000..6c3f6abf7b --- /dev/null +++ b/app/sdks/python/docs/examples/teams/create-team-membership.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.create_team_membership('[TEAM_ID]', 'email@example.com', {}, 'https://example.com') diff --git a/app/sdks/python/docs/examples/teams/create-team.md b/app/sdks/python/docs/examples/teams/create-team.md new file mode 100644 index 0000000000..2429ba9899 --- /dev/null +++ b/app/sdks/python/docs/examples/teams/create-team.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.create_team('[NAME]') diff --git a/app/sdks/python/docs/examples/teams/delete-team-membership.md b/app/sdks/python/docs/examples/teams/delete-team-membership.md new file mode 100644 index 0000000000..f8360744df --- /dev/null +++ b/app/sdks/python/docs/examples/teams/delete-team-membership.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.delete_team_membership('[TEAM_ID]', '[INVITE_ID]') diff --git a/app/sdks/python/docs/examples/teams/delete-team.md b/app/sdks/python/docs/examples/teams/delete-team.md new file mode 100644 index 0000000000..f442ca8850 --- /dev/null +++ b/app/sdks/python/docs/examples/teams/delete-team.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.delete_team('[TEAM_ID]') diff --git a/app/sdks/python/docs/examples/teams/get-team-memberships.md b/app/sdks/python/docs/examples/teams/get-team-memberships.md new file mode 100644 index 0000000000..0b150d02c8 --- /dev/null +++ b/app/sdks/python/docs/examples/teams/get-team-memberships.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.get_team_memberships('[TEAM_ID]') diff --git a/app/sdks/python/docs/examples/teams/get-team.md b/app/sdks/python/docs/examples/teams/get-team.md new file mode 100644 index 0000000000..3a36051ac7 --- /dev/null +++ b/app/sdks/python/docs/examples/teams/get-team.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.get_team('[TEAM_ID]') diff --git a/app/sdks/python/docs/examples/teams/list-teams.md b/app/sdks/python/docs/examples/teams/list-teams.md new file mode 100644 index 0000000000..0022359833 --- /dev/null +++ b/app/sdks/python/docs/examples/teams/list-teams.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.list_teams() diff --git a/app/sdks/python/docs/examples/teams/update-team.md b/app/sdks/python/docs/examples/teams/update-team.md new file mode 100644 index 0000000000..0b74316a98 --- /dev/null +++ b/app/sdks/python/docs/examples/teams/update-team.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.update_team('[TEAM_ID]', '[NAME]') diff --git a/app/sdks/python/docs/examples/users/create-user.md b/app/sdks/python/docs/examples/users/create-user.md new file mode 100644 index 0000000000..0b83f46274 --- /dev/null +++ b/app/sdks/python/docs/examples/users/create-user.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.create_user('email@example.com', 'password') diff --git a/app/sdks/python/docs/examples/users/delete-user-session.md b/app/sdks/python/docs/examples/users/delete-user-session.md new file mode 100644 index 0000000000..c731fca3d5 --- /dev/null +++ b/app/sdks/python/docs/examples/users/delete-user-session.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.delete_user_session('[USER_ID]', '[SESSION_ID]') diff --git a/app/sdks/python/docs/examples/users/delete-user-sessions.md b/app/sdks/python/docs/examples/users/delete-user-sessions.md new file mode 100644 index 0000000000..64a450d8df --- /dev/null +++ b/app/sdks/python/docs/examples/users/delete-user-sessions.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.delete_user_sessions('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/get-user-logs.md b/app/sdks/python/docs/examples/users/get-user-logs.md new file mode 100644 index 0000000000..83b06d2a2d --- /dev/null +++ b/app/sdks/python/docs/examples/users/get-user-logs.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.get_user_logs('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/get-user-prefs.md b/app/sdks/python/docs/examples/users/get-user-prefs.md new file mode 100644 index 0000000000..1b14b86c86 --- /dev/null +++ b/app/sdks/python/docs/examples/users/get-user-prefs.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.get_user_prefs('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/get-user-sessions.md b/app/sdks/python/docs/examples/users/get-user-sessions.md new file mode 100644 index 0000000000..d91583fbe5 --- /dev/null +++ b/app/sdks/python/docs/examples/users/get-user-sessions.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.get_user_sessions('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/get-user.md b/app/sdks/python/docs/examples/users/get-user.md new file mode 100644 index 0000000000..1a9bc3a023 --- /dev/null +++ b/app/sdks/python/docs/examples/users/get-user.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.get_user('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/list-users.md b/app/sdks/python/docs/examples/users/list-users.md new file mode 100644 index 0000000000..fe2082d306 --- /dev/null +++ b/app/sdks/python/docs/examples/users/list-users.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.list_users() diff --git a/app/sdks/python/docs/examples/users/update-user-prefs.md b/app/sdks/python/docs/examples/users/update-user-prefs.md new file mode 100644 index 0000000000..ff310f654b --- /dev/null +++ b/app/sdks/python/docs/examples/users/update-user-prefs.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.update_user_prefs('[USER_ID]', '') diff --git a/app/sdks/python/docs/examples/users/update-user-status.md b/app/sdks/python/docs/examples/users/update-user-status.md new file mode 100644 index 0000000000..0639c9e5f7 --- /dev/null +++ b/app/sdks/python/docs/examples/users/update-user-status.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.update_user_status('[USER_ID]', '1') diff --git a/composer.lock b/composer.lock index 2abdb7bb53..d6a1723665 100644 --- a/composer.lock +++ b/composer.lock @@ -500,6 +500,9 @@ "php": "^7.2.5", "psr/http-client": "^1.0" }, + "provide": { + "psr/http-client-implementation": "1.0" + }, "require-dev": { "ext-curl": "*", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", @@ -1384,12 +1387,12 @@ "source": { "type": "git", "url": "https://github.com/utopia-php/framework.git", - "reference": "aedc4352a5457a6aab518eb59d46848da5261593" + "reference": "23c9c988d2dfb0d126d65a52b9f2516d71ebaf75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/framework/zipball/aedc4352a5457a6aab518eb59d46848da5261593", - "reference": "aedc4352a5457a6aab518eb59d46848da5261593", + "url": "https://api.github.com/repos/utopia-php/framework/zipball/23c9c988d2dfb0d126d65a52b9f2516d71ebaf75", + "reference": "23c9c988d2dfb0d126d65a52b9f2516d71ebaf75", "shasum": "" }, "require": { @@ -1420,7 +1423,7 @@ "php", "upf" ], - "time": "2020-01-18T18:26:28+00:00" + "time": "2020-01-19T21:33:44+00:00" }, { "name": "utopia-php/locale", @@ -1523,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "f244f2ea50983210ab0fa4813fda2747dd5f1bcd" + "reference": "16e06a55edd4a7f1336249c03f0612080985a035" }, "require": { "ext-curl": "*", @@ -1553,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2019-12-26T05:11:34+00:00" + "time": "2020-01-28T10:11:48+00:00" }, { "name": "doctrine/instantiator", @@ -1613,16 +1616,16 @@ }, { "name": "matthiasmullie/minify", - "version": "1.3.62", + "version": "1.3.63", "source": { "type": "git", "url": "https://github.com/matthiasmullie/minify.git", - "reference": "47a53716f94139aff22922ffd73283ff04f23cdf" + "reference": "9ba1b459828adc13430f4dd6c49dae4950dc4117" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/47a53716f94139aff22922ffd73283ff04f23cdf", - "reference": "47a53716f94139aff22922ffd73283ff04f23cdf", + "url": "https://api.github.com/repos/matthiasmullie/minify/zipball/9ba1b459828adc13430f4dd6c49dae4950dc4117", + "reference": "9ba1b459828adc13430f4dd6c49dae4950dc4117", "shasum": "" }, "require": { @@ -1669,20 +1672,20 @@ "minifier", "minify" ], - "time": "2019-12-19T07:54:47+00:00" + "time": "2020-01-21T20:21:08+00:00" }, { "name": "matthiasmullie/path-converter", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/matthiasmullie/path-converter.git", - "reference": "5e4b121c8b9f97c80835c1d878b0812ba1d607c9" + "reference": "e7d13b2c7e2f2268e1424aaed02085518afa02d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/matthiasmullie/path-converter/zipball/5e4b121c8b9f97c80835c1d878b0812ba1d607c9", - "reference": "5e4b121c8b9f97c80835c1d878b0812ba1d607c9", + "url": "https://api.github.com/repos/matthiasmullie/path-converter/zipball/e7d13b2c7e2f2268e1424aaed02085518afa02d9", + "reference": "e7d13b2c7e2f2268e1424aaed02085518afa02d9", "shasum": "" }, "require": { @@ -1718,7 +1721,7 @@ "paths", "relative" ], - "time": "2018-10-25T15:19:41+00:00" + "time": "2019-02-05T23:41:09+00:00" }, { "name": "myclabs/deep-copy", @@ -1932,12 +1935,12 @@ "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "cf16f630f2211d388b8d254bf2ea936c232b3cb4" + "reference": "93919e334b0cb304fb04429b4b3a3b1e1787c873" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cf16f630f2211d388b8d254bf2ea936c232b3cb4", - "reference": "cf16f630f2211d388b8d254bf2ea936c232b3cb4", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/93919e334b0cb304fb04429b4b3a3b1e1787c873", + "reference": "93919e334b0cb304fb04429b4b3a3b1e1787c873", "shasum": "" }, "require": { @@ -1977,7 +1980,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-01-16T08:49:07+00:00" + "time": "2020-01-27T20:01:09+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -2031,20 +2034,20 @@ "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "cbe1df668b3fe136bcc909126a0f529a78d4cbbc" + "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/cbe1df668b3fe136bcc909126a0f529a78d4cbbc", - "reference": "cbe1df668b3fe136bcc909126a0f529a78d4cbbc", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9", + "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" + "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" }, "require-dev": { "phpspec/phpspec": "^2.5 || ^3.2", @@ -2086,7 +2089,7 @@ "spy", "stub" ], - "time": "2019-12-22T21:05:45+00:00" + "time": "2020-01-20T15:57:02+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2166,7 +2169,7 @@ "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.3" }, "require-dev": { "phpunit/phpunit": "^7.1" @@ -2257,7 +2260,7 @@ "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.3" }, "require-dev": { "phpunit/phpunit": "^7.0" @@ -2307,7 +2310,7 @@ }, "require": { "ext-tokenizer": "*", - "php": "^7.1" + "php": "^7.3" }, "require-dev": { "phpunit/phpunit": "^7.0" @@ -2346,12 +2349,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c1f3abbf7ae96fa6491c5a25f8d5c4c57ff11d43" + "reference": "fc43f121f3c4ad93630bac6f9c86c23fb917b095" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c1f3abbf7ae96fa6491c5a25f8d5c4c57ff11d43", - "reference": "c1f3abbf7ae96fa6491c5a25f8d5c4c57ff11d43", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc43f121f3c4ad93630bac6f9c86c23fb917b095", + "reference": "fc43f121f3c4ad93630bac6f9c86c23fb917b095", "shasum": "" }, "require": { @@ -2422,7 +2425,7 @@ "testing", "xunit" ], - "time": "2020-01-17T12:47:07+00:00" + "time": "2020-01-23T15:43:47+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -2439,7 +2442,7 @@ "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.3" }, "require-dev": { "phpunit/phpunit": "^5.7 || ^6.0" @@ -2471,16 +2474,16 @@ }, { "name": "sebastian/comparator", - "version": "dev-master", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "99ca128ebc89c8b52a833cc8509d1a96f68c8029" + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/99ca128ebc89c8b52a833cc8509d1a96f68c8029", - "reference": "99ca128ebc89c8b52a833cc8509d1a96f68c8029", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", "shasum": "" }, "require": { @@ -2507,10 +2510,6 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -2522,6 +2521,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -2531,7 +2534,7 @@ "compare", "equality" ], - "time": "2020-01-17T12:00:41+00:00" + "time": "2018-07-12T15:12:46+00:00" }, { "name": "sebastian/diff", @@ -2539,25 +2542,25 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "cffa47fbd31d34858a8fae5235445af221689028" + "reference": "5c3c4d0229c311e88006f42307ad32082865dd31" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/cffa47fbd31d34858a8fae5235445af221689028", - "reference": "cffa47fbd31d34858a8fae5235445af221689028", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5c3c4d0229c311e88006f42307ad32082865dd31", + "reference": "5c3c4d0229c311e88006f42307ad32082865dd31", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", + "phpunit/phpunit": "^9.0", "symfony/process": "^4 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2587,7 +2590,7 @@ "unidiff", "unified diff" ], - "time": "2020-01-17T12:05:53+00:00" + "time": "2020-01-27T04:27:16+00:00" }, { "name": "sebastian/environment", @@ -2604,7 +2607,7 @@ "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.3" }, "require-dev": { "phpunit/phpunit": "^7.5" @@ -2644,16 +2647,16 @@ }, { "name": "sebastian/exporter", - "version": "dev-master", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "a20d741c53278346c3d06b11679f2ac11b514a42" + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/a20d741c53278346c3d06b11679f2ac11b514a42", - "reference": "a20d741c53278346c3d06b11679f2ac11b514a42", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", "shasum": "" }, "require": { @@ -2707,7 +2710,7 @@ "export", "exporter" ], - "time": "2020-01-17T12:16:05+00:00" + "time": "2019-09-14T09:02:43+00:00" }, { "name": "sebastian/global-state", @@ -2762,16 +2765,16 @@ }, { "name": "sebastian/object-enumerator", - "version": "dev-master", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "9b995602514d979119740cfc2f8b0a9ba5fa20f0" + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/9b995602514d979119740cfc2f8b0a9ba5fa20f0", - "reference": "9b995602514d979119740cfc2f8b0a9ba5fa20f0", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", "shasum": "" }, "require": { @@ -2805,7 +2808,7 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2020-01-17T12:21:33+00:00" + "time": "2017-08-03T12:35:26+00:00" }, { "name": "sebastian/object-reflector", @@ -2813,24 +2816,24 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "1df36c0abf55daf0c71d053c905b146b83c5cac4" + "reference": "d648d28a5bf69a919486da3b65ac2ae21554161a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1df36c0abf55daf0c71d053c905b146b83c5cac4", - "reference": "1df36c0abf55daf0c71d053c905b146b83c5cac4", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/d648d28a5bf69a919486da3b65ac2ae21554161a", + "reference": "d648d28a5bf69a919486da3b65ac2ae21554161a", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2850,7 +2853,7 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2020-01-17T12:24:06+00:00" + "time": "2020-01-21T06:14:20+00:00" }, { "name": "sebastian/recursion-context", @@ -2858,24 +2861,24 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "6cb3d7ee69cd8c5f89e35832e30a7ed478ec262f" + "reference": "b0995d4de9434e326de38cb2cbcbb7a0f813c5ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/6cb3d7ee69cd8c5f89e35832e30a7ed478ec262f", - "reference": "6cb3d7ee69cd8c5f89e35832e30a7ed478ec262f", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b0995d4de9434e326de38cb2cbcbb7a0f813c5ab", + "reference": "b0995d4de9434e326de38cb2cbcbb7a0f813c5ab", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2903,7 +2906,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2020-01-17T12:28:51+00:00" + "time": "2020-01-23T05:29:43+00:00" }, { "name": "sebastian/resource-operations", @@ -2920,7 +2923,7 @@ "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.3" }, "type": "library", "extra": { From 0ac4344d9f5aaca209505daa60f007fc5d5b6294 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 15:49:07 +0200 Subject: [PATCH 104/237] Updated go examples --- .../go/docs/examples/Avatars/get-browser.md | 54 +++++++------- .../docs/examples/Avatars/get-credit-card.md | 54 +++++++------- .../go/docs/examples/Avatars/get-favicon.md | 54 +++++++------- app/sdks/go/docs/examples/Avatars/get-flag.md | 54 +++++++------- .../go/docs/examples/Avatars/get-image.md | 54 +++++++------- app/sdks/go/docs/examples/Avatars/get-q-r.md | 54 +++++++------- .../examples/Database/create-collection.md | 54 +++++++------- .../docs/examples/Database/create-document.md | 54 +++++++------- .../examples/Database/delete-collection.md | 54 +++++++------- .../docs/examples/Database/delete-document.md | 54 +++++++------- .../docs/examples/Database/get-collection.md | 54 +++++++------- .../go/docs/examples/Database/get-document.md | 54 +++++++------- .../examples/Database/list-collections.md | 54 +++++++------- .../docs/examples/Database/list-documents.md | 54 +++++++------- .../examples/Database/update-collection.md | 54 +++++++------- .../docs/examples/Database/update-document.md | 54 +++++++------- .../go/docs/examples/Locale/get-continents.md | 54 +++++++------- .../docs/examples/Locale/get-countries-e-u.md | 54 +++++++------- .../examples/Locale/get-countries-phones.md | 54 +++++++------- .../go/docs/examples/Locale/get-countries.md | 54 +++++++------- .../go/docs/examples/Locale/get-currencies.md | 54 +++++++------- .../go/docs/examples/Locale/get-locale.md | 54 +++++++------- .../go/docs/examples/Storage/create-file.md | 54 +++++++------- .../go/docs/examples/Storage/delete-file.md | 54 +++++++------- .../examples/Storage/get-file-download.md | 54 +++++++------- .../docs/examples/Storage/get-file-preview.md | 54 +++++++------- .../go/docs/examples/Storage/get-file-view.md | 54 +++++++------- app/sdks/go/docs/examples/Storage/get-file.md | 54 +++++++------- .../go/docs/examples/Storage/list-files.md | 54 +++++++------- .../go/docs/examples/Storage/update-file.md | 54 +++++++------- .../examples/Teams/create-team-membership.md | 54 +++++++------- .../go/docs/examples/Teams/create-team.md | 54 +++++++------- .../examples/Teams/delete-team-membership.md | 54 +++++++------- .../go/docs/examples/Teams/delete-team.md | 54 +++++++------- .../examples/Teams/get-team-memberships.md | 54 +++++++------- app/sdks/go/docs/examples/Teams/get-team.md | 54 +++++++------- app/sdks/go/docs/examples/Teams/list-teams.md | 54 +++++++------- .../go/docs/examples/Teams/update-team.md | 54 +++++++------- .../go/docs/examples/Users/create-user.md | 54 +++++++------- .../examples/Users/delete-user-session.md | 54 +++++++------- .../examples/Users/delete-user-sessions.md | 54 +++++++------- .../go/docs/examples/Users/get-user-logs.md | 54 +++++++------- .../go/docs/examples/Users/get-user-prefs.md | 54 +++++++------- .../docs/examples/Users/get-user-sessions.md | 54 +++++++------- app/sdks/go/docs/examples/Users/get-user.md | 54 +++++++------- app/sdks/go/docs/examples/Users/list-users.md | 54 +++++++------- .../docs/examples/Users/update-user-prefs.md | 54 +++++++------- .../docs/examples/Users/update-user-status.md | 54 +++++++------- composer.lock | 70 +++++++++---------- 49 files changed, 1187 insertions(+), 1475 deletions(-) diff --git a/app/sdks/go/docs/examples/Avatars/get-browser.md b/app/sdks/go/docs/examples/Avatars/get-browser.md index 9628da910b..4e1f0b13c3 100644 --- a/app/sdks/go/docs/examples/Avatars/get-browser.md +++ b/app/sdks/go/docs/examples/Avatars/get-browser.md @@ -1,35 +1,29 @@ -# Avatars Examples +package main -## GetBrowser +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getbrowser +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetBrowser method and handle results - var res, err := srv.GetBrowser("aa") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client } -``` \ No newline at end of file + + // Call GetBrowser method and handle results + var res, err := srv.GetBrowser("aa") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-credit-card.md b/app/sdks/go/docs/examples/Avatars/get-credit-card.md index 488077cfc3..1ef37d9fe3 100644 --- a/app/sdks/go/docs/examples/Avatars/get-credit-card.md +++ b/app/sdks/go/docs/examples/Avatars/get-credit-card.md @@ -1,35 +1,29 @@ -# Avatars Examples +package main -## GetCreditCard +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getcreditcard +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetCreditCard method and handle results - var res, err := srv.GetCreditCard("amex") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client } -``` \ No newline at end of file + + // Call GetCreditCard method and handle results + var res, err := srv.GetCreditCard("amex") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-favicon.md b/app/sdks/go/docs/examples/Avatars/get-favicon.md index c235967d6b..f375a7bc6c 100644 --- a/app/sdks/go/docs/examples/Avatars/get-favicon.md +++ b/app/sdks/go/docs/examples/Avatars/get-favicon.md @@ -1,35 +1,29 @@ -# Avatars Examples +package main -## GetFavicon +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getfavicon +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetFavicon method and handle results - var res, err := srv.GetFavicon("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client } -``` \ No newline at end of file + + // Call GetFavicon method and handle results + var res, err := srv.GetFavicon("https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-flag.md b/app/sdks/go/docs/examples/Avatars/get-flag.md index 955c96c530..5658f5e1cc 100644 --- a/app/sdks/go/docs/examples/Avatars/get-flag.md +++ b/app/sdks/go/docs/examples/Avatars/get-flag.md @@ -1,35 +1,29 @@ -# Avatars Examples +package main -## GetFlag +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getflag +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetFlag method and handle results - var res, err := srv.GetFlag("af") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client } -``` \ No newline at end of file + + // Call GetFlag method and handle results + var res, err := srv.GetFlag("af") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-image.md b/app/sdks/go/docs/examples/Avatars/get-image.md index 11d1c6523d..1ab511eecf 100644 --- a/app/sdks/go/docs/examples/Avatars/get-image.md +++ b/app/sdks/go/docs/examples/Avatars/get-image.md @@ -1,35 +1,29 @@ -# Avatars Examples +package main -## GetImage +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getimage +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetImage method and handle results - var res, err := srv.GetImage("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client } -``` \ No newline at end of file + + // Call GetImage method and handle results + var res, err := srv.GetImage("https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-q-r.md b/app/sdks/go/docs/examples/Avatars/get-q-r.md index 0874c0e6be..14c54b494c 100644 --- a/app/sdks/go/docs/examples/Avatars/get-q-r.md +++ b/app/sdks/go/docs/examples/Avatars/get-q-r.md @@ -1,35 +1,29 @@ -# Avatars Examples +package main -## GetQR +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getqr +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &clt - } - - // Call GetQR method and handle results - var res, err := srv.GetQR("[TEXT]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client } -``` \ No newline at end of file + + // Call GetQR method and handle results + var res, err := srv.GetQR("[TEXT]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/create-collection.md b/app/sdks/go/docs/examples/Database/create-collection.md index 48e5977c60..57bd03cfd1 100644 --- a/app/sdks/go/docs/examples/Database/create-collection.md +++ b/app/sdks/go/docs/examples/Database/create-collection.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## CreateCollection +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-createcollection +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call CreateCollection method and handle results - var res, err := srv.CreateCollection("[NAME]", [], [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call CreateCollection method and handle results + var res, err := srv.CreateCollection("[NAME]", [], [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/create-document.md b/app/sdks/go/docs/examples/Database/create-document.md index ccaa02f578..b3c7818222 100644 --- a/app/sdks/go/docs/examples/Database/create-document.md +++ b/app/sdks/go/docs/examples/Database/create-document.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## CreateDocument +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-createdocument +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call CreateDocument method and handle results - var res, err := srv.CreateDocument("[COLLECTION_ID]", "{}", [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call CreateDocument method and handle results + var res, err := srv.CreateDocument("[COLLECTION_ID]", "{}", [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/delete-collection.md b/app/sdks/go/docs/examples/Database/delete-collection.md index 85928bde3b..a2c4056ce8 100644 --- a/app/sdks/go/docs/examples/Database/delete-collection.md +++ b/app/sdks/go/docs/examples/Database/delete-collection.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## DeleteCollection +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-deletecollection +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call DeleteCollection method and handle results - var res, err := srv.DeleteCollection("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call DeleteCollection method and handle results + var res, err := srv.DeleteCollection("[COLLECTION_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/delete-document.md b/app/sdks/go/docs/examples/Database/delete-document.md index 256a0abccb..69cde9fb0f 100644 --- a/app/sdks/go/docs/examples/Database/delete-document.md +++ b/app/sdks/go/docs/examples/Database/delete-document.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## DeleteDocument +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-deletedocument +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call DeleteDocument method and handle results - var res, err := srv.DeleteDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call DeleteDocument method and handle results + var res, err := srv.DeleteDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/get-collection.md b/app/sdks/go/docs/examples/Database/get-collection.md index 120ad0a19e..e60e590c14 100644 --- a/app/sdks/go/docs/examples/Database/get-collection.md +++ b/app/sdks/go/docs/examples/Database/get-collection.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## GetCollection +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getcollection +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call GetCollection method and handle results - var res, err := srv.GetCollection("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call GetCollection method and handle results + var res, err := srv.GetCollection("[COLLECTION_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/get-document.md b/app/sdks/go/docs/examples/Database/get-document.md index 8866442b6b..90fd6a2b76 100644 --- a/app/sdks/go/docs/examples/Database/get-document.md +++ b/app/sdks/go/docs/examples/Database/get-document.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## GetDocument +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getdocument +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call GetDocument method and handle results - var res, err := srv.GetDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call GetDocument method and handle results + var res, err := srv.GetDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/list-collections.md b/app/sdks/go/docs/examples/Database/list-collections.md index 1db6530df7..b6cc1830aa 100644 --- a/app/sdks/go/docs/examples/Database/list-collections.md +++ b/app/sdks/go/docs/examples/Database/list-collections.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## ListCollections +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-listcollections +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call ListCollections method and handle results - var res, err := srv.ListCollections() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call ListCollections method and handle results + var res, err := srv.ListCollections() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/list-documents.md b/app/sdks/go/docs/examples/Database/list-documents.md index 6c46ead8db..5f7aec3672 100644 --- a/app/sdks/go/docs/examples/Database/list-documents.md +++ b/app/sdks/go/docs/examples/Database/list-documents.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## ListDocuments +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-listdocuments +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call ListDocuments method and handle results - var res, err := srv.ListDocuments("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call ListDocuments method and handle results + var res, err := srv.ListDocuments("[COLLECTION_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/update-collection.md b/app/sdks/go/docs/examples/Database/update-collection.md index 7cf07ac2c0..79b1ab25b6 100644 --- a/app/sdks/go/docs/examples/Database/update-collection.md +++ b/app/sdks/go/docs/examples/Database/update-collection.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## UpdateCollection +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-updatecollection +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call UpdateCollection method and handle results - var res, err := srv.UpdateCollection("[COLLECTION_ID]", "[NAME]", [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call UpdateCollection method and handle results + var res, err := srv.UpdateCollection("[COLLECTION_ID]", "[NAME]", [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/update-document.md b/app/sdks/go/docs/examples/Database/update-document.md index 88f57eefa9..3ed43c454b 100644 --- a/app/sdks/go/docs/examples/Database/update-document.md +++ b/app/sdks/go/docs/examples/Database/update-document.md @@ -1,35 +1,29 @@ -# Database Examples +package main -## UpdateDocument +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-updatedocument +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &clt - } - - // Call UpdateDocument method and handle results - var res, err := srv.UpdateDocument("[COLLECTION_ID]", "[DOCUMENT_ID]", "{}", [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client } -``` \ No newline at end of file + + // Call UpdateDocument method and handle results + var res, err := srv.UpdateDocument("[COLLECTION_ID]", "[DOCUMENT_ID]", "{}", [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-continents.md b/app/sdks/go/docs/examples/Locale/get-continents.md index faeab3a977..d707b900c2 100644 --- a/app/sdks/go/docs/examples/Locale/get-continents.md +++ b/app/sdks/go/docs/examples/Locale/get-continents.md @@ -1,35 +1,29 @@ -# Locale Examples +package main -## GetContinents +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getcontinents +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetContinents method and handle results - var res, err := srv.GetContinents() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client } -``` \ No newline at end of file + + // Call GetContinents method and handle results + var res, err := srv.GetContinents() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-countries-e-u.md b/app/sdks/go/docs/examples/Locale/get-countries-e-u.md index ca8ed7ca48..f3f2146bee 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries-e-u.md +++ b/app/sdks/go/docs/examples/Locale/get-countries-e-u.md @@ -1,35 +1,29 @@ -# Locale Examples +package main -## GetCountriesEU +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getcountrieseu +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetCountriesEU method and handle results - var res, err := srv.GetCountriesEU() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client } -``` \ No newline at end of file + + // Call GetCountriesEU method and handle results + var res, err := srv.GetCountriesEU() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-countries-phones.md b/app/sdks/go/docs/examples/Locale/get-countries-phones.md index 8847258258..21a2d163b5 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries-phones.md +++ b/app/sdks/go/docs/examples/Locale/get-countries-phones.md @@ -1,35 +1,29 @@ -# Locale Examples +package main -## GetCountriesPhones +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getcountriesphones +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetCountriesPhones method and handle results - var res, err := srv.GetCountriesPhones() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client } -``` \ No newline at end of file + + // Call GetCountriesPhones method and handle results + var res, err := srv.GetCountriesPhones() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-countries.md b/app/sdks/go/docs/examples/Locale/get-countries.md index be286c1979..9f81721e70 100644 --- a/app/sdks/go/docs/examples/Locale/get-countries.md +++ b/app/sdks/go/docs/examples/Locale/get-countries.md @@ -1,35 +1,29 @@ -# Locale Examples +package main -## GetCountries +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getcountries +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetCountries method and handle results - var res, err := srv.GetCountries() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client } -``` \ No newline at end of file + + // Call GetCountries method and handle results + var res, err := srv.GetCountries() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-currencies.md b/app/sdks/go/docs/examples/Locale/get-currencies.md index fcbb679fd3..752a99de3c 100644 --- a/app/sdks/go/docs/examples/Locale/get-currencies.md +++ b/app/sdks/go/docs/examples/Locale/get-currencies.md @@ -1,35 +1,29 @@ -# Locale Examples +package main -## GetCurrencies +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getcurrencies +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetCurrencies method and handle results - var res, err := srv.GetCurrencies() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client } -``` \ No newline at end of file + + // Call GetCurrencies method and handle results + var res, err := srv.GetCurrencies() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-locale.md b/app/sdks/go/docs/examples/Locale/get-locale.md index 67cfcdccc9..d8e8ed1127 100644 --- a/app/sdks/go/docs/examples/Locale/get-locale.md +++ b/app/sdks/go/docs/examples/Locale/get-locale.md @@ -1,35 +1,29 @@ -# Locale Examples +package main -## GetLocale +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getlocale +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &clt - } - - // Call GetLocale method and handle results - var res, err := srv.GetLocale() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client } -``` \ No newline at end of file + + // Call GetLocale method and handle results + var res, err := srv.GetLocale() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/create-file.md b/app/sdks/go/docs/examples/Storage/create-file.md index 1d0bf35af8..bb55c63d3d 100644 --- a/app/sdks/go/docs/examples/Storage/create-file.md +++ b/app/sdks/go/docs/examples/Storage/create-file.md @@ -1,35 +1,29 @@ -# Storage Examples +package main -## CreateFile +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-createfile +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call CreateFile method and handle results - var res, err := srv.CreateFile(file, [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client } -``` \ No newline at end of file + + // Call CreateFile method and handle results + var res, err := srv.CreateFile(file, [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/delete-file.md b/app/sdks/go/docs/examples/Storage/delete-file.md index c6ecabdf99..e2eea09d9a 100644 --- a/app/sdks/go/docs/examples/Storage/delete-file.md +++ b/app/sdks/go/docs/examples/Storage/delete-file.md @@ -1,35 +1,29 @@ -# Storage Examples +package main -## DeleteFile +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-deletefile +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call DeleteFile method and handle results - var res, err := srv.DeleteFile("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client } -``` \ No newline at end of file + + // Call DeleteFile method and handle results + var res, err := srv.DeleteFile("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/get-file-download.md b/app/sdks/go/docs/examples/Storage/get-file-download.md index 4513337425..e8c6343391 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-download.md +++ b/app/sdks/go/docs/examples/Storage/get-file-download.md @@ -1,35 +1,29 @@ -# Storage Examples +package main -## GetFileDownload +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getfiledownload +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call GetFileDownload method and handle results - var res, err := srv.GetFileDownload("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client } -``` \ No newline at end of file + + // Call GetFileDownload method and handle results + var res, err := srv.GetFileDownload("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/get-file-preview.md b/app/sdks/go/docs/examples/Storage/get-file-preview.md index a30a271d93..6fa084376b 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-preview.md +++ b/app/sdks/go/docs/examples/Storage/get-file-preview.md @@ -1,35 +1,29 @@ -# Storage Examples +package main -## GetFilePreview +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getfilepreview +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call GetFilePreview method and handle results - var res, err := srv.GetFilePreview("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client } -``` \ No newline at end of file + + // Call GetFilePreview method and handle results + var res, err := srv.GetFilePreview("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/get-file-view.md b/app/sdks/go/docs/examples/Storage/get-file-view.md index 7782cb3b1e..6c664bcb24 100644 --- a/app/sdks/go/docs/examples/Storage/get-file-view.md +++ b/app/sdks/go/docs/examples/Storage/get-file-view.md @@ -1,35 +1,29 @@ -# Storage Examples +package main -## GetFileView +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getfileview +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call GetFileView method and handle results - var res, err := srv.GetFileView("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client } -``` \ No newline at end of file + + // Call GetFileView method and handle results + var res, err := srv.GetFileView("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/get-file.md b/app/sdks/go/docs/examples/Storage/get-file.md index 0e7bff0952..766b3dc8da 100644 --- a/app/sdks/go/docs/examples/Storage/get-file.md +++ b/app/sdks/go/docs/examples/Storage/get-file.md @@ -1,35 +1,29 @@ -# Storage Examples +package main -## GetFile +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getfile +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call GetFile method and handle results - var res, err := srv.GetFile("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client } -``` \ No newline at end of file + + // Call GetFile method and handle results + var res, err := srv.GetFile("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/list-files.md b/app/sdks/go/docs/examples/Storage/list-files.md index 7c5d800f6e..654aba9a8b 100644 --- a/app/sdks/go/docs/examples/Storage/list-files.md +++ b/app/sdks/go/docs/examples/Storage/list-files.md @@ -1,35 +1,29 @@ -# Storage Examples +package main -## ListFiles +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-listfiles +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call ListFiles method and handle results - var res, err := srv.ListFiles() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client } -``` \ No newline at end of file + + // Call ListFiles method and handle results + var res, err := srv.ListFiles() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/update-file.md b/app/sdks/go/docs/examples/Storage/update-file.md index 01b44bc620..b9d6b981de 100644 --- a/app/sdks/go/docs/examples/Storage/update-file.md +++ b/app/sdks/go/docs/examples/Storage/update-file.md @@ -1,35 +1,29 @@ -# Storage Examples +package main -## UpdateFile +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-updatefile +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &clt - } - - // Call UpdateFile method and handle results - var res, err := srv.UpdateFile("[FILE_ID]", [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client } -``` \ No newline at end of file + + // Call UpdateFile method and handle results + var res, err := srv.UpdateFile("[FILE_ID]", [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/create-team-membership.md b/app/sdks/go/docs/examples/Teams/create-team-membership.md index 9d74105ec5..894c4aef5b 100644 --- a/app/sdks/go/docs/examples/Teams/create-team-membership.md +++ b/app/sdks/go/docs/examples/Teams/create-team-membership.md @@ -1,35 +1,29 @@ -# Teams Examples +package main -## CreateTeamMembership +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-createteammembership +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call CreateTeamMembership method and handle results - var res, err := srv.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client } -``` \ No newline at end of file + + // Call CreateTeamMembership method and handle results + var res, err := srv.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/create-team.md b/app/sdks/go/docs/examples/Teams/create-team.md index 7922f904f8..c8b4ee95e6 100644 --- a/app/sdks/go/docs/examples/Teams/create-team.md +++ b/app/sdks/go/docs/examples/Teams/create-team.md @@ -1,35 +1,29 @@ -# Teams Examples +package main -## CreateTeam +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-createteam +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call CreateTeam method and handle results - var res, err := srv.CreateTeam("[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client } -``` \ No newline at end of file + + // Call CreateTeam method and handle results + var res, err := srv.CreateTeam("[NAME]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/delete-team-membership.md b/app/sdks/go/docs/examples/Teams/delete-team-membership.md index 80cdc936b0..1f35436bbc 100644 --- a/app/sdks/go/docs/examples/Teams/delete-team-membership.md +++ b/app/sdks/go/docs/examples/Teams/delete-team-membership.md @@ -1,35 +1,29 @@ -# Teams Examples +package main -## DeleteTeamMembership +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-deleteteammembership +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call DeleteTeamMembership method and handle results - var res, err := srv.DeleteTeamMembership("[TEAM_ID]", "[INVITE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client } -``` \ No newline at end of file + + // Call DeleteTeamMembership method and handle results + var res, err := srv.DeleteTeamMembership("[TEAM_ID]", "[INVITE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/delete-team.md b/app/sdks/go/docs/examples/Teams/delete-team.md index fa15cce6d6..91a52df484 100644 --- a/app/sdks/go/docs/examples/Teams/delete-team.md +++ b/app/sdks/go/docs/examples/Teams/delete-team.md @@ -1,35 +1,29 @@ -# Teams Examples +package main -## DeleteTeam +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-deleteteam +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call DeleteTeam method and handle results - var res, err := srv.DeleteTeam("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client } -``` \ No newline at end of file + + // Call DeleteTeam method and handle results + var res, err := srv.DeleteTeam("[TEAM_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/get-team-memberships.md b/app/sdks/go/docs/examples/Teams/get-team-memberships.md index b945ec493e..3f5decbc90 100644 --- a/app/sdks/go/docs/examples/Teams/get-team-memberships.md +++ b/app/sdks/go/docs/examples/Teams/get-team-memberships.md @@ -1,35 +1,29 @@ -# Teams Examples +package main -## GetTeamMemberships +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getteammemberships +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call GetTeamMemberships method and handle results - var res, err := srv.GetTeamMemberships("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client } -``` \ No newline at end of file + + // Call GetTeamMemberships method and handle results + var res, err := srv.GetTeamMemberships("[TEAM_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/get-team.md b/app/sdks/go/docs/examples/Teams/get-team.md index 8418da4d14..117dcbf94c 100644 --- a/app/sdks/go/docs/examples/Teams/get-team.md +++ b/app/sdks/go/docs/examples/Teams/get-team.md @@ -1,35 +1,29 @@ -# Teams Examples +package main -## GetTeam +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getteam +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call GetTeam method and handle results - var res, err := srv.GetTeam("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client } -``` \ No newline at end of file + + // Call GetTeam method and handle results + var res, err := srv.GetTeam("[TEAM_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/list-teams.md b/app/sdks/go/docs/examples/Teams/list-teams.md index 089daf4697..71b5fb04ea 100644 --- a/app/sdks/go/docs/examples/Teams/list-teams.md +++ b/app/sdks/go/docs/examples/Teams/list-teams.md @@ -1,35 +1,29 @@ -# Teams Examples +package main -## ListTeams +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-listteams +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call ListTeams method and handle results - var res, err := srv.ListTeams() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client } -``` \ No newline at end of file + + // Call ListTeams method and handle results + var res, err := srv.ListTeams() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/update-team.md b/app/sdks/go/docs/examples/Teams/update-team.md index d32a67800a..33de23cdd6 100644 --- a/app/sdks/go/docs/examples/Teams/update-team.md +++ b/app/sdks/go/docs/examples/Teams/update-team.md @@ -1,35 +1,29 @@ -# Teams Examples +package main -## UpdateTeam +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-updateteam +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &clt - } - - // Call UpdateTeam method and handle results - var res, err := srv.UpdateTeam("[TEAM_ID]", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client } -``` \ No newline at end of file + + // Call UpdateTeam method and handle results + var res, err := srv.UpdateTeam("[TEAM_ID]", "[NAME]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/create-user.md b/app/sdks/go/docs/examples/Users/create-user.md index b790840277..0ad8fcfbb3 100644 --- a/app/sdks/go/docs/examples/Users/create-user.md +++ b/app/sdks/go/docs/examples/Users/create-user.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## CreateUser +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-createuser +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call CreateUser method and handle results - var res, err := srv.CreateUser("email@example.com", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call CreateUser method and handle results + var res, err := srv.CreateUser("email@example.com", "password") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/delete-user-session.md b/app/sdks/go/docs/examples/Users/delete-user-session.md index 6bc880b88a..2e63b205e3 100644 --- a/app/sdks/go/docs/examples/Users/delete-user-session.md +++ b/app/sdks/go/docs/examples/Users/delete-user-session.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## DeleteUserSession +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-deleteusersession +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call DeleteUserSession method and handle results - var res, err := srv.DeleteUserSession("[USER_ID]", "[SESSION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call DeleteUserSession method and handle results + var res, err := srv.DeleteUserSession("[USER_ID]", "[SESSION_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/delete-user-sessions.md b/app/sdks/go/docs/examples/Users/delete-user-sessions.md index 8d36d951d5..eb08458c9f 100644 --- a/app/sdks/go/docs/examples/Users/delete-user-sessions.md +++ b/app/sdks/go/docs/examples/Users/delete-user-sessions.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## DeleteUserSessions +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-deleteusersessions +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call DeleteUserSessions method and handle results - var res, err := srv.DeleteUserSessions("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call DeleteUserSessions method and handle results + var res, err := srv.DeleteUserSessions("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/get-user-logs.md b/app/sdks/go/docs/examples/Users/get-user-logs.md index 227d123413..a17455f86a 100644 --- a/app/sdks/go/docs/examples/Users/get-user-logs.md +++ b/app/sdks/go/docs/examples/Users/get-user-logs.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## GetUserLogs +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getuserlogs +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call GetUserLogs method and handle results - var res, err := srv.GetUserLogs("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call GetUserLogs method and handle results + var res, err := srv.GetUserLogs("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/get-user-prefs.md b/app/sdks/go/docs/examples/Users/get-user-prefs.md index fc9515a4af..e161a3694c 100644 --- a/app/sdks/go/docs/examples/Users/get-user-prefs.md +++ b/app/sdks/go/docs/examples/Users/get-user-prefs.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## GetUserPrefs +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getuserprefs +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call GetUserPrefs method and handle results - var res, err := srv.GetUserPrefs("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call GetUserPrefs method and handle results + var res, err := srv.GetUserPrefs("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/get-user-sessions.md b/app/sdks/go/docs/examples/Users/get-user-sessions.md index 99dd8b3fff..d88d75e39f 100644 --- a/app/sdks/go/docs/examples/Users/get-user-sessions.md +++ b/app/sdks/go/docs/examples/Users/get-user-sessions.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## GetUserSessions +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getusersessions +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call GetUserSessions method and handle results - var res, err := srv.GetUserSessions("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call GetUserSessions method and handle results + var res, err := srv.GetUserSessions("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/get-user.md b/app/sdks/go/docs/examples/Users/get-user.md index d61430718b..9072765f96 100644 --- a/app/sdks/go/docs/examples/Users/get-user.md +++ b/app/sdks/go/docs/examples/Users/get-user.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## GetUser +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-getuser +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call GetUser method and handle results - var res, err := srv.GetUser("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call GetUser method and handle results + var res, err := srv.GetUser("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/list-users.md b/app/sdks/go/docs/examples/Users/list-users.md index 8332347ba8..0c85dafd3b 100644 --- a/app/sdks/go/docs/examples/Users/list-users.md +++ b/app/sdks/go/docs/examples/Users/list-users.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## ListUsers +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-listusers +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call ListUsers method and handle results - var res, err := srv.ListUsers() - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call ListUsers method and handle results + var res, err := srv.ListUsers() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/update-user-prefs.md b/app/sdks/go/docs/examples/Users/update-user-prefs.md index e48384abbf..333c19a4e6 100644 --- a/app/sdks/go/docs/examples/Users/update-user-prefs.md +++ b/app/sdks/go/docs/examples/Users/update-user-prefs.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## UpdateUserPrefs +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-updateuserprefs +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call UpdateUserPrefs method and handle results - var res, err := srv.UpdateUserPrefs("[USER_ID]", "") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call UpdateUserPrefs method and handle results + var res, err := srv.UpdateUserPrefs("[USER_ID]", "") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/update-user-status.md b/app/sdks/go/docs/examples/Users/update-user-status.md index d5570ca041..914f62dc25 100644 --- a/app/sdks/go/docs/examples/Users/update-user-status.md +++ b/app/sdks/go/docs/examples/Users/update-user-status.md @@ -1,35 +1,29 @@ -# Users Examples +package main -## UpdateUserStatus +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) -```go - package appwrite-updateuserstatus +func main() { + // Create a Client + var client := appwrite.Client{} - import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" - ) + // Set Client required headers + client.SetProject("") + client.SetKey("") - func main() { - // Create a Client - var clt := appwrite.Client{} - - // Set Client required headers - clt.SetProject("") - clt.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &clt - } - - // Call UpdateUserStatus method and handle results - var res, err := srv.UpdateUserStatus("[USER_ID]", "1") - if err != nil { - panic(err) - } - - fmt.Println(res) + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client } -``` \ No newline at end of file + + // Call UpdateUserStatus method and handle results + var res, err := srv.UpdateUserStatus("[USER_ID]", "1") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index d6a1723665..c5e3bf3d9d 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "16e06a55edd4a7f1336249c03f0612080985a035" + "reference": "25dd3295fa5e1fd7877bd71539eadcde42ff55cf" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T10:11:48+00:00" + "time": "2020-01-28T13:46:34+00:00" }, { "name": "doctrine/instantiator", @@ -2538,29 +2538,29 @@ }, { "name": "sebastian/diff", - "version": "dev-master", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "5c3c4d0229c311e88006f42307ad32082865dd31" + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5c3c4d0229c311e88006f42307ad32082865dd31", - "reference": "5c3c4d0229c311e88006f42307ad32082865dd31", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", "shasum": "" }, "require": { - "php": "^7.3" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^9.0", - "symfony/process": "^4 || ^5" + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2573,13 +2573,13 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], "description": "Diff implementation", @@ -2590,7 +2590,7 @@ "unidiff", "unified diff" ], - "time": "2020-01-27T04:27:16+00:00" + "time": "2019-02-04T06:01:07+00:00" }, { "name": "sebastian/environment", @@ -2812,28 +2812,28 @@ }, { "name": "sebastian/object-reflector", - "version": "dev-master", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "d648d28a5bf69a919486da3b65ac2ae21554161a" + "reference": "773f97c67f28de00d397be301821b06708fca0be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/d648d28a5bf69a919486da3b65ac2ae21554161a", - "reference": "d648d28a5bf69a919486da3b65ac2ae21554161a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", "shasum": "" }, "require": { - "php": "^7.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "1.1-dev" } }, "autoload": { @@ -2853,32 +2853,32 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2020-01-21T06:14:20+00:00" + "time": "2017-03-29T09:07:27+00:00" }, { "name": "sebastian/recursion-context", - "version": "dev-master", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "b0995d4de9434e326de38cb2cbcbb7a0f813c5ab" + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b0995d4de9434e326de38cb2cbcbb7a0f813c5ab", - "reference": "b0995d4de9434e326de38cb2cbcbb7a0f813c5ab", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", "shasum": "" }, "require": { - "php": "^7.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -2891,14 +2891,14 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" @@ -2906,7 +2906,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2020-01-23T05:29:43+00:00" + "time": "2017-03-03T06:23:57+00:00" }, { "name": "sebastian/resource-operations", From 3560bbebde480b8efbaffec798996edfd1c79b37 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 16:21:02 +0200 Subject: [PATCH 105/237] Updated Go --- app/sdks/go/LICENSE | 12 -- app/sdks/go/README.md | 24 --- app/sdks/go/avatars.go | 103 ------------ app/sdks/go/client.go | 119 ------------- app/sdks/go/database.go | 159 ------------------ .../go/docs/examples/Avatars/get-browser.md | 29 ---- .../docs/examples/Avatars/get-credit-card.md | 29 ---- .../go/docs/examples/Avatars/get-favicon.md | 29 ---- app/sdks/go/docs/examples/Avatars/get-flag.md | 29 ---- .../go/docs/examples/Avatars/get-image.md | 29 ---- app/sdks/go/docs/examples/Avatars/get-q-r.md | 29 ---- .../examples/Database/create-collection.md | 29 ---- .../docs/examples/Database/create-document.md | 29 ---- .../examples/Database/delete-collection.md | 29 ---- .../docs/examples/Database/delete-document.md | 29 ---- .../docs/examples/Database/get-collection.md | 29 ---- .../go/docs/examples/Database/get-document.md | 29 ---- .../examples/Database/list-collections.md | 29 ---- .../docs/examples/Database/list-documents.md | 29 ---- .../examples/Database/update-collection.md | 29 ---- .../docs/examples/Database/update-document.md | 29 ---- .../go/docs/examples/Locale/get-continents.md | 29 ---- .../docs/examples/Locale/get-countries-e-u.md | 29 ---- .../examples/Locale/get-countries-phones.md | 29 ---- .../go/docs/examples/Locale/get-countries.md | 29 ---- .../go/docs/examples/Locale/get-currencies.md | 29 ---- .../go/docs/examples/Locale/get-locale.md | 29 ---- .../go/docs/examples/Storage/create-file.md | 29 ---- .../go/docs/examples/Storage/delete-file.md | 29 ---- .../examples/Storage/get-file-download.md | 29 ---- .../docs/examples/Storage/get-file-preview.md | 29 ---- .../go/docs/examples/Storage/get-file-view.md | 29 ---- app/sdks/go/docs/examples/Storage/get-file.md | 29 ---- .../go/docs/examples/Storage/list-files.md | 29 ---- .../go/docs/examples/Storage/update-file.md | 29 ---- .../examples/Teams/create-team-membership.md | 29 ---- .../go/docs/examples/Teams/create-team.md | 29 ---- .../examples/Teams/delete-team-membership.md | 29 ---- .../go/docs/examples/Teams/delete-team.md | 29 ---- .../examples/Teams/get-team-memberships.md | 29 ---- app/sdks/go/docs/examples/Teams/get-team.md | 29 ---- app/sdks/go/docs/examples/Teams/list-teams.md | 29 ---- .../go/docs/examples/Teams/update-team.md | 29 ---- .../go/docs/examples/Users/create-user.md | 29 ---- .../examples/Users/delete-user-session.md | 29 ---- .../examples/Users/delete-user-sessions.md | 29 ---- .../go/docs/examples/Users/get-user-logs.md | 29 ---- .../go/docs/examples/Users/get-user-prefs.md | 29 ---- .../docs/examples/Users/get-user-sessions.md | 29 ---- app/sdks/go/docs/examples/Users/get-user.md | 29 ---- app/sdks/go/docs/examples/Users/list-users.md | 29 ---- .../docs/examples/Users/update-user-prefs.md | 29 ---- .../docs/examples/Users/update-user-status.md | 29 ---- app/sdks/go/locale.go | 80 --------- app/sdks/go/main.go | 6 - app/sdks/go/storage.go | 126 -------------- app/sdks/go/teams.go | 132 --------------- app/sdks/go/users.go | 130 -------------- app/sdks/go/utils.go | 36 ---- 59 files changed, 2319 deletions(-) delete mode 100644 app/sdks/go/LICENSE delete mode 100644 app/sdks/go/README.md delete mode 100644 app/sdks/go/avatars.go delete mode 100644 app/sdks/go/client.go delete mode 100644 app/sdks/go/database.go delete mode 100644 app/sdks/go/docs/examples/Avatars/get-browser.md delete mode 100644 app/sdks/go/docs/examples/Avatars/get-credit-card.md delete mode 100644 app/sdks/go/docs/examples/Avatars/get-favicon.md delete mode 100644 app/sdks/go/docs/examples/Avatars/get-flag.md delete mode 100644 app/sdks/go/docs/examples/Avatars/get-image.md delete mode 100644 app/sdks/go/docs/examples/Avatars/get-q-r.md delete mode 100644 app/sdks/go/docs/examples/Database/create-collection.md delete mode 100644 app/sdks/go/docs/examples/Database/create-document.md delete mode 100644 app/sdks/go/docs/examples/Database/delete-collection.md delete mode 100644 app/sdks/go/docs/examples/Database/delete-document.md delete mode 100644 app/sdks/go/docs/examples/Database/get-collection.md delete mode 100644 app/sdks/go/docs/examples/Database/get-document.md delete mode 100644 app/sdks/go/docs/examples/Database/list-collections.md delete mode 100644 app/sdks/go/docs/examples/Database/list-documents.md delete mode 100644 app/sdks/go/docs/examples/Database/update-collection.md delete mode 100644 app/sdks/go/docs/examples/Database/update-document.md delete mode 100644 app/sdks/go/docs/examples/Locale/get-continents.md delete mode 100644 app/sdks/go/docs/examples/Locale/get-countries-e-u.md delete mode 100644 app/sdks/go/docs/examples/Locale/get-countries-phones.md delete mode 100644 app/sdks/go/docs/examples/Locale/get-countries.md delete mode 100644 app/sdks/go/docs/examples/Locale/get-currencies.md delete mode 100644 app/sdks/go/docs/examples/Locale/get-locale.md delete mode 100644 app/sdks/go/docs/examples/Storage/create-file.md delete mode 100644 app/sdks/go/docs/examples/Storage/delete-file.md delete mode 100644 app/sdks/go/docs/examples/Storage/get-file-download.md delete mode 100644 app/sdks/go/docs/examples/Storage/get-file-preview.md delete mode 100644 app/sdks/go/docs/examples/Storage/get-file-view.md delete mode 100644 app/sdks/go/docs/examples/Storage/get-file.md delete mode 100644 app/sdks/go/docs/examples/Storage/list-files.md delete mode 100644 app/sdks/go/docs/examples/Storage/update-file.md delete mode 100644 app/sdks/go/docs/examples/Teams/create-team-membership.md delete mode 100644 app/sdks/go/docs/examples/Teams/create-team.md delete mode 100644 app/sdks/go/docs/examples/Teams/delete-team-membership.md delete mode 100644 app/sdks/go/docs/examples/Teams/delete-team.md delete mode 100644 app/sdks/go/docs/examples/Teams/get-team-memberships.md delete mode 100644 app/sdks/go/docs/examples/Teams/get-team.md delete mode 100644 app/sdks/go/docs/examples/Teams/list-teams.md delete mode 100644 app/sdks/go/docs/examples/Teams/update-team.md delete mode 100644 app/sdks/go/docs/examples/Users/create-user.md delete mode 100644 app/sdks/go/docs/examples/Users/delete-user-session.md delete mode 100644 app/sdks/go/docs/examples/Users/delete-user-sessions.md delete mode 100644 app/sdks/go/docs/examples/Users/get-user-logs.md delete mode 100644 app/sdks/go/docs/examples/Users/get-user-prefs.md delete mode 100644 app/sdks/go/docs/examples/Users/get-user-sessions.md delete mode 100644 app/sdks/go/docs/examples/Users/get-user.md delete mode 100644 app/sdks/go/docs/examples/Users/list-users.md delete mode 100644 app/sdks/go/docs/examples/Users/update-user-prefs.md delete mode 100644 app/sdks/go/docs/examples/Users/update-user-status.md delete mode 100644 app/sdks/go/locale.go delete mode 100644 app/sdks/go/main.go delete mode 100644 app/sdks/go/storage.go delete mode 100644 app/sdks/go/teams.go delete mode 100644 app/sdks/go/users.go delete mode 100644 app/sdks/go/utils.go diff --git a/app/sdks/go/LICENSE b/app/sdks/go/LICENSE deleted file mode 100644 index fc7c051a91..0000000000 --- a/app/sdks/go/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/sdks/go/README.md b/app/sdks/go/README.md deleted file mode 100644 index 35fd446507..0000000000 --- a/app/sdks/go/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Appwrite SDK for Go - -![License](https://img.shields.io/github/license/appwrite/sdk-for-go.svg?v=1) -![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) - -**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.** - -Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) - - - -![Appwrite](https://appwrite.io/images/github.png) - -## Installation - -To install using `go get`: - -```bash -go get github.com/appwrite/sdk-for-go -``` - -## License - -Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/go/avatars.go b/app/sdks/go/avatars.go deleted file mode 100644 index 286f644f8d..0000000000 --- a/app/sdks/go/avatars.go +++ /dev/null @@ -1,103 +0,0 @@ -package appwrite - -import ( - "strings" -) - -// Avatars service -type Avatars struct { - client *Client -} - -// GetBrowser you can use this endpoint to show different browser icons to -// your users. The code argument receives the browser code as it appears in -// your user /account/sessions endpoint. Use width, height and quality -// arguments to change the output settings. -func (srv *Avatars) GetBrowser(Code string, Width int, Height int, Quality int) (map[string]interface{}, error) { - r := strings.NewReplacer("{code}", Code) - path := r.Replace("/avatars/browsers/{code}") - - params := map[string]interface{}{ - "width": Width, - "height": Height, - "quality": Quality, - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetCreditCard need to display your users with your billing method or their -// payment methods? The credit card endpoint will return you the icon of the -// credit card provider you need. Use width, height and quality arguments to -// change the output settings. -func (srv *Avatars) GetCreditCard(Code string, Width int, Height int, Quality int) (map[string]interface{}, error) { - r := strings.NewReplacer("{code}", Code) - path := r.Replace("/avatars/credit-cards/{code}") - - params := map[string]interface{}{ - "width": Width, - "height": Height, - "quality": Quality, - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetFavicon use this endpoint to fetch the favorite icon (AKA favicon) of a -// any remote website URL. -func (srv *Avatars) GetFavicon(Url string) (map[string]interface{}, error) { - path := "/avatars/favicon" - - params := map[string]interface{}{ - "url": Url, - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetFlag you can use this endpoint to show different country flags icons to -// your users. The code argument receives the 2 letter country code. Use -// width, height and quality arguments to change the output settings. -func (srv *Avatars) GetFlag(Code string, Width int, Height int, Quality int) (map[string]interface{}, error) { - r := strings.NewReplacer("{code}", Code) - path := r.Replace("/avatars/flags/{code}") - - params := map[string]interface{}{ - "width": Width, - "height": Height, - "quality": Quality, - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetImage use this endpoint to fetch a remote image URL and crop it to any -// image size you want. This endpoint is very useful if you need to crop and -// display remote images in your app or in case you want to make sure a 3rd -// party image is properly served using a TLS protocol. -func (srv *Avatars) GetImage(Url string, Width int, Height int) (map[string]interface{}, error) { - path := "/avatars/image" - - params := map[string]interface{}{ - "url": Url, - "width": Width, - "height": Height, - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetQR converts a given plain text to a QR code image. You can use the query -// parameters to change the size and style of the resulting image. -func (srv *Avatars) GetQR(Text string, Size int, Margin int, Download int) (map[string]interface{}, error) { - path := "/avatars/qr" - - params := map[string]interface{}{ - "text": Text, - "size": Size, - "margin": Margin, - "download": Download, - } - - return srv.client.Call("GET", path, nil, params) -} diff --git a/app/sdks/go/client.go b/app/sdks/go/client.go deleted file mode 100644 index 94f2546cff..0000000000 --- a/app/sdks/go/client.go +++ /dev/null @@ -1,119 +0,0 @@ -package appwrite - -import ( - "encoding/json" - "io/ioutil" - "net/http" - "net/url" - "strings" -) - -// Client is the client struct to access Appwrite services -type Client struct { - client *http.Client - endpoint string - headers map[string]string - selfSigned bool -} - -// SetEndpoint sets the default endpoint to which the Client connects to -func (clt *Client) SetEndpoint(endpoint string) { - clt.endpoint = endpoint -} - -// SetSelfSigned sets the condition that specify if the Client should allow connections to a server using a self-signed certificate -func (clt *Client) SetSelfSigned(status bool) { - clt.selfSigned = status -} - -// AddHeader add a new custom header that the Client should send on each request -func (clt *Client) AddHeader(key string, value string) { - clt.headers[key] = value -} - -// SetProjectHeader add the 'X-Appwrite-Project' header for the Client. Your Appwrite project ID -func (clt *Client) SetProjectHeader(value string) { - clt.headers["X-Appwrite-Project"] = value -} - -// SetKeyHeader add the 'X-Appwrite-Key' header for the Client. Your Appwrite project secret key -func (clt *Client) SetKeyHeader(value string) { - clt.headers["X-Appwrite-Key"] = value -} - -// SetLocaleHeader add the 'X-Appwrite-Locale' header for the Client. -func (clt *Client) SetLocaleHeader(value string) { - clt.headers["X-Appwrite-Locale"] = value -} - -// SetModeHeader add the 'X-Appwrite-Mode' header for the Client. -func (clt *Client) SetModeHeader(value string) { - clt.headers["X-Appwrite-Mode"] = value -} - -// Call an API using Client -func (clt *Client) Call(method string, path string, headers map[string]interface{}, params map[string]interface{}) (map[string]interface{}, error) { - if clt.client == nil { - // Create HTTP client - clt.client = &http.Client{} - } - - if clt.selfSigned { - // Allow self signed requests - } - - urlPath := clt.endpoint + path - isGet := strings.ToUpper(method) == "GET" - - var reqBody *strings.Reader - if !isGet { - frm := url.Values{} - for key, val := range params { - frm.Add(key, ToString(val)) - } - reqBody = strings.NewReader(frm.Encode()) - } - - // Create and modify HTTP request before sending - req, err := http.NewRequest(method, urlPath, reqBody) - if err != nil { - return nil, err - } - - // Set Client headers - for key, val := range clt.headers { - req.Header.Set(key, ToString(val)) - } - - // Set Custom headers - for key, val := range headers { - req.Header.Set(key, ToString(val)) - } - - if isGet { - q := req.URL.Query() - for key, val := range params { - q.Add(key, ToString(val)) - } - req.URL.RawQuery = q.Encode() - } - - // Make request - response, err := clt.client.Do(req) - if err != nil { - return nil, err - } - - // Handle response - defer response.Body.Close() - - responseData, err := ioutil.ReadAll(response.Body) - if err != nil { - return nil, err - } - - var jsonResponse map[string]interface{} - json.Unmarshal(responseData, &jsonResponse) - - return jsonResponse, nil -} diff --git a/app/sdks/go/database.go b/app/sdks/go/database.go deleted file mode 100644 index b1e58e746b..0000000000 --- a/app/sdks/go/database.go +++ /dev/null @@ -1,159 +0,0 @@ -package appwrite - -import ( - "strings" -) - -// Database service -type Database struct { - client *Client -} - -// ListCollections get a list of all the user collections. You can use the -// query params to filter your results. On admin mode, this endpoint will -// return a list of all of the project collections. [Learn more about -// different API modes](/docs/admin). -func (srv *Database) ListCollections(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { - path := "/database" - - params := map[string]interface{}{ - "search": Search, - "limit": Limit, - "offset": Offset, - "orderType": OrderType, - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateCollection create a new Collection. -func (srv *Database) CreateCollection(Name string, Read []interface{}, Write []interface{}, Rules []interface{}) (map[string]interface{}, error) { - path := "/database" - - params := map[string]interface{}{ - "name": Name, - "read": Read, - "write": Write, - "rules": Rules, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetCollection get collection by its unique ID. This endpoint response -// returns a JSON object with the collection metadata. -func (srv *Database) GetCollection(CollectionId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateCollection update collection by its unique ID. -func (srv *Database) UpdateCollection(CollectionId string, Name string, Read []interface{}, Write []interface{}, Rules []interface{}) (map[string]interface{}, error) { - r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}") - - params := map[string]interface{}{ - "name": Name, - "read": Read, - "write": Write, - "rules": Rules, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// DeleteCollection delete a collection by its unique ID. Only users with -// write permissions have access to delete this resource. -func (srv *Database) DeleteCollection(CollectionId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// ListDocuments get a list of all the user documents. You can use the query -// params to filter your results. On admin mode, this endpoint will return a -// list of all of the project documents. [Learn more about different API -// modes](/docs/admin). -func (srv *Database) ListDocuments(CollectionId string, Filters []interface{}, Offset int, Limit int, OrderField string, OrderType string, OrderCast string, Search string, First int, Last int) (map[string]interface{}, error) { - r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}/documents") - - params := map[string]interface{}{ - "filters": Filters, - "offset": Offset, - "limit": Limit, - "order-field": OrderField, - "order-type": OrderType, - "order-cast": OrderCast, - "search": Search, - "first": First, - "last": Last, - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateDocument create a new Document. -func (srv *Database) CreateDocument(CollectionId string, Data string, Read []interface{}, Write []interface{}, ParentDocument string, ParentProperty string, ParentPropertyType string) (map[string]interface{}, error) { - r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}/documents") - - params := map[string]interface{}{ - "data": Data, - "read": Read, - "write": Write, - "parentDocument": ParentDocument, - "parentProperty": ParentProperty, - "parentPropertyType": ParentPropertyType, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetDocument get document by its unique ID. This endpoint response returns a -// JSON object with the document data. -func (srv *Database) GetDocument(CollectionId string, DocumentId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) - path := r.Replace("/database/{collectionId}/documents/{documentId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateDocument -func (srv *Database) UpdateDocument(CollectionId string, DocumentId string, Data string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { - r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) - path := r.Replace("/database/{collectionId}/documents/{documentId}") - - params := map[string]interface{}{ - "data": Data, - "read": Read, - "write": Write, - } - - return srv.client.Call("PATCH", path, nil, params) -} - -// DeleteDocument delete document by its unique ID. This endpoint deletes only -// the parent documents, his attributes and relations to other documents. -// Child documents **will not** be deleted. -func (srv *Database) DeleteDocument(CollectionId string, DocumentId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) - path := r.Replace("/database/{collectionId}/documents/{documentId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} diff --git a/app/sdks/go/docs/examples/Avatars/get-browser.md b/app/sdks/go/docs/examples/Avatars/get-browser.md deleted file mode 100644 index 4e1f0b13c3..0000000000 --- a/app/sdks/go/docs/examples/Avatars/get-browser.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &client - } - - // Call GetBrowser method and handle results - var res, err := srv.GetBrowser("aa") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-credit-card.md b/app/sdks/go/docs/examples/Avatars/get-credit-card.md deleted file mode 100644 index 1ef37d9fe3..0000000000 --- a/app/sdks/go/docs/examples/Avatars/get-credit-card.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &client - } - - // Call GetCreditCard method and handle results - var res, err := srv.GetCreditCard("amex") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-favicon.md b/app/sdks/go/docs/examples/Avatars/get-favicon.md deleted file mode 100644 index f375a7bc6c..0000000000 --- a/app/sdks/go/docs/examples/Avatars/get-favicon.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &client - } - - // Call GetFavicon method and handle results - var res, err := srv.GetFavicon("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-flag.md b/app/sdks/go/docs/examples/Avatars/get-flag.md deleted file mode 100644 index 5658f5e1cc..0000000000 --- a/app/sdks/go/docs/examples/Avatars/get-flag.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &client - } - - // Call GetFlag method and handle results - var res, err := srv.GetFlag("af") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-image.md b/app/sdks/go/docs/examples/Avatars/get-image.md deleted file mode 100644 index 1ab511eecf..0000000000 --- a/app/sdks/go/docs/examples/Avatars/get-image.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &client - } - - // Call GetImage method and handle results - var res, err := srv.GetImage("https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Avatars/get-q-r.md b/app/sdks/go/docs/examples/Avatars/get-q-r.md deleted file mode 100644 index 14c54b494c..0000000000 --- a/app/sdks/go/docs/examples/Avatars/get-q-r.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ - client: &client - } - - // Call GetQR method and handle results - var res, err := srv.GetQR("[TEXT]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/create-collection.md b/app/sdks/go/docs/examples/Database/create-collection.md deleted file mode 100644 index 57bd03cfd1..0000000000 --- a/app/sdks/go/docs/examples/Database/create-collection.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call CreateCollection method and handle results - var res, err := srv.CreateCollection("[NAME]", [], [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/create-document.md b/app/sdks/go/docs/examples/Database/create-document.md deleted file mode 100644 index b3c7818222..0000000000 --- a/app/sdks/go/docs/examples/Database/create-document.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call CreateDocument method and handle results - var res, err := srv.CreateDocument("[COLLECTION_ID]", "{}", [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/delete-collection.md b/app/sdks/go/docs/examples/Database/delete-collection.md deleted file mode 100644 index a2c4056ce8..0000000000 --- a/app/sdks/go/docs/examples/Database/delete-collection.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call DeleteCollection method and handle results - var res, err := srv.DeleteCollection("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/delete-document.md b/app/sdks/go/docs/examples/Database/delete-document.md deleted file mode 100644 index 69cde9fb0f..0000000000 --- a/app/sdks/go/docs/examples/Database/delete-document.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call DeleteDocument method and handle results - var res, err := srv.DeleteDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/get-collection.md b/app/sdks/go/docs/examples/Database/get-collection.md deleted file mode 100644 index e60e590c14..0000000000 --- a/app/sdks/go/docs/examples/Database/get-collection.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call GetCollection method and handle results - var res, err := srv.GetCollection("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/get-document.md b/app/sdks/go/docs/examples/Database/get-document.md deleted file mode 100644 index 90fd6a2b76..0000000000 --- a/app/sdks/go/docs/examples/Database/get-document.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call GetDocument method and handle results - var res, err := srv.GetDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/list-collections.md b/app/sdks/go/docs/examples/Database/list-collections.md deleted file mode 100644 index b6cc1830aa..0000000000 --- a/app/sdks/go/docs/examples/Database/list-collections.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call ListCollections method and handle results - var res, err := srv.ListCollections() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/list-documents.md b/app/sdks/go/docs/examples/Database/list-documents.md deleted file mode 100644 index 5f7aec3672..0000000000 --- a/app/sdks/go/docs/examples/Database/list-documents.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call ListDocuments method and handle results - var res, err := srv.ListDocuments("[COLLECTION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/update-collection.md b/app/sdks/go/docs/examples/Database/update-collection.md deleted file mode 100644 index 79b1ab25b6..0000000000 --- a/app/sdks/go/docs/examples/Database/update-collection.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call UpdateCollection method and handle results - var res, err := srv.UpdateCollection("[COLLECTION_ID]", "[NAME]", [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Database/update-document.md b/app/sdks/go/docs/examples/Database/update-document.md deleted file mode 100644 index 3ed43c454b..0000000000 --- a/app/sdks/go/docs/examples/Database/update-document.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Database service passing Client - var srv := appwrite.Database{ - client: &client - } - - // Call UpdateDocument method and handle results - var res, err := srv.UpdateDocument("[COLLECTION_ID]", "[DOCUMENT_ID]", "{}", [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-continents.md b/app/sdks/go/docs/examples/Locale/get-continents.md deleted file mode 100644 index d707b900c2..0000000000 --- a/app/sdks/go/docs/examples/Locale/get-continents.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &client - } - - // Call GetContinents method and handle results - var res, err := srv.GetContinents() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-countries-e-u.md b/app/sdks/go/docs/examples/Locale/get-countries-e-u.md deleted file mode 100644 index f3f2146bee..0000000000 --- a/app/sdks/go/docs/examples/Locale/get-countries-e-u.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &client - } - - // Call GetCountriesEU method and handle results - var res, err := srv.GetCountriesEU() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-countries-phones.md b/app/sdks/go/docs/examples/Locale/get-countries-phones.md deleted file mode 100644 index 21a2d163b5..0000000000 --- a/app/sdks/go/docs/examples/Locale/get-countries-phones.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &client - } - - // Call GetCountriesPhones method and handle results - var res, err := srv.GetCountriesPhones() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-countries.md b/app/sdks/go/docs/examples/Locale/get-countries.md deleted file mode 100644 index 9f81721e70..0000000000 --- a/app/sdks/go/docs/examples/Locale/get-countries.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &client - } - - // Call GetCountries method and handle results - var res, err := srv.GetCountries() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-currencies.md b/app/sdks/go/docs/examples/Locale/get-currencies.md deleted file mode 100644 index 752a99de3c..0000000000 --- a/app/sdks/go/docs/examples/Locale/get-currencies.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &client - } - - // Call GetCurrencies method and handle results - var res, err := srv.GetCurrencies() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Locale/get-locale.md b/app/sdks/go/docs/examples/Locale/get-locale.md deleted file mode 100644 index d8e8ed1127..0000000000 --- a/app/sdks/go/docs/examples/Locale/get-locale.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Locale service passing Client - var srv := appwrite.Locale{ - client: &client - } - - // Call GetLocale method and handle results - var res, err := srv.GetLocale() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/create-file.md b/app/sdks/go/docs/examples/Storage/create-file.md deleted file mode 100644 index bb55c63d3d..0000000000 --- a/app/sdks/go/docs/examples/Storage/create-file.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &client - } - - // Call CreateFile method and handle results - var res, err := srv.CreateFile(file, [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/delete-file.md b/app/sdks/go/docs/examples/Storage/delete-file.md deleted file mode 100644 index e2eea09d9a..0000000000 --- a/app/sdks/go/docs/examples/Storage/delete-file.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &client - } - - // Call DeleteFile method and handle results - var res, err := srv.DeleteFile("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/get-file-download.md b/app/sdks/go/docs/examples/Storage/get-file-download.md deleted file mode 100644 index e8c6343391..0000000000 --- a/app/sdks/go/docs/examples/Storage/get-file-download.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &client - } - - // Call GetFileDownload method and handle results - var res, err := srv.GetFileDownload("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/get-file-preview.md b/app/sdks/go/docs/examples/Storage/get-file-preview.md deleted file mode 100644 index 6fa084376b..0000000000 --- a/app/sdks/go/docs/examples/Storage/get-file-preview.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &client - } - - // Call GetFilePreview method and handle results - var res, err := srv.GetFilePreview("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/get-file-view.md b/app/sdks/go/docs/examples/Storage/get-file-view.md deleted file mode 100644 index 6c664bcb24..0000000000 --- a/app/sdks/go/docs/examples/Storage/get-file-view.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &client - } - - // Call GetFileView method and handle results - var res, err := srv.GetFileView("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/get-file.md b/app/sdks/go/docs/examples/Storage/get-file.md deleted file mode 100644 index 766b3dc8da..0000000000 --- a/app/sdks/go/docs/examples/Storage/get-file.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &client - } - - // Call GetFile method and handle results - var res, err := srv.GetFile("[FILE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/list-files.md b/app/sdks/go/docs/examples/Storage/list-files.md deleted file mode 100644 index 654aba9a8b..0000000000 --- a/app/sdks/go/docs/examples/Storage/list-files.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &client - } - - // Call ListFiles method and handle results - var res, err := srv.ListFiles() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Storage/update-file.md b/app/sdks/go/docs/examples/Storage/update-file.md deleted file mode 100644 index b9d6b981de..0000000000 --- a/app/sdks/go/docs/examples/Storage/update-file.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Storage service passing Client - var srv := appwrite.Storage{ - client: &client - } - - // Call UpdateFile method and handle results - var res, err := srv.UpdateFile("[FILE_ID]", [], []) - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/create-team-membership.md b/app/sdks/go/docs/examples/Teams/create-team-membership.md deleted file mode 100644 index 894c4aef5b..0000000000 --- a/app/sdks/go/docs/examples/Teams/create-team-membership.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &client - } - - // Call CreateTeamMembership method and handle results - var res, err := srv.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/create-team.md b/app/sdks/go/docs/examples/Teams/create-team.md deleted file mode 100644 index c8b4ee95e6..0000000000 --- a/app/sdks/go/docs/examples/Teams/create-team.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &client - } - - // Call CreateTeam method and handle results - var res, err := srv.CreateTeam("[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/delete-team-membership.md b/app/sdks/go/docs/examples/Teams/delete-team-membership.md deleted file mode 100644 index 1f35436bbc..0000000000 --- a/app/sdks/go/docs/examples/Teams/delete-team-membership.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &client - } - - // Call DeleteTeamMembership method and handle results - var res, err := srv.DeleteTeamMembership("[TEAM_ID]", "[INVITE_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/delete-team.md b/app/sdks/go/docs/examples/Teams/delete-team.md deleted file mode 100644 index 91a52df484..0000000000 --- a/app/sdks/go/docs/examples/Teams/delete-team.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &client - } - - // Call DeleteTeam method and handle results - var res, err := srv.DeleteTeam("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/get-team-memberships.md b/app/sdks/go/docs/examples/Teams/get-team-memberships.md deleted file mode 100644 index 3f5decbc90..0000000000 --- a/app/sdks/go/docs/examples/Teams/get-team-memberships.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &client - } - - // Call GetTeamMemberships method and handle results - var res, err := srv.GetTeamMemberships("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/get-team.md b/app/sdks/go/docs/examples/Teams/get-team.md deleted file mode 100644 index 117dcbf94c..0000000000 --- a/app/sdks/go/docs/examples/Teams/get-team.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &client - } - - // Call GetTeam method and handle results - var res, err := srv.GetTeam("[TEAM_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/list-teams.md b/app/sdks/go/docs/examples/Teams/list-teams.md deleted file mode 100644 index 71b5fb04ea..0000000000 --- a/app/sdks/go/docs/examples/Teams/list-teams.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &client - } - - // Call ListTeams method and handle results - var res, err := srv.ListTeams() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Teams/update-team.md b/app/sdks/go/docs/examples/Teams/update-team.md deleted file mode 100644 index 33de23cdd6..0000000000 --- a/app/sdks/go/docs/examples/Teams/update-team.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Teams service passing Client - var srv := appwrite.Teams{ - client: &client - } - - // Call UpdateTeam method and handle results - var res, err := srv.UpdateTeam("[TEAM_ID]", "[NAME]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/create-user.md b/app/sdks/go/docs/examples/Users/create-user.md deleted file mode 100644 index 0ad8fcfbb3..0000000000 --- a/app/sdks/go/docs/examples/Users/create-user.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call CreateUser method and handle results - var res, err := srv.CreateUser("email@example.com", "password") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/delete-user-session.md b/app/sdks/go/docs/examples/Users/delete-user-session.md deleted file mode 100644 index 2e63b205e3..0000000000 --- a/app/sdks/go/docs/examples/Users/delete-user-session.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call DeleteUserSession method and handle results - var res, err := srv.DeleteUserSession("[USER_ID]", "[SESSION_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/delete-user-sessions.md b/app/sdks/go/docs/examples/Users/delete-user-sessions.md deleted file mode 100644 index eb08458c9f..0000000000 --- a/app/sdks/go/docs/examples/Users/delete-user-sessions.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call DeleteUserSessions method and handle results - var res, err := srv.DeleteUserSessions("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/get-user-logs.md b/app/sdks/go/docs/examples/Users/get-user-logs.md deleted file mode 100644 index a17455f86a..0000000000 --- a/app/sdks/go/docs/examples/Users/get-user-logs.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call GetUserLogs method and handle results - var res, err := srv.GetUserLogs("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/get-user-prefs.md b/app/sdks/go/docs/examples/Users/get-user-prefs.md deleted file mode 100644 index e161a3694c..0000000000 --- a/app/sdks/go/docs/examples/Users/get-user-prefs.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call GetUserPrefs method and handle results - var res, err := srv.GetUserPrefs("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/get-user-sessions.md b/app/sdks/go/docs/examples/Users/get-user-sessions.md deleted file mode 100644 index d88d75e39f..0000000000 --- a/app/sdks/go/docs/examples/Users/get-user-sessions.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call GetUserSessions method and handle results - var res, err := srv.GetUserSessions("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/get-user.md b/app/sdks/go/docs/examples/Users/get-user.md deleted file mode 100644 index 9072765f96..0000000000 --- a/app/sdks/go/docs/examples/Users/get-user.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call GetUser method and handle results - var res, err := srv.GetUser("[USER_ID]") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/list-users.md b/app/sdks/go/docs/examples/Users/list-users.md deleted file mode 100644 index 0c85dafd3b..0000000000 --- a/app/sdks/go/docs/examples/Users/list-users.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call ListUsers method and handle results - var res, err := srv.ListUsers() - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/update-user-prefs.md b/app/sdks/go/docs/examples/Users/update-user-prefs.md deleted file mode 100644 index 333c19a4e6..0000000000 --- a/app/sdks/go/docs/examples/Users/update-user-prefs.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call UpdateUserPrefs method and handle results - var res, err := srv.UpdateUserPrefs("[USER_ID]", "") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/Users/update-user-status.md b/app/sdks/go/docs/examples/Users/update-user-status.md deleted file mode 100644 index 914f62dc25..0000000000 --- a/app/sdks/go/docs/examples/Users/update-user-status.md +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "fmt" - "os" - "github.com/appwrite/sdk-for-go" -) - -func main() { - // Create a Client - var client := appwrite.Client{} - - // Set Client required headers - client.SetProject("") - client.SetKey("") - - // Create a new Users service passing Client - var srv := appwrite.Users{ - client: &client - } - - // Call UpdateUserStatus method and handle results - var res, err := srv.UpdateUserStatus("[USER_ID]", "1") - if err != nil { - panic(err) - } - - fmt.Println(res) -} \ No newline at end of file diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go deleted file mode 100644 index cf6a0cfdd3..0000000000 --- a/app/sdks/go/locale.go +++ /dev/null @@ -1,80 +0,0 @@ -package appwrite - -import ( -) - -// Locale service -type Locale struct { - client *Client -} - -// GetLocale get the current user location based on IP. Returns an object with -// user country code, country name, continent name, continent code, ip address -// and suggested currency. You can use the locale header to get the data in a -// supported language. -// -// ([IP Geolocation by DB-IP](https://db-ip.com)) -func (srv *Locale) GetLocale() (map[string]interface{}, error) { - path := "/locale" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetContinents list of all continents. You can use the locale header to get -// the data in a supported language. -func (srv *Locale) GetContinents() (map[string]interface{}, error) { - path := "/locale/continents" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetCountries list of all countries. You can use the locale header to get -// the data in a supported language. -func (srv *Locale) GetCountries() (map[string]interface{}, error) { - path := "/locale/countries" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetCountriesEU list of all countries that are currently members of the EU. -// You can use the locale header to get the data in a supported language. -func (srv *Locale) GetCountriesEU() (map[string]interface{}, error) { - path := "/locale/countries/eu" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetCountriesPhones list of all countries phone codes. You can use the -// locale header to get the data in a supported language. -func (srv *Locale) GetCountriesPhones() (map[string]interface{}, error) { - path := "/locale/countries/phones" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetCurrencies list of all currencies, including currency symol, name, -// plural, and decimal digits for all major and minor currencies. You can use -// the locale header to get the data in a supported language. -func (srv *Locale) GetCurrencies() (map[string]interface{}, error) { - path := "/locale/currencies" - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} diff --git a/app/sdks/go/main.go b/app/sdks/go/main.go deleted file mode 100644 index 13df7fc1b5..0000000000 --- a/app/sdks/go/main.go +++ /dev/null @@ -1,6 +0,0 @@ -package appwrite - -// NewClient initializes a new Appwrite client -func NewClient() Client { - return Client{} -} diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go deleted file mode 100644 index e4edd23bf4..0000000000 --- a/app/sdks/go/storage.go +++ /dev/null @@ -1,126 +0,0 @@ -package appwrite - -import ( - "strings" -) - -// Storage service -type Storage struct { - client *Client -} - -// ListFiles get a list of all the user files. You can use the query params to -// filter your results. On admin mode, this endpoint will return a list of all -// of the project files. [Learn more about different API modes](/docs/admin). -func (srv *Storage) ListFiles(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { - path := "/storage/files" - - params := map[string]interface{}{ - "search": Search, - "limit": Limit, - "offset": Offset, - "orderType": OrderType, - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateFile create a new file. The user who creates the file will -// automatically be assigned to read and write access unless he has passed -// custom values for read and write arguments. -func (srv *Storage) CreateFile(File string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { - path := "/storage/files" - - params := map[string]interface{}{ - "file": File, - "read": Read, - "write": Write, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetFile get file by its unique ID. This endpoint response returns a JSON -// object with the file metadata. -func (srv *Storage) GetFile(FileId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{fileId}", FileId) - path := r.Replace("/storage/files/{fileId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateFile update file by its unique ID. Only users with write permissions -// have access to update this resource. -func (srv *Storage) UpdateFile(FileId string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { - r := strings.NewReplacer("{fileId}", FileId) - path := r.Replace("/storage/files/{fileId}") - - params := map[string]interface{}{ - "read": Read, - "write": Write, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// DeleteFile delete a file by its unique ID. Only users with write -// permissions have access to delete this resource. -func (srv *Storage) DeleteFile(FileId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{fileId}", FileId) - path := r.Replace("/storage/files/{fileId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// GetFileDownload get file content by its unique ID. The endpoint response -// return with a 'Content-Disposition: attachment' header that tells the -// browser to start downloading the file to user downloads directory. -func (srv *Storage) GetFileDownload(FileId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{fileId}", FileId) - path := r.Replace("/storage/files/{fileId}/download") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetFilePreview get a file preview image. Currently, this method supports -// preview for image files (jpg, png, and gif), other supported formats, like -// pdf, docs, slides, and spreadsheets, will return the file icon image. You -// can also pass query string arguments for cutting and resizing your preview -// image. -func (srv *Storage) GetFilePreview(FileId string, Width int, Height int, Quality int, Background string, Output string) (map[string]interface{}, error) { - r := strings.NewReplacer("{fileId}", FileId) - path := r.Replace("/storage/files/{fileId}/preview") - - params := map[string]interface{}{ - "width": Width, - "height": Height, - "quality": Quality, - "background": Background, - "output": Output, - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetFileView get file content by its unique ID. This endpoint is similar to -// the download method but returns with no 'Content-Disposition: attachment' -// header. -func (srv *Storage) GetFileView(FileId string, As string) (map[string]interface{}, error) { - r := strings.NewReplacer("{fileId}", FileId) - path := r.Replace("/storage/files/{fileId}/view") - - params := map[string]interface{}{ - "as": As, - } - - return srv.client.Call("GET", path, nil, params) -} diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go deleted file mode 100644 index 925275f733..0000000000 --- a/app/sdks/go/teams.go +++ /dev/null @@ -1,132 +0,0 @@ -package appwrite - -import ( - "strings" -) - -// Teams service -type Teams struct { - client *Client -} - -// ListTeams get a list of all the current user teams. You can use the query -// params to filter your results. On admin mode, this endpoint will return a -// list of all of the project teams. [Learn more about different API -// modes](/docs/admin). -func (srv *Teams) ListTeams(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { - path := "/teams" - - params := map[string]interface{}{ - "search": Search, - "limit": Limit, - "offset": Offset, - "orderType": OrderType, - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateTeam create a new team. The user who creates the team will -// automatically be assigned as the owner of the team. The team owner can -// invite new members, who will be able add new owners and update or delete -// the team from your project. -func (srv *Teams) CreateTeam(Name string, Roles []interface{}) (map[string]interface{}, error) { - path := "/teams" - - params := map[string]interface{}{ - "name": Name, - "roles": Roles, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetTeam get team by its unique ID. All team members have read access for -// this resource. -func (srv *Teams) GetTeam(TeamId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{teamId}", TeamId) - path := r.Replace("/teams/{teamId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateTeam update team by its unique ID. Only team owners have write access -// for this resource. -func (srv *Teams) UpdateTeam(TeamId string, Name string) (map[string]interface{}, error) { - r := strings.NewReplacer("{teamId}", TeamId) - path := r.Replace("/teams/{teamId}") - - params := map[string]interface{}{ - "name": Name, - } - - return srv.client.Call("PUT", path, nil, params) -} - -// DeleteTeam delete team by its unique ID. Only team owners have write access -// for this resource. -func (srv *Teams) DeleteTeam(TeamId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{teamId}", TeamId) - path := r.Replace("/teams/{teamId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// GetTeamMemberships get team members by the team unique ID. All team members -// have read access for this list of resources. -func (srv *Teams) GetTeamMemberships(TeamId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{teamId}", TeamId) - path := r.Replace("/teams/{teamId}/memberships") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateTeamMembership use this endpoint to invite a new member to your team. -// An email with a link to join the team will be sent to the new member email -// address. If member doesn't exists in the project it will be automatically -// created. -// -// Use the 'url' parameter to redirect the user from the invitation email back -// to your app. When the user is redirected, use the [Update Team Membership -// Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join -// the user to the team. -// -// Please note that in order to avoid a [Redirect -// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) -// the only valid redirect URL's are the once from domains you have set when -// added your platforms in the console interface. -func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []interface{}, Url string, Name string) (map[string]interface{}, error) { - r := strings.NewReplacer("{teamId}", TeamId) - path := r.Replace("/teams/{teamId}/memberships") - - params := map[string]interface{}{ - "email": Email, - "name": Name, - "roles": Roles, - "url": Url, - } - - return srv.client.Call("POST", path, nil, params) -} - -// DeleteTeamMembership this endpoint allows a user to leave a team or for a -// team owner to delete the membership of any other team member. You can also -// use this endpoint to delete a user membership even if he didn't accept it. -func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{teamId}", TeamId, "{inviteId}", InviteId) - path := r.Replace("/teams/{teamId}/memberships/{inviteId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} diff --git a/app/sdks/go/users.go b/app/sdks/go/users.go deleted file mode 100644 index 6ef84d510a..0000000000 --- a/app/sdks/go/users.go +++ /dev/null @@ -1,130 +0,0 @@ -package appwrite - -import ( - "strings" -) - -// Users service -type Users struct { - client *Client -} - -// ListUsers get a list of all the project users. You can use the query params -// to filter your results. -func (srv *Users) ListUsers(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { - path := "/users" - - params := map[string]interface{}{ - "search": Search, - "limit": Limit, - "offset": Offset, - "orderType": OrderType, - } - - return srv.client.Call("GET", path, nil, params) -} - -// CreateUser create a new user. -func (srv *Users) CreateUser(Email string, Password string, Name string) (map[string]interface{}, error) { - path := "/users" - - params := map[string]interface{}{ - "email": Email, - "password": Password, - "name": Name, - } - - return srv.client.Call("POST", path, nil, params) -} - -// GetUser get user by its unique ID. -func (srv *Users) GetUser(UserId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{userId}", UserId) - path := r.Replace("/users/{userId}") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetUserLogs get user activity logs list by its unique ID. -func (srv *Users) GetUserLogs(UserId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{userId}", UserId) - path := r.Replace("/users/{userId}/logs") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// GetUserPrefs get user preferences by its unique ID. -func (srv *Users) GetUserPrefs(UserId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{userId}", UserId) - path := r.Replace("/users/{userId}/prefs") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// UpdateUserPrefs update user preferences by its unique ID. You can pass only -// the specific settings you wish to update. -func (srv *Users) UpdateUserPrefs(UserId string, Prefs string) (map[string]interface{}, error) { - r := strings.NewReplacer("{userId}", UserId) - path := r.Replace("/users/{userId}/prefs") - - params := map[string]interface{}{ - "prefs": Prefs, - } - - return srv.client.Call("PATCH", path, nil, params) -} - -// GetUserSessions get user sessions list by its unique ID. -func (srv *Users) GetUserSessions(UserId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{userId}", UserId) - path := r.Replace("/users/{userId}/sessions") - - params := map[string]interface{}{ - } - - return srv.client.Call("GET", path, nil, params) -} - -// DeleteUserSessions delete all user sessions by its unique ID. -func (srv *Users) DeleteUserSessions(UserId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{userId}", UserId) - path := r.Replace("/users/{userId}/sessions") - - params := map[string]interface{}{ - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// DeleteUserSession delete user sessions by its unique ID. -func (srv *Users) DeleteUserSession(UserId string, SessionId string) (map[string]interface{}, error) { - r := strings.NewReplacer("{userId}", UserId) - path := r.Replace("/users/{userId}/sessions/:session") - - params := map[string]interface{}{ - "sessionId": SessionId, - } - - return srv.client.Call("DELETE", path, nil, params) -} - -// UpdateUserStatus update user status by its unique ID. -func (srv *Users) UpdateUserStatus(UserId string, Status string) (map[string]interface{}, error) { - r := strings.NewReplacer("{userId}", UserId) - path := r.Replace("/users/{userId}/status") - - params := map[string]interface{}{ - "status": Status, - } - - return srv.client.Call("PATCH", path, nil, params) -} diff --git a/app/sdks/go/utils.go b/app/sdks/go/utils.go deleted file mode 100644 index ca36149cf1..0000000000 --- a/app/sdks/go/utils.go +++ /dev/null @@ -1,36 +0,0 @@ -package appwrite - -import ( - "fmt" - "reflect" - "strconv" -) - -// ToString changes arg to string -func ToString(arg interface{}) string { - var tmp = reflect.Indirect(reflect.ValueOf(arg)).Interface() - switch v := tmp.(type) { - case int: - return strconv.Itoa(v) - case int8: - return strconv.FormatInt(int64(v), 10) - case int16: - return strconv.FormatInt(int64(v), 10) - case int32: - return strconv.FormatInt(int64(v), 10) - case int64: - return strconv.FormatInt(v, 10) - case string: - return v - case float32: - return strconv.FormatFloat(float64(v), 'f', -1, 32) - case float64: - return strconv.FormatFloat(v, 'f', -1, 64) - case fmt.Stringer: - return v.String() - case reflect.Value: - return ToString(v.Interface()) - default: - return "" - } -} From 95fa33ff04a509ca3ce641e0d4bc28445ac0fab4 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 16:22:13 +0200 Subject: [PATCH 106/237] Updated GO lib --- app/sdks/go/LICENSE | 12 ++ app/sdks/go/README.md | 24 +++ app/sdks/go/avatars.go | 103 ++++++++++++ app/sdks/go/client.go | 119 +++++++++++++ app/sdks/go/database.go | 159 ++++++++++++++++++ .../go/docs/examples/avatars/get-browser.md | 29 ++++ .../docs/examples/avatars/get-credit-card.md | 29 ++++ .../go/docs/examples/avatars/get-favicon.md | 29 ++++ app/sdks/go/docs/examples/avatars/get-flag.md | 29 ++++ .../go/docs/examples/avatars/get-image.md | 29 ++++ app/sdks/go/docs/examples/avatars/get-q-r.md | 29 ++++ .../examples/database/create-collection.md | 29 ++++ .../docs/examples/database/create-document.md | 29 ++++ .../examples/database/delete-collection.md | 29 ++++ .../docs/examples/database/delete-document.md | 29 ++++ .../docs/examples/database/get-collection.md | 29 ++++ .../go/docs/examples/database/get-document.md | 29 ++++ .../examples/database/list-collections.md | 29 ++++ .../docs/examples/database/list-documents.md | 29 ++++ .../examples/database/update-collection.md | 29 ++++ .../docs/examples/database/update-document.md | 29 ++++ .../go/docs/examples/locale/get-continents.md | 29 ++++ .../docs/examples/locale/get-countries-e-u.md | 29 ++++ .../examples/locale/get-countries-phones.md | 29 ++++ .../go/docs/examples/locale/get-countries.md | 29 ++++ .../go/docs/examples/locale/get-currencies.md | 29 ++++ .../go/docs/examples/locale/get-locale.md | 29 ++++ .../go/docs/examples/storage/create-file.md | 29 ++++ .../go/docs/examples/storage/delete-file.md | 29 ++++ .../examples/storage/get-file-download.md | 29 ++++ .../docs/examples/storage/get-file-preview.md | 29 ++++ .../go/docs/examples/storage/get-file-view.md | 29 ++++ app/sdks/go/docs/examples/storage/get-file.md | 29 ++++ .../go/docs/examples/storage/list-files.md | 29 ++++ .../go/docs/examples/storage/update-file.md | 29 ++++ .../examples/teams/create-team-membership.md | 29 ++++ .../go/docs/examples/teams/create-team.md | 29 ++++ .../examples/teams/delete-team-membership.md | 29 ++++ .../go/docs/examples/teams/delete-team.md | 29 ++++ .../examples/teams/get-team-memberships.md | 29 ++++ app/sdks/go/docs/examples/teams/get-team.md | 29 ++++ app/sdks/go/docs/examples/teams/list-teams.md | 29 ++++ .../go/docs/examples/teams/update-team.md | 29 ++++ .../go/docs/examples/users/create-user.md | 29 ++++ .../examples/users/delete-user-session.md | 29 ++++ .../examples/users/delete-user-sessions.md | 29 ++++ .../go/docs/examples/users/get-user-logs.md | 29 ++++ .../go/docs/examples/users/get-user-prefs.md | 29 ++++ .../docs/examples/users/get-user-sessions.md | 29 ++++ app/sdks/go/docs/examples/users/get-user.md | 29 ++++ app/sdks/go/docs/examples/users/list-users.md | 29 ++++ .../docs/examples/users/update-user-prefs.md | 29 ++++ .../docs/examples/users/update-user-status.md | 29 ++++ app/sdks/go/locale.go | 80 +++++++++ app/sdks/go/main.go | 6 + app/sdks/go/storage.go | 126 ++++++++++++++ app/sdks/go/teams.go | 132 +++++++++++++++ app/sdks/go/users.go | 130 ++++++++++++++ app/sdks/go/utils.go | 36 ++++ 59 files changed, 2319 insertions(+) create mode 100644 app/sdks/go/LICENSE create mode 100644 app/sdks/go/README.md create mode 100644 app/sdks/go/avatars.go create mode 100644 app/sdks/go/client.go create mode 100644 app/sdks/go/database.go create mode 100644 app/sdks/go/docs/examples/avatars/get-browser.md create mode 100644 app/sdks/go/docs/examples/avatars/get-credit-card.md create mode 100644 app/sdks/go/docs/examples/avatars/get-favicon.md create mode 100644 app/sdks/go/docs/examples/avatars/get-flag.md create mode 100644 app/sdks/go/docs/examples/avatars/get-image.md create mode 100644 app/sdks/go/docs/examples/avatars/get-q-r.md create mode 100644 app/sdks/go/docs/examples/database/create-collection.md create mode 100644 app/sdks/go/docs/examples/database/create-document.md create mode 100644 app/sdks/go/docs/examples/database/delete-collection.md create mode 100644 app/sdks/go/docs/examples/database/delete-document.md create mode 100644 app/sdks/go/docs/examples/database/get-collection.md create mode 100644 app/sdks/go/docs/examples/database/get-document.md create mode 100644 app/sdks/go/docs/examples/database/list-collections.md create mode 100644 app/sdks/go/docs/examples/database/list-documents.md create mode 100644 app/sdks/go/docs/examples/database/update-collection.md create mode 100644 app/sdks/go/docs/examples/database/update-document.md create mode 100644 app/sdks/go/docs/examples/locale/get-continents.md create mode 100644 app/sdks/go/docs/examples/locale/get-countries-e-u.md create mode 100644 app/sdks/go/docs/examples/locale/get-countries-phones.md create mode 100644 app/sdks/go/docs/examples/locale/get-countries.md create mode 100644 app/sdks/go/docs/examples/locale/get-currencies.md create mode 100644 app/sdks/go/docs/examples/locale/get-locale.md create mode 100644 app/sdks/go/docs/examples/storage/create-file.md create mode 100644 app/sdks/go/docs/examples/storage/delete-file.md create mode 100644 app/sdks/go/docs/examples/storage/get-file-download.md create mode 100644 app/sdks/go/docs/examples/storage/get-file-preview.md create mode 100644 app/sdks/go/docs/examples/storage/get-file-view.md create mode 100644 app/sdks/go/docs/examples/storage/get-file.md create mode 100644 app/sdks/go/docs/examples/storage/list-files.md create mode 100644 app/sdks/go/docs/examples/storage/update-file.md create mode 100644 app/sdks/go/docs/examples/teams/create-team-membership.md create mode 100644 app/sdks/go/docs/examples/teams/create-team.md create mode 100644 app/sdks/go/docs/examples/teams/delete-team-membership.md create mode 100644 app/sdks/go/docs/examples/teams/delete-team.md create mode 100644 app/sdks/go/docs/examples/teams/get-team-memberships.md create mode 100644 app/sdks/go/docs/examples/teams/get-team.md create mode 100644 app/sdks/go/docs/examples/teams/list-teams.md create mode 100644 app/sdks/go/docs/examples/teams/update-team.md create mode 100644 app/sdks/go/docs/examples/users/create-user.md create mode 100644 app/sdks/go/docs/examples/users/delete-user-session.md create mode 100644 app/sdks/go/docs/examples/users/delete-user-sessions.md create mode 100644 app/sdks/go/docs/examples/users/get-user-logs.md create mode 100644 app/sdks/go/docs/examples/users/get-user-prefs.md create mode 100644 app/sdks/go/docs/examples/users/get-user-sessions.md create mode 100644 app/sdks/go/docs/examples/users/get-user.md create mode 100644 app/sdks/go/docs/examples/users/list-users.md create mode 100644 app/sdks/go/docs/examples/users/update-user-prefs.md create mode 100644 app/sdks/go/docs/examples/users/update-user-status.md create mode 100644 app/sdks/go/locale.go create mode 100644 app/sdks/go/main.go create mode 100644 app/sdks/go/storage.go create mode 100644 app/sdks/go/teams.go create mode 100644 app/sdks/go/users.go create mode 100644 app/sdks/go/utils.go diff --git a/app/sdks/go/LICENSE b/app/sdks/go/LICENSE new file mode 100644 index 0000000000..fc7c051a91 --- /dev/null +++ b/app/sdks/go/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/sdks/go/README.md b/app/sdks/go/README.md new file mode 100644 index 0000000000..35fd446507 --- /dev/null +++ b/app/sdks/go/README.md @@ -0,0 +1,24 @@ +# Appwrite SDK for Go + +![License](https://img.shields.io/github/license/appwrite/sdk-for-go.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) + +**This SDK is compatible with Appwrite server version . For older versions, please check previous releases.** + +Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) + + + +![Appwrite](https://appwrite.io/images/github.png) + +## Installation + +To install using `go get`: + +```bash +go get github.com/appwrite/sdk-for-go +``` + +## License + +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/go/avatars.go b/app/sdks/go/avatars.go new file mode 100644 index 0000000000..286f644f8d --- /dev/null +++ b/app/sdks/go/avatars.go @@ -0,0 +1,103 @@ +package appwrite + +import ( + "strings" +) + +// Avatars service +type Avatars struct { + client *Client +} + +// GetBrowser you can use this endpoint to show different browser icons to +// your users. The code argument receives the browser code as it appears in +// your user /account/sessions endpoint. Use width, height and quality +// arguments to change the output settings. +func (srv *Avatars) GetBrowser(Code string, Width int, Height int, Quality int) (map[string]interface{}, error) { + r := strings.NewReplacer("{code}", Code) + path := r.Replace("/avatars/browsers/{code}") + + params := map[string]interface{}{ + "width": Width, + "height": Height, + "quality": Quality, + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetCreditCard need to display your users with your billing method or their +// payment methods? The credit card endpoint will return you the icon of the +// credit card provider you need. Use width, height and quality arguments to +// change the output settings. +func (srv *Avatars) GetCreditCard(Code string, Width int, Height int, Quality int) (map[string]interface{}, error) { + r := strings.NewReplacer("{code}", Code) + path := r.Replace("/avatars/credit-cards/{code}") + + params := map[string]interface{}{ + "width": Width, + "height": Height, + "quality": Quality, + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetFavicon use this endpoint to fetch the favorite icon (AKA favicon) of a +// any remote website URL. +func (srv *Avatars) GetFavicon(Url string) (map[string]interface{}, error) { + path := "/avatars/favicon" + + params := map[string]interface{}{ + "url": Url, + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetFlag you can use this endpoint to show different country flags icons to +// your users. The code argument receives the 2 letter country code. Use +// width, height and quality arguments to change the output settings. +func (srv *Avatars) GetFlag(Code string, Width int, Height int, Quality int) (map[string]interface{}, error) { + r := strings.NewReplacer("{code}", Code) + path := r.Replace("/avatars/flags/{code}") + + params := map[string]interface{}{ + "width": Width, + "height": Height, + "quality": Quality, + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetImage use this endpoint to fetch a remote image URL and crop it to any +// image size you want. This endpoint is very useful if you need to crop and +// display remote images in your app or in case you want to make sure a 3rd +// party image is properly served using a TLS protocol. +func (srv *Avatars) GetImage(Url string, Width int, Height int) (map[string]interface{}, error) { + path := "/avatars/image" + + params := map[string]interface{}{ + "url": Url, + "width": Width, + "height": Height, + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetQR converts a given plain text to a QR code image. You can use the query +// parameters to change the size and style of the resulting image. +func (srv *Avatars) GetQR(Text string, Size int, Margin int, Download int) (map[string]interface{}, error) { + path := "/avatars/qr" + + params := map[string]interface{}{ + "text": Text, + "size": Size, + "margin": Margin, + "download": Download, + } + + return srv.client.Call("GET", path, nil, params) +} diff --git a/app/sdks/go/client.go b/app/sdks/go/client.go new file mode 100644 index 0000000000..94f2546cff --- /dev/null +++ b/app/sdks/go/client.go @@ -0,0 +1,119 @@ +package appwrite + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "net/url" + "strings" +) + +// Client is the client struct to access Appwrite services +type Client struct { + client *http.Client + endpoint string + headers map[string]string + selfSigned bool +} + +// SetEndpoint sets the default endpoint to which the Client connects to +func (clt *Client) SetEndpoint(endpoint string) { + clt.endpoint = endpoint +} + +// SetSelfSigned sets the condition that specify if the Client should allow connections to a server using a self-signed certificate +func (clt *Client) SetSelfSigned(status bool) { + clt.selfSigned = status +} + +// AddHeader add a new custom header that the Client should send on each request +func (clt *Client) AddHeader(key string, value string) { + clt.headers[key] = value +} + +// SetProjectHeader add the 'X-Appwrite-Project' header for the Client. Your Appwrite project ID +func (clt *Client) SetProjectHeader(value string) { + clt.headers["X-Appwrite-Project"] = value +} + +// SetKeyHeader add the 'X-Appwrite-Key' header for the Client. Your Appwrite project secret key +func (clt *Client) SetKeyHeader(value string) { + clt.headers["X-Appwrite-Key"] = value +} + +// SetLocaleHeader add the 'X-Appwrite-Locale' header for the Client. +func (clt *Client) SetLocaleHeader(value string) { + clt.headers["X-Appwrite-Locale"] = value +} + +// SetModeHeader add the 'X-Appwrite-Mode' header for the Client. +func (clt *Client) SetModeHeader(value string) { + clt.headers["X-Appwrite-Mode"] = value +} + +// Call an API using Client +func (clt *Client) Call(method string, path string, headers map[string]interface{}, params map[string]interface{}) (map[string]interface{}, error) { + if clt.client == nil { + // Create HTTP client + clt.client = &http.Client{} + } + + if clt.selfSigned { + // Allow self signed requests + } + + urlPath := clt.endpoint + path + isGet := strings.ToUpper(method) == "GET" + + var reqBody *strings.Reader + if !isGet { + frm := url.Values{} + for key, val := range params { + frm.Add(key, ToString(val)) + } + reqBody = strings.NewReader(frm.Encode()) + } + + // Create and modify HTTP request before sending + req, err := http.NewRequest(method, urlPath, reqBody) + if err != nil { + return nil, err + } + + // Set Client headers + for key, val := range clt.headers { + req.Header.Set(key, ToString(val)) + } + + // Set Custom headers + for key, val := range headers { + req.Header.Set(key, ToString(val)) + } + + if isGet { + q := req.URL.Query() + for key, val := range params { + q.Add(key, ToString(val)) + } + req.URL.RawQuery = q.Encode() + } + + // Make request + response, err := clt.client.Do(req) + if err != nil { + return nil, err + } + + // Handle response + defer response.Body.Close() + + responseData, err := ioutil.ReadAll(response.Body) + if err != nil { + return nil, err + } + + var jsonResponse map[string]interface{} + json.Unmarshal(responseData, &jsonResponse) + + return jsonResponse, nil +} diff --git a/app/sdks/go/database.go b/app/sdks/go/database.go new file mode 100644 index 0000000000..b1e58e746b --- /dev/null +++ b/app/sdks/go/database.go @@ -0,0 +1,159 @@ +package appwrite + +import ( + "strings" +) + +// Database service +type Database struct { + client *Client +} + +// ListCollections get a list of all the user collections. You can use the +// query params to filter your results. On admin mode, this endpoint will +// return a list of all of the project collections. [Learn more about +// different API modes](/docs/admin). +func (srv *Database) ListCollections(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { + path := "/database" + + params := map[string]interface{}{ + "search": Search, + "limit": Limit, + "offset": Offset, + "orderType": OrderType, + } + + return srv.client.Call("GET", path, nil, params) +} + +// CreateCollection create a new Collection. +func (srv *Database) CreateCollection(Name string, Read []interface{}, Write []interface{}, Rules []interface{}) (map[string]interface{}, error) { + path := "/database" + + params := map[string]interface{}{ + "name": Name, + "read": Read, + "write": Write, + "rules": Rules, + } + + return srv.client.Call("POST", path, nil, params) +} + +// GetCollection get collection by its unique ID. This endpoint response +// returns a JSON object with the collection metadata. +func (srv *Database) GetCollection(CollectionId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{collectionId}", CollectionId) + path := r.Replace("/database/{collectionId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// UpdateCollection update collection by its unique ID. +func (srv *Database) UpdateCollection(CollectionId string, Name string, Read []interface{}, Write []interface{}, Rules []interface{}) (map[string]interface{}, error) { + r := strings.NewReplacer("{collectionId}", CollectionId) + path := r.Replace("/database/{collectionId}") + + params := map[string]interface{}{ + "name": Name, + "read": Read, + "write": Write, + "rules": Rules, + } + + return srv.client.Call("PUT", path, nil, params) +} + +// DeleteCollection delete a collection by its unique ID. Only users with +// write permissions have access to delete this resource. +func (srv *Database) DeleteCollection(CollectionId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{collectionId}", CollectionId) + path := r.Replace("/database/{collectionId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} + +// ListDocuments get a list of all the user documents. You can use the query +// params to filter your results. On admin mode, this endpoint will return a +// list of all of the project documents. [Learn more about different API +// modes](/docs/admin). +func (srv *Database) ListDocuments(CollectionId string, Filters []interface{}, Offset int, Limit int, OrderField string, OrderType string, OrderCast string, Search string, First int, Last int) (map[string]interface{}, error) { + r := strings.NewReplacer("{collectionId}", CollectionId) + path := r.Replace("/database/{collectionId}/documents") + + params := map[string]interface{}{ + "filters": Filters, + "offset": Offset, + "limit": Limit, + "order-field": OrderField, + "order-type": OrderType, + "order-cast": OrderCast, + "search": Search, + "first": First, + "last": Last, + } + + return srv.client.Call("GET", path, nil, params) +} + +// CreateDocument create a new Document. +func (srv *Database) CreateDocument(CollectionId string, Data string, Read []interface{}, Write []interface{}, ParentDocument string, ParentProperty string, ParentPropertyType string) (map[string]interface{}, error) { + r := strings.NewReplacer("{collectionId}", CollectionId) + path := r.Replace("/database/{collectionId}/documents") + + params := map[string]interface{}{ + "data": Data, + "read": Read, + "write": Write, + "parentDocument": ParentDocument, + "parentProperty": ParentProperty, + "parentPropertyType": ParentPropertyType, + } + + return srv.client.Call("POST", path, nil, params) +} + +// GetDocument get document by its unique ID. This endpoint response returns a +// JSON object with the document data. +func (srv *Database) GetDocument(CollectionId string, DocumentId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) + path := r.Replace("/database/{collectionId}/documents/{documentId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// UpdateDocument +func (srv *Database) UpdateDocument(CollectionId string, DocumentId string, Data string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { + r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) + path := r.Replace("/database/{collectionId}/documents/{documentId}") + + params := map[string]interface{}{ + "data": Data, + "read": Read, + "write": Write, + } + + return srv.client.Call("PATCH", path, nil, params) +} + +// DeleteDocument delete document by its unique ID. This endpoint deletes only +// the parent documents, his attributes and relations to other documents. +// Child documents **will not** be deleted. +func (srv *Database) DeleteDocument(CollectionId string, DocumentId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) + path := r.Replace("/database/{collectionId}/documents/{documentId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} diff --git a/app/sdks/go/docs/examples/avatars/get-browser.md b/app/sdks/go/docs/examples/avatars/get-browser.md new file mode 100644 index 0000000000..4e1f0b13c3 --- /dev/null +++ b/app/sdks/go/docs/examples/avatars/get-browser.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client + } + + // Call GetBrowser method and handle results + var res, err := srv.GetBrowser("aa") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-credit-card.md b/app/sdks/go/docs/examples/avatars/get-credit-card.md new file mode 100644 index 0000000000..1ef37d9fe3 --- /dev/null +++ b/app/sdks/go/docs/examples/avatars/get-credit-card.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client + } + + // Call GetCreditCard method and handle results + var res, err := srv.GetCreditCard("amex") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-favicon.md b/app/sdks/go/docs/examples/avatars/get-favicon.md new file mode 100644 index 0000000000..f375a7bc6c --- /dev/null +++ b/app/sdks/go/docs/examples/avatars/get-favicon.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client + } + + // Call GetFavicon method and handle results + var res, err := srv.GetFavicon("https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-flag.md b/app/sdks/go/docs/examples/avatars/get-flag.md new file mode 100644 index 0000000000..5658f5e1cc --- /dev/null +++ b/app/sdks/go/docs/examples/avatars/get-flag.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client + } + + // Call GetFlag method and handle results + var res, err := srv.GetFlag("af") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-image.md b/app/sdks/go/docs/examples/avatars/get-image.md new file mode 100644 index 0000000000..1ab511eecf --- /dev/null +++ b/app/sdks/go/docs/examples/avatars/get-image.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client + } + + // Call GetImage method and handle results + var res, err := srv.GetImage("https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-q-r.md b/app/sdks/go/docs/examples/avatars/get-q-r.md new file mode 100644 index 0000000000..14c54b494c --- /dev/null +++ b/app/sdks/go/docs/examples/avatars/get-q-r.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Avatars service passing Client + var srv := appwrite.Avatars{ + client: &client + } + + // Call GetQR method and handle results + var res, err := srv.GetQR("[TEXT]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/create-collection.md b/app/sdks/go/docs/examples/database/create-collection.md new file mode 100644 index 0000000000..57bd03cfd1 --- /dev/null +++ b/app/sdks/go/docs/examples/database/create-collection.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call CreateCollection method and handle results + var res, err := srv.CreateCollection("[NAME]", [], [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/create-document.md b/app/sdks/go/docs/examples/database/create-document.md new file mode 100644 index 0000000000..b3c7818222 --- /dev/null +++ b/app/sdks/go/docs/examples/database/create-document.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call CreateDocument method and handle results + var res, err := srv.CreateDocument("[COLLECTION_ID]", "{}", [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/delete-collection.md b/app/sdks/go/docs/examples/database/delete-collection.md new file mode 100644 index 0000000000..a2c4056ce8 --- /dev/null +++ b/app/sdks/go/docs/examples/database/delete-collection.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call DeleteCollection method and handle results + var res, err := srv.DeleteCollection("[COLLECTION_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/delete-document.md b/app/sdks/go/docs/examples/database/delete-document.md new file mode 100644 index 0000000000..69cde9fb0f --- /dev/null +++ b/app/sdks/go/docs/examples/database/delete-document.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call DeleteDocument method and handle results + var res, err := srv.DeleteDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/get-collection.md b/app/sdks/go/docs/examples/database/get-collection.md new file mode 100644 index 0000000000..e60e590c14 --- /dev/null +++ b/app/sdks/go/docs/examples/database/get-collection.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call GetCollection method and handle results + var res, err := srv.GetCollection("[COLLECTION_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/get-document.md b/app/sdks/go/docs/examples/database/get-document.md new file mode 100644 index 0000000000..90fd6a2b76 --- /dev/null +++ b/app/sdks/go/docs/examples/database/get-document.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call GetDocument method and handle results + var res, err := srv.GetDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/list-collections.md b/app/sdks/go/docs/examples/database/list-collections.md new file mode 100644 index 0000000000..b6cc1830aa --- /dev/null +++ b/app/sdks/go/docs/examples/database/list-collections.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call ListCollections method and handle results + var res, err := srv.ListCollections() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/list-documents.md b/app/sdks/go/docs/examples/database/list-documents.md new file mode 100644 index 0000000000..5f7aec3672 --- /dev/null +++ b/app/sdks/go/docs/examples/database/list-documents.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call ListDocuments method and handle results + var res, err := srv.ListDocuments("[COLLECTION_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/update-collection.md b/app/sdks/go/docs/examples/database/update-collection.md new file mode 100644 index 0000000000..79b1ab25b6 --- /dev/null +++ b/app/sdks/go/docs/examples/database/update-collection.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call UpdateCollection method and handle results + var res, err := srv.UpdateCollection("[COLLECTION_ID]", "[NAME]", [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/update-document.md b/app/sdks/go/docs/examples/database/update-document.md new file mode 100644 index 0000000000..3ed43c454b --- /dev/null +++ b/app/sdks/go/docs/examples/database/update-document.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Database service passing Client + var srv := appwrite.Database{ + client: &client + } + + // Call UpdateDocument method and handle results + var res, err := srv.UpdateDocument("[COLLECTION_ID]", "[DOCUMENT_ID]", "{}", [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-continents.md b/app/sdks/go/docs/examples/locale/get-continents.md new file mode 100644 index 0000000000..d707b900c2 --- /dev/null +++ b/app/sdks/go/docs/examples/locale/get-continents.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client + } + + // Call GetContinents method and handle results + var res, err := srv.GetContinents() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-countries-e-u.md b/app/sdks/go/docs/examples/locale/get-countries-e-u.md new file mode 100644 index 0000000000..f3f2146bee --- /dev/null +++ b/app/sdks/go/docs/examples/locale/get-countries-e-u.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client + } + + // Call GetCountriesEU method and handle results + var res, err := srv.GetCountriesEU() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-countries-phones.md b/app/sdks/go/docs/examples/locale/get-countries-phones.md new file mode 100644 index 0000000000..21a2d163b5 --- /dev/null +++ b/app/sdks/go/docs/examples/locale/get-countries-phones.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client + } + + // Call GetCountriesPhones method and handle results + var res, err := srv.GetCountriesPhones() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-countries.md b/app/sdks/go/docs/examples/locale/get-countries.md new file mode 100644 index 0000000000..9f81721e70 --- /dev/null +++ b/app/sdks/go/docs/examples/locale/get-countries.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client + } + + // Call GetCountries method and handle results + var res, err := srv.GetCountries() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-currencies.md b/app/sdks/go/docs/examples/locale/get-currencies.md new file mode 100644 index 0000000000..752a99de3c --- /dev/null +++ b/app/sdks/go/docs/examples/locale/get-currencies.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client + } + + // Call GetCurrencies method and handle results + var res, err := srv.GetCurrencies() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-locale.md b/app/sdks/go/docs/examples/locale/get-locale.md new file mode 100644 index 0000000000..d8e8ed1127 --- /dev/null +++ b/app/sdks/go/docs/examples/locale/get-locale.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Locale service passing Client + var srv := appwrite.Locale{ + client: &client + } + + // Call GetLocale method and handle results + var res, err := srv.GetLocale() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/create-file.md b/app/sdks/go/docs/examples/storage/create-file.md new file mode 100644 index 0000000000..bb55c63d3d --- /dev/null +++ b/app/sdks/go/docs/examples/storage/create-file.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client + } + + // Call CreateFile method and handle results + var res, err := srv.CreateFile(file, [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/delete-file.md b/app/sdks/go/docs/examples/storage/delete-file.md new file mode 100644 index 0000000000..e2eea09d9a --- /dev/null +++ b/app/sdks/go/docs/examples/storage/delete-file.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client + } + + // Call DeleteFile method and handle results + var res, err := srv.DeleteFile("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file-download.md b/app/sdks/go/docs/examples/storage/get-file-download.md new file mode 100644 index 0000000000..e8c6343391 --- /dev/null +++ b/app/sdks/go/docs/examples/storage/get-file-download.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client + } + + // Call GetFileDownload method and handle results + var res, err := srv.GetFileDownload("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file-preview.md b/app/sdks/go/docs/examples/storage/get-file-preview.md new file mode 100644 index 0000000000..6fa084376b --- /dev/null +++ b/app/sdks/go/docs/examples/storage/get-file-preview.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client + } + + // Call GetFilePreview method and handle results + var res, err := srv.GetFilePreview("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file-view.md b/app/sdks/go/docs/examples/storage/get-file-view.md new file mode 100644 index 0000000000..6c664bcb24 --- /dev/null +++ b/app/sdks/go/docs/examples/storage/get-file-view.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client + } + + // Call GetFileView method and handle results + var res, err := srv.GetFileView("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file.md b/app/sdks/go/docs/examples/storage/get-file.md new file mode 100644 index 0000000000..766b3dc8da --- /dev/null +++ b/app/sdks/go/docs/examples/storage/get-file.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client + } + + // Call GetFile method and handle results + var res, err := srv.GetFile("[FILE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/list-files.md b/app/sdks/go/docs/examples/storage/list-files.md new file mode 100644 index 0000000000..654aba9a8b --- /dev/null +++ b/app/sdks/go/docs/examples/storage/list-files.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client + } + + // Call ListFiles method and handle results + var res, err := srv.ListFiles() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/update-file.md b/app/sdks/go/docs/examples/storage/update-file.md new file mode 100644 index 0000000000..b9d6b981de --- /dev/null +++ b/app/sdks/go/docs/examples/storage/update-file.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Storage service passing Client + var srv := appwrite.Storage{ + client: &client + } + + // Call UpdateFile method and handle results + var res, err := srv.UpdateFile("[FILE_ID]", [], []) + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/create-team-membership.md b/app/sdks/go/docs/examples/teams/create-team-membership.md new file mode 100644 index 0000000000..894c4aef5b --- /dev/null +++ b/app/sdks/go/docs/examples/teams/create-team-membership.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client + } + + // Call CreateTeamMembership method and handle results + var res, err := srv.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/create-team.md b/app/sdks/go/docs/examples/teams/create-team.md new file mode 100644 index 0000000000..c8b4ee95e6 --- /dev/null +++ b/app/sdks/go/docs/examples/teams/create-team.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client + } + + // Call CreateTeam method and handle results + var res, err := srv.CreateTeam("[NAME]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/delete-team-membership.md b/app/sdks/go/docs/examples/teams/delete-team-membership.md new file mode 100644 index 0000000000..1f35436bbc --- /dev/null +++ b/app/sdks/go/docs/examples/teams/delete-team-membership.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client + } + + // Call DeleteTeamMembership method and handle results + var res, err := srv.DeleteTeamMembership("[TEAM_ID]", "[INVITE_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/delete-team.md b/app/sdks/go/docs/examples/teams/delete-team.md new file mode 100644 index 0000000000..91a52df484 --- /dev/null +++ b/app/sdks/go/docs/examples/teams/delete-team.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client + } + + // Call DeleteTeam method and handle results + var res, err := srv.DeleteTeam("[TEAM_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/get-team-memberships.md b/app/sdks/go/docs/examples/teams/get-team-memberships.md new file mode 100644 index 0000000000..3f5decbc90 --- /dev/null +++ b/app/sdks/go/docs/examples/teams/get-team-memberships.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client + } + + // Call GetTeamMemberships method and handle results + var res, err := srv.GetTeamMemberships("[TEAM_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/get-team.md b/app/sdks/go/docs/examples/teams/get-team.md new file mode 100644 index 0000000000..117dcbf94c --- /dev/null +++ b/app/sdks/go/docs/examples/teams/get-team.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client + } + + // Call GetTeam method and handle results + var res, err := srv.GetTeam("[TEAM_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/list-teams.md b/app/sdks/go/docs/examples/teams/list-teams.md new file mode 100644 index 0000000000..71b5fb04ea --- /dev/null +++ b/app/sdks/go/docs/examples/teams/list-teams.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client + } + + // Call ListTeams method and handle results + var res, err := srv.ListTeams() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/update-team.md b/app/sdks/go/docs/examples/teams/update-team.md new file mode 100644 index 0000000000..33de23cdd6 --- /dev/null +++ b/app/sdks/go/docs/examples/teams/update-team.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Teams service passing Client + var srv := appwrite.Teams{ + client: &client + } + + // Call UpdateTeam method and handle results + var res, err := srv.UpdateTeam("[TEAM_ID]", "[NAME]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/create-user.md b/app/sdks/go/docs/examples/users/create-user.md new file mode 100644 index 0000000000..0ad8fcfbb3 --- /dev/null +++ b/app/sdks/go/docs/examples/users/create-user.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call CreateUser method and handle results + var res, err := srv.CreateUser("email@example.com", "password") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/delete-user-session.md b/app/sdks/go/docs/examples/users/delete-user-session.md new file mode 100644 index 0000000000..2e63b205e3 --- /dev/null +++ b/app/sdks/go/docs/examples/users/delete-user-session.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call DeleteUserSession method and handle results + var res, err := srv.DeleteUserSession("[USER_ID]", "[SESSION_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/delete-user-sessions.md b/app/sdks/go/docs/examples/users/delete-user-sessions.md new file mode 100644 index 0000000000..eb08458c9f --- /dev/null +++ b/app/sdks/go/docs/examples/users/delete-user-sessions.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call DeleteUserSessions method and handle results + var res, err := srv.DeleteUserSessions("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/get-user-logs.md b/app/sdks/go/docs/examples/users/get-user-logs.md new file mode 100644 index 0000000000..a17455f86a --- /dev/null +++ b/app/sdks/go/docs/examples/users/get-user-logs.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call GetUserLogs method and handle results + var res, err := srv.GetUserLogs("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/get-user-prefs.md b/app/sdks/go/docs/examples/users/get-user-prefs.md new file mode 100644 index 0000000000..e161a3694c --- /dev/null +++ b/app/sdks/go/docs/examples/users/get-user-prefs.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call GetUserPrefs method and handle results + var res, err := srv.GetUserPrefs("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/get-user-sessions.md b/app/sdks/go/docs/examples/users/get-user-sessions.md new file mode 100644 index 0000000000..d88d75e39f --- /dev/null +++ b/app/sdks/go/docs/examples/users/get-user-sessions.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call GetUserSessions method and handle results + var res, err := srv.GetUserSessions("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/get-user.md b/app/sdks/go/docs/examples/users/get-user.md new file mode 100644 index 0000000000..9072765f96 --- /dev/null +++ b/app/sdks/go/docs/examples/users/get-user.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call GetUser method and handle results + var res, err := srv.GetUser("[USER_ID]") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/list-users.md b/app/sdks/go/docs/examples/users/list-users.md new file mode 100644 index 0000000000..0c85dafd3b --- /dev/null +++ b/app/sdks/go/docs/examples/users/list-users.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call ListUsers method and handle results + var res, err := srv.ListUsers() + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/update-user-prefs.md b/app/sdks/go/docs/examples/users/update-user-prefs.md new file mode 100644 index 0000000000..333c19a4e6 --- /dev/null +++ b/app/sdks/go/docs/examples/users/update-user-prefs.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call UpdateUserPrefs method and handle results + var res, err := srv.UpdateUserPrefs("[USER_ID]", "") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/update-user-status.md b/app/sdks/go/docs/examples/users/update-user-status.md new file mode 100644 index 0000000000..914f62dc25 --- /dev/null +++ b/app/sdks/go/docs/examples/users/update-user-status.md @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "os" + "github.com/appwrite/sdk-for-go" +) + +func main() { + // Create a Client + var client := appwrite.Client{} + + // Set Client required headers + client.SetProject("") + client.SetKey("") + + // Create a new Users service passing Client + var srv := appwrite.Users{ + client: &client + } + + // Call UpdateUserStatus method and handle results + var res, err := srv.UpdateUserStatus("[USER_ID]", "1") + if err != nil { + panic(err) + } + + fmt.Println(res) +} \ No newline at end of file diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go new file mode 100644 index 0000000000..cf6a0cfdd3 --- /dev/null +++ b/app/sdks/go/locale.go @@ -0,0 +1,80 @@ +package appwrite + +import ( +) + +// Locale service +type Locale struct { + client *Client +} + +// GetLocale get the current user location based on IP. Returns an object with +// user country code, country name, continent name, continent code, ip address +// and suggested currency. You can use the locale header to get the data in a +// supported language. +// +// ([IP Geolocation by DB-IP](https://db-ip.com)) +func (srv *Locale) GetLocale() (map[string]interface{}, error) { + path := "/locale" + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetContinents list of all continents. You can use the locale header to get +// the data in a supported language. +func (srv *Locale) GetContinents() (map[string]interface{}, error) { + path := "/locale/continents" + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetCountries list of all countries. You can use the locale header to get +// the data in a supported language. +func (srv *Locale) GetCountries() (map[string]interface{}, error) { + path := "/locale/countries" + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetCountriesEU list of all countries that are currently members of the EU. +// You can use the locale header to get the data in a supported language. +func (srv *Locale) GetCountriesEU() (map[string]interface{}, error) { + path := "/locale/countries/eu" + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetCountriesPhones list of all countries phone codes. You can use the +// locale header to get the data in a supported language. +func (srv *Locale) GetCountriesPhones() (map[string]interface{}, error) { + path := "/locale/countries/phones" + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetCurrencies list of all currencies, including currency symol, name, +// plural, and decimal digits for all major and minor currencies. You can use +// the locale header to get the data in a supported language. +func (srv *Locale) GetCurrencies() (map[string]interface{}, error) { + path := "/locale/currencies" + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} diff --git a/app/sdks/go/main.go b/app/sdks/go/main.go new file mode 100644 index 0000000000..13df7fc1b5 --- /dev/null +++ b/app/sdks/go/main.go @@ -0,0 +1,6 @@ +package appwrite + +// NewClient initializes a new Appwrite client +func NewClient() Client { + return Client{} +} diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go new file mode 100644 index 0000000000..e4edd23bf4 --- /dev/null +++ b/app/sdks/go/storage.go @@ -0,0 +1,126 @@ +package appwrite + +import ( + "strings" +) + +// Storage service +type Storage struct { + client *Client +} + +// ListFiles get a list of all the user files. You can use the query params to +// filter your results. On admin mode, this endpoint will return a list of all +// of the project files. [Learn more about different API modes](/docs/admin). +func (srv *Storage) ListFiles(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { + path := "/storage/files" + + params := map[string]interface{}{ + "search": Search, + "limit": Limit, + "offset": Offset, + "orderType": OrderType, + } + + return srv.client.Call("GET", path, nil, params) +} + +// CreateFile create a new file. The user who creates the file will +// automatically be assigned to read and write access unless he has passed +// custom values for read and write arguments. +func (srv *Storage) CreateFile(File string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { + path := "/storage/files" + + params := map[string]interface{}{ + "file": File, + "read": Read, + "write": Write, + } + + return srv.client.Call("POST", path, nil, params) +} + +// GetFile get file by its unique ID. This endpoint response returns a JSON +// object with the file metadata. +func (srv *Storage) GetFile(FileId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{fileId}", FileId) + path := r.Replace("/storage/files/{fileId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// UpdateFile update file by its unique ID. Only users with write permissions +// have access to update this resource. +func (srv *Storage) UpdateFile(FileId string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { + r := strings.NewReplacer("{fileId}", FileId) + path := r.Replace("/storage/files/{fileId}") + + params := map[string]interface{}{ + "read": Read, + "write": Write, + } + + return srv.client.Call("PUT", path, nil, params) +} + +// DeleteFile delete a file by its unique ID. Only users with write +// permissions have access to delete this resource. +func (srv *Storage) DeleteFile(FileId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{fileId}", FileId) + path := r.Replace("/storage/files/{fileId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} + +// GetFileDownload get file content by its unique ID. The endpoint response +// return with a 'Content-Disposition: attachment' header that tells the +// browser to start downloading the file to user downloads directory. +func (srv *Storage) GetFileDownload(FileId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{fileId}", FileId) + path := r.Replace("/storage/files/{fileId}/download") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetFilePreview get a file preview image. Currently, this method supports +// preview for image files (jpg, png, and gif), other supported formats, like +// pdf, docs, slides, and spreadsheets, will return the file icon image. You +// can also pass query string arguments for cutting and resizing your preview +// image. +func (srv *Storage) GetFilePreview(FileId string, Width int, Height int, Quality int, Background string, Output string) (map[string]interface{}, error) { + r := strings.NewReplacer("{fileId}", FileId) + path := r.Replace("/storage/files/{fileId}/preview") + + params := map[string]interface{}{ + "width": Width, + "height": Height, + "quality": Quality, + "background": Background, + "output": Output, + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetFileView get file content by its unique ID. This endpoint is similar to +// the download method but returns with no 'Content-Disposition: attachment' +// header. +func (srv *Storage) GetFileView(FileId string, As string) (map[string]interface{}, error) { + r := strings.NewReplacer("{fileId}", FileId) + path := r.Replace("/storage/files/{fileId}/view") + + params := map[string]interface{}{ + "as": As, + } + + return srv.client.Call("GET", path, nil, params) +} diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go new file mode 100644 index 0000000000..925275f733 --- /dev/null +++ b/app/sdks/go/teams.go @@ -0,0 +1,132 @@ +package appwrite + +import ( + "strings" +) + +// Teams service +type Teams struct { + client *Client +} + +// ListTeams get a list of all the current user teams. You can use the query +// params to filter your results. On admin mode, this endpoint will return a +// list of all of the project teams. [Learn more about different API +// modes](/docs/admin). +func (srv *Teams) ListTeams(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { + path := "/teams" + + params := map[string]interface{}{ + "search": Search, + "limit": Limit, + "offset": Offset, + "orderType": OrderType, + } + + return srv.client.Call("GET", path, nil, params) +} + +// CreateTeam create a new team. The user who creates the team will +// automatically be assigned as the owner of the team. The team owner can +// invite new members, who will be able add new owners and update or delete +// the team from your project. +func (srv *Teams) CreateTeam(Name string, Roles []interface{}) (map[string]interface{}, error) { + path := "/teams" + + params := map[string]interface{}{ + "name": Name, + "roles": Roles, + } + + return srv.client.Call("POST", path, nil, params) +} + +// GetTeam get team by its unique ID. All team members have read access for +// this resource. +func (srv *Teams) GetTeam(TeamId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{teamId}", TeamId) + path := r.Replace("/teams/{teamId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// UpdateTeam update team by its unique ID. Only team owners have write access +// for this resource. +func (srv *Teams) UpdateTeam(TeamId string, Name string) (map[string]interface{}, error) { + r := strings.NewReplacer("{teamId}", TeamId) + path := r.Replace("/teams/{teamId}") + + params := map[string]interface{}{ + "name": Name, + } + + return srv.client.Call("PUT", path, nil, params) +} + +// DeleteTeam delete team by its unique ID. Only team owners have write access +// for this resource. +func (srv *Teams) DeleteTeam(TeamId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{teamId}", TeamId) + path := r.Replace("/teams/{teamId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} + +// GetTeamMemberships get team members by the team unique ID. All team members +// have read access for this list of resources. +func (srv *Teams) GetTeamMemberships(TeamId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{teamId}", TeamId) + path := r.Replace("/teams/{teamId}/memberships") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// CreateTeamMembership use this endpoint to invite a new member to your team. +// An email with a link to join the team will be sent to the new member email +// address. If member doesn't exists in the project it will be automatically +// created. +// +// Use the 'url' parameter to redirect the user from the invitation email back +// to your app. When the user is redirected, use the [Update Team Membership +// Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join +// the user to the team. +// +// Please note that in order to avoid a [Redirect +// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) +// the only valid redirect URL's are the once from domains you have set when +// added your platforms in the console interface. +func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []interface{}, Url string, Name string) (map[string]interface{}, error) { + r := strings.NewReplacer("{teamId}", TeamId) + path := r.Replace("/teams/{teamId}/memberships") + + params := map[string]interface{}{ + "email": Email, + "name": Name, + "roles": Roles, + "url": Url, + } + + return srv.client.Call("POST", path, nil, params) +} + +// DeleteTeamMembership this endpoint allows a user to leave a team or for a +// team owner to delete the membership of any other team member. You can also +// use this endpoint to delete a user membership even if he didn't accept it. +func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{teamId}", TeamId, "{inviteId}", InviteId) + path := r.Replace("/teams/{teamId}/memberships/{inviteId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} diff --git a/app/sdks/go/users.go b/app/sdks/go/users.go new file mode 100644 index 0000000000..6ef84d510a --- /dev/null +++ b/app/sdks/go/users.go @@ -0,0 +1,130 @@ +package appwrite + +import ( + "strings" +) + +// Users service +type Users struct { + client *Client +} + +// ListUsers get a list of all the project users. You can use the query params +// to filter your results. +func (srv *Users) ListUsers(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { + path := "/users" + + params := map[string]interface{}{ + "search": Search, + "limit": Limit, + "offset": Offset, + "orderType": OrderType, + } + + return srv.client.Call("GET", path, nil, params) +} + +// CreateUser create a new user. +func (srv *Users) CreateUser(Email string, Password string, Name string) (map[string]interface{}, error) { + path := "/users" + + params := map[string]interface{}{ + "email": Email, + "password": Password, + "name": Name, + } + + return srv.client.Call("POST", path, nil, params) +} + +// GetUser get user by its unique ID. +func (srv *Users) GetUser(UserId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{userId}", UserId) + path := r.Replace("/users/{userId}") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetUserLogs get user activity logs list by its unique ID. +func (srv *Users) GetUserLogs(UserId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{userId}", UserId) + path := r.Replace("/users/{userId}/logs") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// GetUserPrefs get user preferences by its unique ID. +func (srv *Users) GetUserPrefs(UserId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{userId}", UserId) + path := r.Replace("/users/{userId}/prefs") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// UpdateUserPrefs update user preferences by its unique ID. You can pass only +// the specific settings you wish to update. +func (srv *Users) UpdateUserPrefs(UserId string, Prefs string) (map[string]interface{}, error) { + r := strings.NewReplacer("{userId}", UserId) + path := r.Replace("/users/{userId}/prefs") + + params := map[string]interface{}{ + "prefs": Prefs, + } + + return srv.client.Call("PATCH", path, nil, params) +} + +// GetUserSessions get user sessions list by its unique ID. +func (srv *Users) GetUserSessions(UserId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{userId}", UserId) + path := r.Replace("/users/{userId}/sessions") + + params := map[string]interface{}{ + } + + return srv.client.Call("GET", path, nil, params) +} + +// DeleteUserSessions delete all user sessions by its unique ID. +func (srv *Users) DeleteUserSessions(UserId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{userId}", UserId) + path := r.Replace("/users/{userId}/sessions") + + params := map[string]interface{}{ + } + + return srv.client.Call("DELETE", path, nil, params) +} + +// DeleteUserSession delete user sessions by its unique ID. +func (srv *Users) DeleteUserSession(UserId string, SessionId string) (map[string]interface{}, error) { + r := strings.NewReplacer("{userId}", UserId) + path := r.Replace("/users/{userId}/sessions/:session") + + params := map[string]interface{}{ + "sessionId": SessionId, + } + + return srv.client.Call("DELETE", path, nil, params) +} + +// UpdateUserStatus update user status by its unique ID. +func (srv *Users) UpdateUserStatus(UserId string, Status string) (map[string]interface{}, error) { + r := strings.NewReplacer("{userId}", UserId) + path := r.Replace("/users/{userId}/status") + + params := map[string]interface{}{ + "status": Status, + } + + return srv.client.Call("PATCH", path, nil, params) +} diff --git a/app/sdks/go/utils.go b/app/sdks/go/utils.go new file mode 100644 index 0000000000..ca36149cf1 --- /dev/null +++ b/app/sdks/go/utils.go @@ -0,0 +1,36 @@ +package appwrite + +import ( + "fmt" + "reflect" + "strconv" +) + +// ToString changes arg to string +func ToString(arg interface{}) string { + var tmp = reflect.Indirect(reflect.ValueOf(arg)).Interface() + switch v := tmp.(type) { + case int: + return strconv.Itoa(v) + case int8: + return strconv.FormatInt(int64(v), 10) + case int16: + return strconv.FormatInt(int64(v), 10) + case int32: + return strconv.FormatInt(int64(v), 10) + case int64: + return strconv.FormatInt(v, 10) + case string: + return v + case float32: + return strconv.FormatFloat(float64(v), 'f', -1, 32) + case float64: + return strconv.FormatFloat(v, 'f', -1, 64) + case fmt.Stringer: + return v.String() + case reflect.Value: + return ToString(v.Interface()) + default: + return "" + } +} From 645260e279d4fe20e12ce236d35f89371fc36413 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 18:42:11 +0200 Subject: [PATCH 107/237] Updated examples --- app/sdks/go/docs/examples/avatars/get-browser.md | 15 ++++++--------- .../go/docs/examples/avatars/get-credit-card.md | 15 ++++++--------- app/sdks/go/docs/examples/avatars/get-favicon.md | 15 ++++++--------- app/sdks/go/docs/examples/avatars/get-flag.md | 15 ++++++--------- app/sdks/go/docs/examples/avatars/get-image.md | 15 ++++++--------- app/sdks/go/docs/examples/avatars/get-q-r.md | 15 ++++++--------- .../docs/examples/database/create-collection.md | 15 ++++++--------- .../go/docs/examples/database/create-document.md | 15 ++++++--------- .../docs/examples/database/delete-collection.md | 15 ++++++--------- .../go/docs/examples/database/delete-document.md | 15 ++++++--------- .../go/docs/examples/database/get-collection.md | 15 ++++++--------- .../go/docs/examples/database/get-document.md | 15 ++++++--------- .../go/docs/examples/database/list-collections.md | 15 ++++++--------- .../go/docs/examples/database/list-documents.md | 15 ++++++--------- .../docs/examples/database/update-collection.md | 15 ++++++--------- .../go/docs/examples/database/update-document.md | 15 ++++++--------- .../go/docs/examples/locale/get-continents.md | 15 ++++++--------- .../go/docs/examples/locale/get-countries-e-u.md | 15 ++++++--------- .../docs/examples/locale/get-countries-phones.md | 15 ++++++--------- app/sdks/go/docs/examples/locale/get-countries.md | 15 ++++++--------- .../go/docs/examples/locale/get-currencies.md | 15 ++++++--------- app/sdks/go/docs/examples/locale/get-locale.md | 15 ++++++--------- app/sdks/go/docs/examples/storage/create-file.md | 15 ++++++--------- app/sdks/go/docs/examples/storage/delete-file.md | 15 ++++++--------- .../go/docs/examples/storage/get-file-download.md | 15 ++++++--------- .../go/docs/examples/storage/get-file-preview.md | 15 ++++++--------- .../go/docs/examples/storage/get-file-view.md | 15 ++++++--------- app/sdks/go/docs/examples/storage/get-file.md | 15 ++++++--------- app/sdks/go/docs/examples/storage/list-files.md | 15 ++++++--------- app/sdks/go/docs/examples/storage/update-file.md | 15 ++++++--------- .../docs/examples/teams/create-team-membership.md | 15 ++++++--------- app/sdks/go/docs/examples/teams/create-team.md | 15 ++++++--------- .../docs/examples/teams/delete-team-membership.md | 15 ++++++--------- app/sdks/go/docs/examples/teams/delete-team.md | 15 ++++++--------- .../docs/examples/teams/get-team-memberships.md | 15 ++++++--------- app/sdks/go/docs/examples/teams/get-team.md | 15 ++++++--------- app/sdks/go/docs/examples/teams/list-teams.md | 15 ++++++--------- app/sdks/go/docs/examples/teams/update-team.md | 15 ++++++--------- app/sdks/go/docs/examples/users/create-user.md | 15 ++++++--------- .../go/docs/examples/users/delete-user-session.md | 15 ++++++--------- .../docs/examples/users/delete-user-sessions.md | 15 ++++++--------- app/sdks/go/docs/examples/users/get-user-logs.md | 15 ++++++--------- app/sdks/go/docs/examples/users/get-user-prefs.md | 15 ++++++--------- .../go/docs/examples/users/get-user-sessions.md | 15 ++++++--------- app/sdks/go/docs/examples/users/get-user.md | 15 ++++++--------- app/sdks/go/docs/examples/users/list-users.md | 15 ++++++--------- .../go/docs/examples/users/update-user-prefs.md | 15 ++++++--------- .../go/docs/examples/users/update-user-status.md | 15 ++++++--------- composer.lock | 4 ++-- 49 files changed, 290 insertions(+), 434 deletions(-) diff --git a/app/sdks/go/docs/examples/avatars/get-browser.md b/app/sdks/go/docs/examples/avatars/get-browser.md index 4e1f0b13c3..b9b879c3c0 100644 --- a/app/sdks/go/docs/examples/avatars/get-browser.md +++ b/app/sdks/go/docs/examples/avatars/get-browser.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ + var service := appwrite.Avatars{ client: &client } - // Call GetBrowser method and handle results - var res, err := srv.GetBrowser("aa") - if err != nil { - panic(err) + var response, error := service.GetBrowser("aa") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-credit-card.md b/app/sdks/go/docs/examples/avatars/get-credit-card.md index 1ef37d9fe3..109cbaf2d2 100644 --- a/app/sdks/go/docs/examples/avatars/get-credit-card.md +++ b/app/sdks/go/docs/examples/avatars/get-credit-card.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ + var service := appwrite.Avatars{ client: &client } - // Call GetCreditCard method and handle results - var res, err := srv.GetCreditCard("amex") - if err != nil { - panic(err) + var response, error := service.GetCreditCard("amex") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-favicon.md b/app/sdks/go/docs/examples/avatars/get-favicon.md index f375a7bc6c..034501b6ca 100644 --- a/app/sdks/go/docs/examples/avatars/get-favicon.md +++ b/app/sdks/go/docs/examples/avatars/get-favicon.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ + var service := appwrite.Avatars{ client: &client } - // Call GetFavicon method and handle results - var res, err := srv.GetFavicon("https://example.com") - if err != nil { - panic(err) + var response, error := service.GetFavicon("https://example.com") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-flag.md b/app/sdks/go/docs/examples/avatars/get-flag.md index 5658f5e1cc..ec87a5a920 100644 --- a/app/sdks/go/docs/examples/avatars/get-flag.md +++ b/app/sdks/go/docs/examples/avatars/get-flag.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ + var service := appwrite.Avatars{ client: &client } - // Call GetFlag method and handle results - var res, err := srv.GetFlag("af") - if err != nil { - panic(err) + var response, error := service.GetFlag("af") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-image.md b/app/sdks/go/docs/examples/avatars/get-image.md index 1ab511eecf..23ed84ae9b 100644 --- a/app/sdks/go/docs/examples/avatars/get-image.md +++ b/app/sdks/go/docs/examples/avatars/get-image.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ + var service := appwrite.Avatars{ client: &client } - // Call GetImage method and handle results - var res, err := srv.GetImage("https://example.com") - if err != nil { - panic(err) + var response, error := service.GetImage("https://example.com") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/avatars/get-q-r.md b/app/sdks/go/docs/examples/avatars/get-q-r.md index 14c54b494c..1438dabe7b 100644 --- a/app/sdks/go/docs/examples/avatars/get-q-r.md +++ b/app/sdks/go/docs/examples/avatars/get-q-r.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Avatars service passing Client - var srv := appwrite.Avatars{ + var service := appwrite.Avatars{ client: &client } - // Call GetQR method and handle results - var res, err := srv.GetQR("[TEXT]") - if err != nil { - panic(err) + var response, error := service.GetQR("[TEXT]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/create-collection.md b/app/sdks/go/docs/examples/database/create-collection.md index 57bd03cfd1..466dabb6d2 100644 --- a/app/sdks/go/docs/examples/database/create-collection.md +++ b/app/sdks/go/docs/examples/database/create-collection.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call CreateCollection method and handle results - var res, err := srv.CreateCollection("[NAME]", [], [], []) - if err != nil { - panic(err) + var response, error := service.CreateCollection("[NAME]", [], [], []) + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/create-document.md b/app/sdks/go/docs/examples/database/create-document.md index b3c7818222..94999bdb61 100644 --- a/app/sdks/go/docs/examples/database/create-document.md +++ b/app/sdks/go/docs/examples/database/create-document.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call CreateDocument method and handle results - var res, err := srv.CreateDocument("[COLLECTION_ID]", "{}", [], []) - if err != nil { - panic(err) + var response, error := service.CreateDocument("[COLLECTION_ID]", "{}", [], []) + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/delete-collection.md b/app/sdks/go/docs/examples/database/delete-collection.md index a2c4056ce8..da17177826 100644 --- a/app/sdks/go/docs/examples/database/delete-collection.md +++ b/app/sdks/go/docs/examples/database/delete-collection.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call DeleteCollection method and handle results - var res, err := srv.DeleteCollection("[COLLECTION_ID]") - if err != nil { - panic(err) + var response, error := service.DeleteCollection("[COLLECTION_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/delete-document.md b/app/sdks/go/docs/examples/database/delete-document.md index 69cde9fb0f..4097919945 100644 --- a/app/sdks/go/docs/examples/database/delete-document.md +++ b/app/sdks/go/docs/examples/database/delete-document.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call DeleteDocument method and handle results - var res, err := srv.DeleteDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") - if err != nil { - panic(err) + var response, error := service.DeleteDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/get-collection.md b/app/sdks/go/docs/examples/database/get-collection.md index e60e590c14..5512abb77d 100644 --- a/app/sdks/go/docs/examples/database/get-collection.md +++ b/app/sdks/go/docs/examples/database/get-collection.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call GetCollection method and handle results - var res, err := srv.GetCollection("[COLLECTION_ID]") - if err != nil { - panic(err) + var response, error := service.GetCollection("[COLLECTION_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/get-document.md b/app/sdks/go/docs/examples/database/get-document.md index 90fd6a2b76..5f8b8e12a2 100644 --- a/app/sdks/go/docs/examples/database/get-document.md +++ b/app/sdks/go/docs/examples/database/get-document.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call GetDocument method and handle results - var res, err := srv.GetDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") - if err != nil { - panic(err) + var response, error := service.GetDocument("[COLLECTION_ID]", "[DOCUMENT_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/list-collections.md b/app/sdks/go/docs/examples/database/list-collections.md index b6cc1830aa..7dfd834a0c 100644 --- a/app/sdks/go/docs/examples/database/list-collections.md +++ b/app/sdks/go/docs/examples/database/list-collections.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call ListCollections method and handle results - var res, err := srv.ListCollections() - if err != nil { - panic(err) + var response, error := service.ListCollections() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/list-documents.md b/app/sdks/go/docs/examples/database/list-documents.md index 5f7aec3672..d6e1592d77 100644 --- a/app/sdks/go/docs/examples/database/list-documents.md +++ b/app/sdks/go/docs/examples/database/list-documents.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call ListDocuments method and handle results - var res, err := srv.ListDocuments("[COLLECTION_ID]") - if err != nil { - panic(err) + var response, error := service.ListDocuments("[COLLECTION_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/update-collection.md b/app/sdks/go/docs/examples/database/update-collection.md index 79b1ab25b6..25aef91bab 100644 --- a/app/sdks/go/docs/examples/database/update-collection.md +++ b/app/sdks/go/docs/examples/database/update-collection.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call UpdateCollection method and handle results - var res, err := srv.UpdateCollection("[COLLECTION_ID]", "[NAME]", [], []) - if err != nil { - panic(err) + var response, error := service.UpdateCollection("[COLLECTION_ID]", "[NAME]", [], []) + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/database/update-document.md b/app/sdks/go/docs/examples/database/update-document.md index 3ed43c454b..11024fa232 100644 --- a/app/sdks/go/docs/examples/database/update-document.md +++ b/app/sdks/go/docs/examples/database/update-document.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Database service passing Client - var srv := appwrite.Database{ + var service := appwrite.Database{ client: &client } - // Call UpdateDocument method and handle results - var res, err := srv.UpdateDocument("[COLLECTION_ID]", "[DOCUMENT_ID]", "{}", [], []) - if err != nil { - panic(err) + var response, error := service.UpdateDocument("[COLLECTION_ID]", "[DOCUMENT_ID]", "{}", [], []) + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-continents.md b/app/sdks/go/docs/examples/locale/get-continents.md index d707b900c2..eb0cf13646 100644 --- a/app/sdks/go/docs/examples/locale/get-continents.md +++ b/app/sdks/go/docs/examples/locale/get-continents.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Locale service passing Client - var srv := appwrite.Locale{ + var service := appwrite.Locale{ client: &client } - // Call GetContinents method and handle results - var res, err := srv.GetContinents() - if err != nil { - panic(err) + var response, error := service.GetContinents() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-countries-e-u.md b/app/sdks/go/docs/examples/locale/get-countries-e-u.md index f3f2146bee..0aa7ed1be7 100644 --- a/app/sdks/go/docs/examples/locale/get-countries-e-u.md +++ b/app/sdks/go/docs/examples/locale/get-countries-e-u.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Locale service passing Client - var srv := appwrite.Locale{ + var service := appwrite.Locale{ client: &client } - // Call GetCountriesEU method and handle results - var res, err := srv.GetCountriesEU() - if err != nil { - panic(err) + var response, error := service.GetCountriesEU() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-countries-phones.md b/app/sdks/go/docs/examples/locale/get-countries-phones.md index 21a2d163b5..51d58fa377 100644 --- a/app/sdks/go/docs/examples/locale/get-countries-phones.md +++ b/app/sdks/go/docs/examples/locale/get-countries-phones.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Locale service passing Client - var srv := appwrite.Locale{ + var service := appwrite.Locale{ client: &client } - // Call GetCountriesPhones method and handle results - var res, err := srv.GetCountriesPhones() - if err != nil { - panic(err) + var response, error := service.GetCountriesPhones() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-countries.md b/app/sdks/go/docs/examples/locale/get-countries.md index 9f81721e70..adacc84edd 100644 --- a/app/sdks/go/docs/examples/locale/get-countries.md +++ b/app/sdks/go/docs/examples/locale/get-countries.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Locale service passing Client - var srv := appwrite.Locale{ + var service := appwrite.Locale{ client: &client } - // Call GetCountries method and handle results - var res, err := srv.GetCountries() - if err != nil { - panic(err) + var response, error := service.GetCountries() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-currencies.md b/app/sdks/go/docs/examples/locale/get-currencies.md index 752a99de3c..038c897103 100644 --- a/app/sdks/go/docs/examples/locale/get-currencies.md +++ b/app/sdks/go/docs/examples/locale/get-currencies.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Locale service passing Client - var srv := appwrite.Locale{ + var service := appwrite.Locale{ client: &client } - // Call GetCurrencies method and handle results - var res, err := srv.GetCurrencies() - if err != nil { - panic(err) + var response, error := service.GetCurrencies() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/locale/get-locale.md b/app/sdks/go/docs/examples/locale/get-locale.md index d8e8ed1127..1b6b24a3e2 100644 --- a/app/sdks/go/docs/examples/locale/get-locale.md +++ b/app/sdks/go/docs/examples/locale/get-locale.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Locale service passing Client - var srv := appwrite.Locale{ + var service := appwrite.Locale{ client: &client } - // Call GetLocale method and handle results - var res, err := srv.GetLocale() - if err != nil { - panic(err) + var response, error := service.GetLocale() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/create-file.md b/app/sdks/go/docs/examples/storage/create-file.md index bb55c63d3d..0d07428b5b 100644 --- a/app/sdks/go/docs/examples/storage/create-file.md +++ b/app/sdks/go/docs/examples/storage/create-file.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Storage service passing Client - var srv := appwrite.Storage{ + var service := appwrite.Storage{ client: &client } - // Call CreateFile method and handle results - var res, err := srv.CreateFile(file, [], []) - if err != nil { - panic(err) + var response, error := service.CreateFile(file, [], []) + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/delete-file.md b/app/sdks/go/docs/examples/storage/delete-file.md index e2eea09d9a..36ba7c7f28 100644 --- a/app/sdks/go/docs/examples/storage/delete-file.md +++ b/app/sdks/go/docs/examples/storage/delete-file.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Storage service passing Client - var srv := appwrite.Storage{ + var service := appwrite.Storage{ client: &client } - // Call DeleteFile method and handle results - var res, err := srv.DeleteFile("[FILE_ID]") - if err != nil { - panic(err) + var response, error := service.DeleteFile("[FILE_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file-download.md b/app/sdks/go/docs/examples/storage/get-file-download.md index e8c6343391..19837e8ae6 100644 --- a/app/sdks/go/docs/examples/storage/get-file-download.md +++ b/app/sdks/go/docs/examples/storage/get-file-download.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Storage service passing Client - var srv := appwrite.Storage{ + var service := appwrite.Storage{ client: &client } - // Call GetFileDownload method and handle results - var res, err := srv.GetFileDownload("[FILE_ID]") - if err != nil { - panic(err) + var response, error := service.GetFileDownload("[FILE_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file-preview.md b/app/sdks/go/docs/examples/storage/get-file-preview.md index 6fa084376b..6190b65379 100644 --- a/app/sdks/go/docs/examples/storage/get-file-preview.md +++ b/app/sdks/go/docs/examples/storage/get-file-preview.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Storage service passing Client - var srv := appwrite.Storage{ + var service := appwrite.Storage{ client: &client } - // Call GetFilePreview method and handle results - var res, err := srv.GetFilePreview("[FILE_ID]") - if err != nil { - panic(err) + var response, error := service.GetFilePreview("[FILE_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file-view.md b/app/sdks/go/docs/examples/storage/get-file-view.md index 6c664bcb24..c93f1829d3 100644 --- a/app/sdks/go/docs/examples/storage/get-file-view.md +++ b/app/sdks/go/docs/examples/storage/get-file-view.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Storage service passing Client - var srv := appwrite.Storage{ + var service := appwrite.Storage{ client: &client } - // Call GetFileView method and handle results - var res, err := srv.GetFileView("[FILE_ID]") - if err != nil { - panic(err) + var response, error := service.GetFileView("[FILE_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file.md b/app/sdks/go/docs/examples/storage/get-file.md index 766b3dc8da..bf0319ca55 100644 --- a/app/sdks/go/docs/examples/storage/get-file.md +++ b/app/sdks/go/docs/examples/storage/get-file.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Storage service passing Client - var srv := appwrite.Storage{ + var service := appwrite.Storage{ client: &client } - // Call GetFile method and handle results - var res, err := srv.GetFile("[FILE_ID]") - if err != nil { - panic(err) + var response, error := service.GetFile("[FILE_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/list-files.md b/app/sdks/go/docs/examples/storage/list-files.md index 654aba9a8b..0f8849410e 100644 --- a/app/sdks/go/docs/examples/storage/list-files.md +++ b/app/sdks/go/docs/examples/storage/list-files.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Storage service passing Client - var srv := appwrite.Storage{ + var service := appwrite.Storage{ client: &client } - // Call ListFiles method and handle results - var res, err := srv.ListFiles() - if err != nil { - panic(err) + var response, error := service.ListFiles() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/update-file.md b/app/sdks/go/docs/examples/storage/update-file.md index b9d6b981de..cef2982108 100644 --- a/app/sdks/go/docs/examples/storage/update-file.md +++ b/app/sdks/go/docs/examples/storage/update-file.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Storage service passing Client - var srv := appwrite.Storage{ + var service := appwrite.Storage{ client: &client } - // Call UpdateFile method and handle results - var res, err := srv.UpdateFile("[FILE_ID]", [], []) - if err != nil { - panic(err) + var response, error := service.UpdateFile("[FILE_ID]", [], []) + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/create-team-membership.md b/app/sdks/go/docs/examples/teams/create-team-membership.md index 894c4aef5b..6d03ace566 100644 --- a/app/sdks/go/docs/examples/teams/create-team-membership.md +++ b/app/sdks/go/docs/examples/teams/create-team-membership.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Teams service passing Client - var srv := appwrite.Teams{ + var service := appwrite.Teams{ client: &client } - // Call CreateTeamMembership method and handle results - var res, err := srv.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com") - if err != nil { - panic(err) + var response, error := service.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/create-team.md b/app/sdks/go/docs/examples/teams/create-team.md index c8b4ee95e6..f0c6d193b2 100644 --- a/app/sdks/go/docs/examples/teams/create-team.md +++ b/app/sdks/go/docs/examples/teams/create-team.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Teams service passing Client - var srv := appwrite.Teams{ + var service := appwrite.Teams{ client: &client } - // Call CreateTeam method and handle results - var res, err := srv.CreateTeam("[NAME]") - if err != nil { - panic(err) + var response, error := service.CreateTeam("[NAME]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/delete-team-membership.md b/app/sdks/go/docs/examples/teams/delete-team-membership.md index 1f35436bbc..c6a9b3129d 100644 --- a/app/sdks/go/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/go/docs/examples/teams/delete-team-membership.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Teams service passing Client - var srv := appwrite.Teams{ + var service := appwrite.Teams{ client: &client } - // Call DeleteTeamMembership method and handle results - var res, err := srv.DeleteTeamMembership("[TEAM_ID]", "[INVITE_ID]") - if err != nil { - panic(err) + var response, error := service.DeleteTeamMembership("[TEAM_ID]", "[INVITE_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/delete-team.md b/app/sdks/go/docs/examples/teams/delete-team.md index 91a52df484..9db700bd26 100644 --- a/app/sdks/go/docs/examples/teams/delete-team.md +++ b/app/sdks/go/docs/examples/teams/delete-team.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Teams service passing Client - var srv := appwrite.Teams{ + var service := appwrite.Teams{ client: &client } - // Call DeleteTeam method and handle results - var res, err := srv.DeleteTeam("[TEAM_ID]") - if err != nil { - panic(err) + var response, error := service.DeleteTeam("[TEAM_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/get-team-memberships.md b/app/sdks/go/docs/examples/teams/get-team-memberships.md index 3f5decbc90..a479684415 100644 --- a/app/sdks/go/docs/examples/teams/get-team-memberships.md +++ b/app/sdks/go/docs/examples/teams/get-team-memberships.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Teams service passing Client - var srv := appwrite.Teams{ + var service := appwrite.Teams{ client: &client } - // Call GetTeamMemberships method and handle results - var res, err := srv.GetTeamMemberships("[TEAM_ID]") - if err != nil { - panic(err) + var response, error := service.GetTeamMemberships("[TEAM_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/get-team.md b/app/sdks/go/docs/examples/teams/get-team.md index 117dcbf94c..948f91e4a6 100644 --- a/app/sdks/go/docs/examples/teams/get-team.md +++ b/app/sdks/go/docs/examples/teams/get-team.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Teams service passing Client - var srv := appwrite.Teams{ + var service := appwrite.Teams{ client: &client } - // Call GetTeam method and handle results - var res, err := srv.GetTeam("[TEAM_ID]") - if err != nil { - panic(err) + var response, error := service.GetTeam("[TEAM_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/list-teams.md b/app/sdks/go/docs/examples/teams/list-teams.md index 71b5fb04ea..9f5ba38e5d 100644 --- a/app/sdks/go/docs/examples/teams/list-teams.md +++ b/app/sdks/go/docs/examples/teams/list-teams.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Teams service passing Client - var srv := appwrite.Teams{ + var service := appwrite.Teams{ client: &client } - // Call ListTeams method and handle results - var res, err := srv.ListTeams() - if err != nil { - panic(err) + var response, error := service.ListTeams() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/update-team.md b/app/sdks/go/docs/examples/teams/update-team.md index 33de23cdd6..1f3cec4167 100644 --- a/app/sdks/go/docs/examples/teams/update-team.md +++ b/app/sdks/go/docs/examples/teams/update-team.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Teams service passing Client - var srv := appwrite.Teams{ + var service := appwrite.Teams{ client: &client } - // Call UpdateTeam method and handle results - var res, err := srv.UpdateTeam("[TEAM_ID]", "[NAME]") - if err != nil { - panic(err) + var response, error := service.UpdateTeam("[TEAM_ID]", "[NAME]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/create-user.md b/app/sdks/go/docs/examples/users/create-user.md index 0ad8fcfbb3..8b2335fa59 100644 --- a/app/sdks/go/docs/examples/users/create-user.md +++ b/app/sdks/go/docs/examples/users/create-user.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call CreateUser method and handle results - var res, err := srv.CreateUser("email@example.com", "password") - if err != nil { - panic(err) + var response, error := service.CreateUser("email@example.com", "password") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/delete-user-session.md b/app/sdks/go/docs/examples/users/delete-user-session.md index 2e63b205e3..3ecb54db4e 100644 --- a/app/sdks/go/docs/examples/users/delete-user-session.md +++ b/app/sdks/go/docs/examples/users/delete-user-session.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call DeleteUserSession method and handle results - var res, err := srv.DeleteUserSession("[USER_ID]", "[SESSION_ID]") - if err != nil { - panic(err) + var response, error := service.DeleteUserSession("[USER_ID]", "[SESSION_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/delete-user-sessions.md b/app/sdks/go/docs/examples/users/delete-user-sessions.md index eb08458c9f..b42c0dafb2 100644 --- a/app/sdks/go/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/go/docs/examples/users/delete-user-sessions.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call DeleteUserSessions method and handle results - var res, err := srv.DeleteUserSessions("[USER_ID]") - if err != nil { - panic(err) + var response, error := service.DeleteUserSessions("[USER_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/get-user-logs.md b/app/sdks/go/docs/examples/users/get-user-logs.md index a17455f86a..9190b6d19f 100644 --- a/app/sdks/go/docs/examples/users/get-user-logs.md +++ b/app/sdks/go/docs/examples/users/get-user-logs.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call GetUserLogs method and handle results - var res, err := srv.GetUserLogs("[USER_ID]") - if err != nil { - panic(err) + var response, error := service.GetUserLogs("[USER_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/get-user-prefs.md b/app/sdks/go/docs/examples/users/get-user-prefs.md index e161a3694c..b9db2f4e11 100644 --- a/app/sdks/go/docs/examples/users/get-user-prefs.md +++ b/app/sdks/go/docs/examples/users/get-user-prefs.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call GetUserPrefs method and handle results - var res, err := srv.GetUserPrefs("[USER_ID]") - if err != nil { - panic(err) + var response, error := service.GetUserPrefs("[USER_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/get-user-sessions.md b/app/sdks/go/docs/examples/users/get-user-sessions.md index d88d75e39f..99c27a3736 100644 --- a/app/sdks/go/docs/examples/users/get-user-sessions.md +++ b/app/sdks/go/docs/examples/users/get-user-sessions.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call GetUserSessions method and handle results - var res, err := srv.GetUserSessions("[USER_ID]") - if err != nil { - panic(err) + var response, error := service.GetUserSessions("[USER_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/get-user.md b/app/sdks/go/docs/examples/users/get-user.md index 9072765f96..f566b22a85 100644 --- a/app/sdks/go/docs/examples/users/get-user.md +++ b/app/sdks/go/docs/examples/users/get-user.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call GetUser method and handle results - var res, err := srv.GetUser("[USER_ID]") - if err != nil { - panic(err) + var response, error := service.GetUser("[USER_ID]") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/list-users.md b/app/sdks/go/docs/examples/users/list-users.md index 0c85dafd3b..f09e1631fe 100644 --- a/app/sdks/go/docs/examples/users/list-users.md +++ b/app/sdks/go/docs/examples/users/list-users.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call ListUsers method and handle results - var res, err := srv.ListUsers() - if err != nil { - panic(err) + var response, error := service.ListUsers() + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/update-user-prefs.md b/app/sdks/go/docs/examples/users/update-user-prefs.md index 333c19a4e6..308046c835 100644 --- a/app/sdks/go/docs/examples/users/update-user-prefs.md +++ b/app/sdks/go/docs/examples/users/update-user-prefs.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call UpdateUserPrefs method and handle results - var res, err := srv.UpdateUserPrefs("[USER_ID]", "") - if err != nil { - panic(err) + var response, error := service.UpdateUserPrefs("[USER_ID]", "") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/update-user-status.md b/app/sdks/go/docs/examples/users/update-user-status.md index 914f62dc25..8fc7707ff5 100644 --- a/app/sdks/go/docs/examples/users/update-user-status.md +++ b/app/sdks/go/docs/examples/users/update-user-status.md @@ -7,23 +7,20 @@ import ( ) func main() { - // Create a Client var client := appwrite.Client{} - // Set Client required headers client.SetProject("") client.SetKey("") - // Create a new Users service passing Client - var srv := appwrite.Users{ + var service := appwrite.Users{ client: &client } - // Call UpdateUserStatus method and handle results - var res, err := srv.UpdateUserStatus("[USER_ID]", "1") - if err != nil { - panic(err) + var response, error := service.UpdateUserStatus("[USER_ID]", "1") + + if error != nil { + panic(error) } - fmt.Println(res) + fmt.Println(response) } \ No newline at end of file diff --git a/composer.lock b/composer.lock index c5e3bf3d9d..a88ba9a83e 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "25dd3295fa5e1fd7877bd71539eadcde42ff55cf" + "reference": "95313319b1f27edff142c35108dc1742686fec99" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T13:46:34+00:00" + "time": "2020-01-28T16:38:02+00:00" }, { "name": "doctrine/instantiator", From c42e018b5f7945e0493936741f1eefdb2d85cb81 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 20:44:56 +0200 Subject: [PATCH 108/237] Updated Go client --- app/sdks/go/client.go | 2 +- composer.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/sdks/go/client.go b/app/sdks/go/client.go index 94f2546cff..945d2119be 100644 --- a/app/sdks/go/client.go +++ b/app/sdks/go/client.go @@ -2,7 +2,7 @@ package appwrite import ( "encoding/json" - "io/ioutil" + "io/ioutil" "net/http" "net/url" "strings" diff --git a/composer.lock b/composer.lock index a88ba9a83e..341a28cba6 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "95313319b1f27edff142c35108dc1742686fec99" + "reference": "7bf73743e7b68433cefac9d527b8c59477f7c275" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T16:38:02+00:00" + "time": "2020-01-28T18:34:55+00:00" }, { "name": "doctrine/instantiator", From 64783d9b284c8bf6d4fad1bb4ae56c80fc31f4d5 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 21:21:35 +0200 Subject: [PATCH 109/237] Updated go client --- app/sdks/go/client.go | 16 ++++++++-------- composer.lock | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/sdks/go/client.go b/app/sdks/go/client.go index 945d2119be..04cce21057 100644 --- a/app/sdks/go/client.go +++ b/app/sdks/go/client.go @@ -17,42 +17,42 @@ type Client struct { } // SetEndpoint sets the default endpoint to which the Client connects to -func (clt *Client) SetEndpoint(endpoint string) { +func (clt Client) SetEndpoint(endpoint string) { clt.endpoint = endpoint } // SetSelfSigned sets the condition that specify if the Client should allow connections to a server using a self-signed certificate -func (clt *Client) SetSelfSigned(status bool) { +func (clt Client) SetSelfSigned(status bool) { clt.selfSigned = status } // AddHeader add a new custom header that the Client should send on each request -func (clt *Client) AddHeader(key string, value string) { +func (clt Client) AddHeader(key string, value string) { clt.headers[key] = value } // SetProjectHeader add the 'X-Appwrite-Project' header for the Client. Your Appwrite project ID -func (clt *Client) SetProjectHeader(value string) { +func (clt Client) SetProjectHeader(value string) { clt.headers["X-Appwrite-Project"] = value } // SetKeyHeader add the 'X-Appwrite-Key' header for the Client. Your Appwrite project secret key -func (clt *Client) SetKeyHeader(value string) { +func (clt Client) SetKeyHeader(value string) { clt.headers["X-Appwrite-Key"] = value } // SetLocaleHeader add the 'X-Appwrite-Locale' header for the Client. -func (clt *Client) SetLocaleHeader(value string) { +func (clt Client) SetLocaleHeader(value string) { clt.headers["X-Appwrite-Locale"] = value } // SetModeHeader add the 'X-Appwrite-Mode' header for the Client. -func (clt *Client) SetModeHeader(value string) { +func (clt Client) SetModeHeader(value string) { clt.headers["X-Appwrite-Mode"] = value } // Call an API using Client -func (clt *Client) Call(method string, path string, headers map[string]interface{}, params map[string]interface{}) (map[string]interface{}, error) { +func (clt Client) Call(method string, path string, headers map[string]interface{}, params map[string]interface{}) (map[string]interface{}, error) { if clt.client == nil { // Create HTTP client clt.client = &http.Client{} diff --git a/composer.lock b/composer.lock index 341a28cba6..e8ca0634c3 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "7bf73743e7b68433cefac9d527b8c59477f7c275" + "reference": "3b6b20934658551872ee86bd6207a57ddb0b3200" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T18:34:55+00:00" + "time": "2020-01-28T19:15:00+00:00" }, { "name": "doctrine/instantiator", From 67468b518f91965d186a68c86405f0be7edb8c41 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 22:24:42 +0200 Subject: [PATCH 110/237] Updated Go SDK --- app/sdks/go/avatars.go | 2 +- app/sdks/go/client.go | 22 +++++++++---------- app/sdks/go/database.go | 2 +- .../go/docs/examples/avatars/get-browser.md | 1 - .../docs/examples/avatars/get-credit-card.md | 1 - .../go/docs/examples/avatars/get-favicon.md | 1 - app/sdks/go/docs/examples/avatars/get-flag.md | 1 - .../go/docs/examples/avatars/get-image.md | 1 - app/sdks/go/docs/examples/avatars/get-q-r.md | 1 - .../examples/database/create-collection.md | 1 - .../docs/examples/database/create-document.md | 1 - .../examples/database/delete-collection.md | 1 - .../docs/examples/database/delete-document.md | 1 - .../docs/examples/database/get-collection.md | 1 - .../go/docs/examples/database/get-document.md | 1 - .../examples/database/list-collections.md | 1 - .../docs/examples/database/list-documents.md | 1 - .../examples/database/update-collection.md | 1 - .../docs/examples/database/update-document.md | 1 - .../go/docs/examples/locale/get-continents.md | 1 - .../docs/examples/locale/get-countries-e-u.md | 1 - .../examples/locale/get-countries-phones.md | 1 - .../go/docs/examples/locale/get-countries.md | 1 - .../go/docs/examples/locale/get-currencies.md | 1 - .../go/docs/examples/locale/get-locale.md | 1 - .../go/docs/examples/storage/create-file.md | 1 - .../go/docs/examples/storage/delete-file.md | 1 - .../examples/storage/get-file-download.md | 1 - .../docs/examples/storage/get-file-preview.md | 1 - .../go/docs/examples/storage/get-file-view.md | 1 - app/sdks/go/docs/examples/storage/get-file.md | 1 - .../go/docs/examples/storage/list-files.md | 1 - .../go/docs/examples/storage/update-file.md | 1 - .../examples/teams/create-team-membership.md | 1 - .../go/docs/examples/teams/create-team.md | 1 - .../examples/teams/delete-team-membership.md | 1 - .../go/docs/examples/teams/delete-team.md | 1 - .../examples/teams/get-team-memberships.md | 1 - app/sdks/go/docs/examples/teams/get-team.md | 1 - app/sdks/go/docs/examples/teams/list-teams.md | 1 - .../go/docs/examples/teams/update-team.md | 1 - .../go/docs/examples/users/create-user.md | 1 - .../examples/users/delete-user-session.md | 1 - .../examples/users/delete-user-sessions.md | 1 - .../go/docs/examples/users/get-user-logs.md | 1 - .../go/docs/examples/users/get-user-prefs.md | 1 - .../docs/examples/users/get-user-sessions.md | 1 - app/sdks/go/docs/examples/users/get-user.md | 1 - app/sdks/go/docs/examples/users/list-users.md | 1 - .../docs/examples/users/update-user-prefs.md | 1 - .../docs/examples/users/update-user-status.md | 1 - app/sdks/go/locale.go | 2 +- app/sdks/go/storage.go | 2 +- app/sdks/go/teams.go | 2 +- app/sdks/go/users.go | 2 +- composer.lock | 4 ++-- 56 files changed, 18 insertions(+), 68 deletions(-) diff --git a/app/sdks/go/avatars.go b/app/sdks/go/avatars.go index 286f644f8d..6e7e2961bf 100644 --- a/app/sdks/go/avatars.go +++ b/app/sdks/go/avatars.go @@ -6,7 +6,7 @@ import ( // Avatars service type Avatars struct { - client *Client + client Client } // GetBrowser you can use this endpoint to show different browser icons to diff --git a/app/sdks/go/client.go b/app/sdks/go/client.go index 04cce21057..804a54c856 100644 --- a/app/sdks/go/client.go +++ b/app/sdks/go/client.go @@ -17,42 +17,40 @@ type Client struct { } // SetEndpoint sets the default endpoint to which the Client connects to -func (clt Client) SetEndpoint(endpoint string) { +func (clt *Client) SetEndpoint(endpoint string) { clt.endpoint = endpoint } // SetSelfSigned sets the condition that specify if the Client should allow connections to a server using a self-signed certificate -func (clt Client) SetSelfSigned(status bool) { +func (clt *Client) SetSelfSigned(status bool) { clt.selfSigned = status } // AddHeader add a new custom header that the Client should send on each request -func (clt Client) AddHeader(key string, value string) { +func (clt *Client) AddHeader(key string, value string) { clt.headers[key] = value } -// SetProjectHeader add the 'X-Appwrite-Project' header for the Client. Your Appwrite project ID -func (clt Client) SetProjectHeader(value string) { +// Your Appwrite project ID +func (clt *Client) SetProject(value string) { clt.headers["X-Appwrite-Project"] = value } -// SetKeyHeader add the 'X-Appwrite-Key' header for the Client. Your Appwrite project secret key -func (clt Client) SetKeyHeader(value string) { +// Your Appwrite project secret key +func (clt *Client) SetKey(value string) { clt.headers["X-Appwrite-Key"] = value } -// SetLocaleHeader add the 'X-Appwrite-Locale' header for the Client. -func (clt Client) SetLocaleHeader(value string) { +func (clt *Client) SetLocale(value string) { clt.headers["X-Appwrite-Locale"] = value } -// SetModeHeader add the 'X-Appwrite-Mode' header for the Client. -func (clt Client) SetModeHeader(value string) { +func (clt *Client) SetMode(value string) { clt.headers["X-Appwrite-Mode"] = value } // Call an API using Client -func (clt Client) Call(method string, path string, headers map[string]interface{}, params map[string]interface{}) (map[string]interface{}, error) { +func (clt *Client) Call(method string, path string, headers map[string]interface{}, params map[string]interface{}) (map[string]interface{}, error) { if clt.client == nil { // Create HTTP client clt.client = &http.Client{} diff --git a/app/sdks/go/database.go b/app/sdks/go/database.go index b1e58e746b..48263a2e5e 100644 --- a/app/sdks/go/database.go +++ b/app/sdks/go/database.go @@ -6,7 +6,7 @@ import ( // Database service type Database struct { - client *Client + client Client } // ListCollections get a list of all the user collections. You can use the diff --git a/app/sdks/go/docs/examples/avatars/get-browser.md b/app/sdks/go/docs/examples/avatars/get-browser.md index b9b879c3c0..4400222e7e 100644 --- a/app/sdks/go/docs/examples/avatars/get-browser.md +++ b/app/sdks/go/docs/examples/avatars/get-browser.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/avatars/get-credit-card.md b/app/sdks/go/docs/examples/avatars/get-credit-card.md index 109cbaf2d2..563db7c957 100644 --- a/app/sdks/go/docs/examples/avatars/get-credit-card.md +++ b/app/sdks/go/docs/examples/avatars/get-credit-card.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/avatars/get-favicon.md b/app/sdks/go/docs/examples/avatars/get-favicon.md index 034501b6ca..1419d567a4 100644 --- a/app/sdks/go/docs/examples/avatars/get-favicon.md +++ b/app/sdks/go/docs/examples/avatars/get-favicon.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/avatars/get-flag.md b/app/sdks/go/docs/examples/avatars/get-flag.md index ec87a5a920..546a90e85f 100644 --- a/app/sdks/go/docs/examples/avatars/get-flag.md +++ b/app/sdks/go/docs/examples/avatars/get-flag.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/avatars/get-image.md b/app/sdks/go/docs/examples/avatars/get-image.md index 23ed84ae9b..0444c9a588 100644 --- a/app/sdks/go/docs/examples/avatars/get-image.md +++ b/app/sdks/go/docs/examples/avatars/get-image.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/avatars/get-q-r.md b/app/sdks/go/docs/examples/avatars/get-q-r.md index 1438dabe7b..c04a3ba850 100644 --- a/app/sdks/go/docs/examples/avatars/get-q-r.md +++ b/app/sdks/go/docs/examples/avatars/get-q-r.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/create-collection.md b/app/sdks/go/docs/examples/database/create-collection.md index 466dabb6d2..c1b13c53a7 100644 --- a/app/sdks/go/docs/examples/database/create-collection.md +++ b/app/sdks/go/docs/examples/database/create-collection.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/create-document.md b/app/sdks/go/docs/examples/database/create-document.md index 94999bdb61..66753a4b69 100644 --- a/app/sdks/go/docs/examples/database/create-document.md +++ b/app/sdks/go/docs/examples/database/create-document.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/delete-collection.md b/app/sdks/go/docs/examples/database/delete-collection.md index da17177826..3d477f4305 100644 --- a/app/sdks/go/docs/examples/database/delete-collection.md +++ b/app/sdks/go/docs/examples/database/delete-collection.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/delete-document.md b/app/sdks/go/docs/examples/database/delete-document.md index 4097919945..70e3b1d44c 100644 --- a/app/sdks/go/docs/examples/database/delete-document.md +++ b/app/sdks/go/docs/examples/database/delete-document.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/get-collection.md b/app/sdks/go/docs/examples/database/get-collection.md index 5512abb77d..c78c6afdde 100644 --- a/app/sdks/go/docs/examples/database/get-collection.md +++ b/app/sdks/go/docs/examples/database/get-collection.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/get-document.md b/app/sdks/go/docs/examples/database/get-document.md index 5f8b8e12a2..f96513729d 100644 --- a/app/sdks/go/docs/examples/database/get-document.md +++ b/app/sdks/go/docs/examples/database/get-document.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/list-collections.md b/app/sdks/go/docs/examples/database/list-collections.md index 7dfd834a0c..f781fc78ca 100644 --- a/app/sdks/go/docs/examples/database/list-collections.md +++ b/app/sdks/go/docs/examples/database/list-collections.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/list-documents.md b/app/sdks/go/docs/examples/database/list-documents.md index d6e1592d77..171b7d25c2 100644 --- a/app/sdks/go/docs/examples/database/list-documents.md +++ b/app/sdks/go/docs/examples/database/list-documents.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/update-collection.md b/app/sdks/go/docs/examples/database/update-collection.md index 25aef91bab..c0bfea1163 100644 --- a/app/sdks/go/docs/examples/database/update-collection.md +++ b/app/sdks/go/docs/examples/database/update-collection.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/database/update-document.md b/app/sdks/go/docs/examples/database/update-document.md index 11024fa232..50d2166bcd 100644 --- a/app/sdks/go/docs/examples/database/update-document.md +++ b/app/sdks/go/docs/examples/database/update-document.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/locale/get-continents.md b/app/sdks/go/docs/examples/locale/get-continents.md index eb0cf13646..cb52c41a5e 100644 --- a/app/sdks/go/docs/examples/locale/get-continents.md +++ b/app/sdks/go/docs/examples/locale/get-continents.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/locale/get-countries-e-u.md b/app/sdks/go/docs/examples/locale/get-countries-e-u.md index 0aa7ed1be7..9020014236 100644 --- a/app/sdks/go/docs/examples/locale/get-countries-e-u.md +++ b/app/sdks/go/docs/examples/locale/get-countries-e-u.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/locale/get-countries-phones.md b/app/sdks/go/docs/examples/locale/get-countries-phones.md index 51d58fa377..2d368a29f2 100644 --- a/app/sdks/go/docs/examples/locale/get-countries-phones.md +++ b/app/sdks/go/docs/examples/locale/get-countries-phones.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/locale/get-countries.md b/app/sdks/go/docs/examples/locale/get-countries.md index adacc84edd..f5844a3d26 100644 --- a/app/sdks/go/docs/examples/locale/get-countries.md +++ b/app/sdks/go/docs/examples/locale/get-countries.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/locale/get-currencies.md b/app/sdks/go/docs/examples/locale/get-currencies.md index 038c897103..d786da5f71 100644 --- a/app/sdks/go/docs/examples/locale/get-currencies.md +++ b/app/sdks/go/docs/examples/locale/get-currencies.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/locale/get-locale.md b/app/sdks/go/docs/examples/locale/get-locale.md index 1b6b24a3e2..e3596c4939 100644 --- a/app/sdks/go/docs/examples/locale/get-locale.md +++ b/app/sdks/go/docs/examples/locale/get-locale.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/storage/create-file.md b/app/sdks/go/docs/examples/storage/create-file.md index 0d07428b5b..167661e740 100644 --- a/app/sdks/go/docs/examples/storage/create-file.md +++ b/app/sdks/go/docs/examples/storage/create-file.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/storage/delete-file.md b/app/sdks/go/docs/examples/storage/delete-file.md index 36ba7c7f28..58bdf43fc2 100644 --- a/app/sdks/go/docs/examples/storage/delete-file.md +++ b/app/sdks/go/docs/examples/storage/delete-file.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/storage/get-file-download.md b/app/sdks/go/docs/examples/storage/get-file-download.md index 19837e8ae6..1ac2f94d4d 100644 --- a/app/sdks/go/docs/examples/storage/get-file-download.md +++ b/app/sdks/go/docs/examples/storage/get-file-download.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/storage/get-file-preview.md b/app/sdks/go/docs/examples/storage/get-file-preview.md index 6190b65379..aa80c7cf0f 100644 --- a/app/sdks/go/docs/examples/storage/get-file-preview.md +++ b/app/sdks/go/docs/examples/storage/get-file-preview.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/storage/get-file-view.md b/app/sdks/go/docs/examples/storage/get-file-view.md index c93f1829d3..ba8fa9b020 100644 --- a/app/sdks/go/docs/examples/storage/get-file-view.md +++ b/app/sdks/go/docs/examples/storage/get-file-view.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/storage/get-file.md b/app/sdks/go/docs/examples/storage/get-file.md index bf0319ca55..18ba1bd623 100644 --- a/app/sdks/go/docs/examples/storage/get-file.md +++ b/app/sdks/go/docs/examples/storage/get-file.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/storage/list-files.md b/app/sdks/go/docs/examples/storage/list-files.md index 0f8849410e..ba59152eb9 100644 --- a/app/sdks/go/docs/examples/storage/list-files.md +++ b/app/sdks/go/docs/examples/storage/list-files.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/storage/update-file.md b/app/sdks/go/docs/examples/storage/update-file.md index cef2982108..4ef34d4d59 100644 --- a/app/sdks/go/docs/examples/storage/update-file.md +++ b/app/sdks/go/docs/examples/storage/update-file.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/teams/create-team-membership.md b/app/sdks/go/docs/examples/teams/create-team-membership.md index 6d03ace566..242bc06ee1 100644 --- a/app/sdks/go/docs/examples/teams/create-team-membership.md +++ b/app/sdks/go/docs/examples/teams/create-team-membership.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/teams/create-team.md b/app/sdks/go/docs/examples/teams/create-team.md index f0c6d193b2..c859919c65 100644 --- a/app/sdks/go/docs/examples/teams/create-team.md +++ b/app/sdks/go/docs/examples/teams/create-team.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/teams/delete-team-membership.md b/app/sdks/go/docs/examples/teams/delete-team-membership.md index c6a9b3129d..6d69bfbccc 100644 --- a/app/sdks/go/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/go/docs/examples/teams/delete-team-membership.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/teams/delete-team.md b/app/sdks/go/docs/examples/teams/delete-team.md index 9db700bd26..09c3e10f5f 100644 --- a/app/sdks/go/docs/examples/teams/delete-team.md +++ b/app/sdks/go/docs/examples/teams/delete-team.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/teams/get-team-memberships.md b/app/sdks/go/docs/examples/teams/get-team-memberships.md index a479684415..4ca6e7630c 100644 --- a/app/sdks/go/docs/examples/teams/get-team-memberships.md +++ b/app/sdks/go/docs/examples/teams/get-team-memberships.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/teams/get-team.md b/app/sdks/go/docs/examples/teams/get-team.md index 948f91e4a6..27a8505f7d 100644 --- a/app/sdks/go/docs/examples/teams/get-team.md +++ b/app/sdks/go/docs/examples/teams/get-team.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/teams/list-teams.md b/app/sdks/go/docs/examples/teams/list-teams.md index 9f5ba38e5d..abd0e9cd00 100644 --- a/app/sdks/go/docs/examples/teams/list-teams.md +++ b/app/sdks/go/docs/examples/teams/list-teams.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/teams/update-team.md b/app/sdks/go/docs/examples/teams/update-team.md index 1f3cec4167..192cae2d0f 100644 --- a/app/sdks/go/docs/examples/teams/update-team.md +++ b/app/sdks/go/docs/examples/teams/update-team.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/create-user.md b/app/sdks/go/docs/examples/users/create-user.md index 8b2335fa59..1ce7639b73 100644 --- a/app/sdks/go/docs/examples/users/create-user.md +++ b/app/sdks/go/docs/examples/users/create-user.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/delete-user-session.md b/app/sdks/go/docs/examples/users/delete-user-session.md index 3ecb54db4e..3ad927b3b0 100644 --- a/app/sdks/go/docs/examples/users/delete-user-session.md +++ b/app/sdks/go/docs/examples/users/delete-user-session.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/delete-user-sessions.md b/app/sdks/go/docs/examples/users/delete-user-sessions.md index b42c0dafb2..cd6d79d98c 100644 --- a/app/sdks/go/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/go/docs/examples/users/delete-user-sessions.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/get-user-logs.md b/app/sdks/go/docs/examples/users/get-user-logs.md index 9190b6d19f..6fbddb92b5 100644 --- a/app/sdks/go/docs/examples/users/get-user-logs.md +++ b/app/sdks/go/docs/examples/users/get-user-logs.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/get-user-prefs.md b/app/sdks/go/docs/examples/users/get-user-prefs.md index b9db2f4e11..18c412dc3e 100644 --- a/app/sdks/go/docs/examples/users/get-user-prefs.md +++ b/app/sdks/go/docs/examples/users/get-user-prefs.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/get-user-sessions.md b/app/sdks/go/docs/examples/users/get-user-sessions.md index 99c27a3736..f2beabc22b 100644 --- a/app/sdks/go/docs/examples/users/get-user-sessions.md +++ b/app/sdks/go/docs/examples/users/get-user-sessions.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/get-user.md b/app/sdks/go/docs/examples/users/get-user.md index f566b22a85..8903b422e9 100644 --- a/app/sdks/go/docs/examples/users/get-user.md +++ b/app/sdks/go/docs/examples/users/get-user.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/list-users.md b/app/sdks/go/docs/examples/users/list-users.md index f09e1631fe..64d241faf2 100644 --- a/app/sdks/go/docs/examples/users/list-users.md +++ b/app/sdks/go/docs/examples/users/list-users.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/update-user-prefs.md b/app/sdks/go/docs/examples/users/update-user-prefs.md index 308046c835..113f12fbb0 100644 --- a/app/sdks/go/docs/examples/users/update-user-prefs.md +++ b/app/sdks/go/docs/examples/users/update-user-prefs.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/docs/examples/users/update-user-status.md b/app/sdks/go/docs/examples/users/update-user-status.md index 8fc7707ff5..943b401740 100644 --- a/app/sdks/go/docs/examples/users/update-user-status.md +++ b/app/sdks/go/docs/examples/users/update-user-status.md @@ -2,7 +2,6 @@ package main import ( "fmt" - "os" "github.com/appwrite/sdk-for-go" ) diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go index cf6a0cfdd3..a79bddcbad 100644 --- a/app/sdks/go/locale.go +++ b/app/sdks/go/locale.go @@ -5,7 +5,7 @@ import ( // Locale service type Locale struct { - client *Client + client Client } // GetLocale get the current user location based on IP. Returns an object with diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go index e4edd23bf4..0f3bf55d03 100644 --- a/app/sdks/go/storage.go +++ b/app/sdks/go/storage.go @@ -6,7 +6,7 @@ import ( // Storage service type Storage struct { - client *Client + client Client } // ListFiles get a list of all the user files. You can use the query params to diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index 925275f733..b79452237c 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -6,7 +6,7 @@ import ( // Teams service type Teams struct { - client *Client + client Client } // ListTeams get a list of all the current user teams. You can use the query diff --git a/app/sdks/go/users.go b/app/sdks/go/users.go index 6ef84d510a..cb4f728566 100644 --- a/app/sdks/go/users.go +++ b/app/sdks/go/users.go @@ -6,7 +6,7 @@ import ( // Users service type Users struct { - client *Client + client Client } // ListUsers get a list of all the project users. You can use the query params diff --git a/composer.lock b/composer.lock index e8ca0634c3..bdc81ca724 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "3b6b20934658551872ee86bd6207a57ddb0b3200" + "reference": "6dc240f55ef5cfe99563899dadd0d63afe882f00" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T19:15:00+00:00" + "time": "2020-01-28T20:20:14+00:00" }, { "name": "doctrine/instantiator", From 926079acd49947bcf6c916203e68d22023403def Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Tue, 28 Jan 2020 23:01:07 +0200 Subject: [PATCH 111/237] Updated go templates --- app/sdks/go/avatars.go | 17 ++++++++----- app/sdks/go/database.go | 25 +++++++++++-------- .../go/docs/examples/avatars/get-browser.md | 2 +- .../docs/examples/avatars/get-credit-card.md | 2 +- app/sdks/go/docs/examples/avatars/get-flag.md | 2 +- .../go/docs/examples/avatars/get-image.md | 2 +- app/sdks/go/docs/examples/avatars/get-q-r.md | 2 +- .../docs/examples/database/create-document.md | 2 +- .../examples/database/list-collections.md | 2 +- .../docs/examples/database/list-documents.md | 2 +- .../examples/database/update-collection.md | 2 +- .../docs/examples/storage/get-file-preview.md | 2 +- .../go/docs/examples/storage/get-file-view.md | 2 +- .../go/docs/examples/storage/list-files.md | 2 +- .../examples/teams/create-team-membership.md | 2 +- .../go/docs/examples/teams/create-team.md | 2 +- app/sdks/go/docs/examples/teams/list-teams.md | 2 +- .../go/docs/examples/users/create-user.md | 2 +- app/sdks/go/docs/examples/users/list-users.md | 2 +- app/sdks/go/locale.go | 17 ++++++++----- app/sdks/go/storage.go | 21 ++++++++++------ app/sdks/go/teams.go | 21 ++++++++++------ app/sdks/go/users.go | 25 +++++++++++-------- composer.lock | 4 +-- 24 files changed, 97 insertions(+), 67 deletions(-) diff --git a/app/sdks/go/avatars.go b/app/sdks/go/avatars.go index 6e7e2961bf..bf2d394105 100644 --- a/app/sdks/go/avatars.go +++ b/app/sdks/go/avatars.go @@ -9,6 +9,11 @@ type Avatars struct { client Client } +func New(client *Client) *Avatars { + service := Avatars{client} + return service +} + // GetBrowser you can use this endpoint to show different browser icons to // your users. The code argument receives the browser code as it appears in // your user /account/sessions endpoint. Use width, height and quality @@ -23,7 +28,7 @@ func (srv *Avatars) GetBrowser(Code string, Width int, Height int, Quality int) "quality": Quality, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetCreditCard need to display your users with your billing method or their @@ -40,7 +45,7 @@ func (srv *Avatars) GetCreditCard(Code string, Width int, Height int, Quality in "quality": Quality, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetFavicon use this endpoint to fetch the favorite icon (AKA favicon) of a @@ -52,7 +57,7 @@ func (srv *Avatars) GetFavicon(Url string) (map[string]interface{}, error) { "url": Url, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetFlag you can use this endpoint to show different country flags icons to @@ -68,7 +73,7 @@ func (srv *Avatars) GetFlag(Code string, Width int, Height int, Quality int) (ma "quality": Quality, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetImage use this endpoint to fetch a remote image URL and crop it to any @@ -84,7 +89,7 @@ func (srv *Avatars) GetImage(Url string, Width int, Height int) (map[string]inte "height": Height, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetQR converts a given plain text to a QR code image. You can use the query @@ -99,5 +104,5 @@ func (srv *Avatars) GetQR(Text string, Size int, Margin int, Download int) (map[ "download": Download, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } diff --git a/app/sdks/go/database.go b/app/sdks/go/database.go index 48263a2e5e..f10a520d5a 100644 --- a/app/sdks/go/database.go +++ b/app/sdks/go/database.go @@ -9,6 +9,11 @@ type Database struct { client Client } +func New(client *Client) *Database { + service := Database{client} + return service +} + // ListCollections get a list of all the user collections. You can use the // query params to filter your results. On admin mode, this endpoint will // return a list of all of the project collections. [Learn more about @@ -23,7 +28,7 @@ func (srv *Database) ListCollections(Search string, Limit int, Offset int, Order "orderType": OrderType, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // CreateCollection create a new Collection. @@ -37,7 +42,7 @@ func (srv *Database) CreateCollection(Name string, Read []interface{}, Write []i "rules": Rules, } - return srv.client.Call("POST", path, nil, params) + return srv.Client.Call("POST", path, nil, params) } // GetCollection get collection by its unique ID. This endpoint response @@ -49,7 +54,7 @@ func (srv *Database) GetCollection(CollectionId string) (map[string]interface{}, params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // UpdateCollection update collection by its unique ID. @@ -64,7 +69,7 @@ func (srv *Database) UpdateCollection(CollectionId string, Name string, Read []i "rules": Rules, } - return srv.client.Call("PUT", path, nil, params) + return srv.Client.Call("PUT", path, nil, params) } // DeleteCollection delete a collection by its unique ID. Only users with @@ -76,7 +81,7 @@ func (srv *Database) DeleteCollection(CollectionId string) (map[string]interface params := map[string]interface{}{ } - return srv.client.Call("DELETE", path, nil, params) + return srv.Client.Call("DELETE", path, nil, params) } // ListDocuments get a list of all the user documents. You can use the query @@ -99,7 +104,7 @@ func (srv *Database) ListDocuments(CollectionId string, Filters []interface{}, O "last": Last, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // CreateDocument create a new Document. @@ -116,7 +121,7 @@ func (srv *Database) CreateDocument(CollectionId string, Data string, Read []int "parentPropertyType": ParentPropertyType, } - return srv.client.Call("POST", path, nil, params) + return srv.Client.Call("POST", path, nil, params) } // GetDocument get document by its unique ID. This endpoint response returns a @@ -128,7 +133,7 @@ func (srv *Database) GetDocument(CollectionId string, DocumentId string) (map[st params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // UpdateDocument @@ -142,7 +147,7 @@ func (srv *Database) UpdateDocument(CollectionId string, DocumentId string, Data "write": Write, } - return srv.client.Call("PATCH", path, nil, params) + return srv.Client.Call("PATCH", path, nil, params) } // DeleteDocument delete document by its unique ID. This endpoint deletes only @@ -155,5 +160,5 @@ func (srv *Database) DeleteDocument(CollectionId string, DocumentId string) (map params := map[string]interface{}{ } - return srv.client.Call("DELETE", path, nil, params) + return srv.Client.Call("DELETE", path, nil, params) } diff --git a/app/sdks/go/docs/examples/avatars/get-browser.md b/app/sdks/go/docs/examples/avatars/get-browser.md index 4400222e7e..085dd03757 100644 --- a/app/sdks/go/docs/examples/avatars/get-browser.md +++ b/app/sdks/go/docs/examples/avatars/get-browser.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetBrowser("aa") + var response, error := service.GetBrowser("aa", 0, 0, 0) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/avatars/get-credit-card.md b/app/sdks/go/docs/examples/avatars/get-credit-card.md index 563db7c957..8191559d79 100644 --- a/app/sdks/go/docs/examples/avatars/get-credit-card.md +++ b/app/sdks/go/docs/examples/avatars/get-credit-card.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetCreditCard("amex") + var response, error := service.GetCreditCard("amex", 0, 0, 0) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/avatars/get-flag.md b/app/sdks/go/docs/examples/avatars/get-flag.md index 546a90e85f..d2d852ac28 100644 --- a/app/sdks/go/docs/examples/avatars/get-flag.md +++ b/app/sdks/go/docs/examples/avatars/get-flag.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetFlag("af") + var response, error := service.GetFlag("af", 0, 0, 0) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/avatars/get-image.md b/app/sdks/go/docs/examples/avatars/get-image.md index 0444c9a588..9d519436bc 100644 --- a/app/sdks/go/docs/examples/avatars/get-image.md +++ b/app/sdks/go/docs/examples/avatars/get-image.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetImage("https://example.com") + var response, error := service.GetImage("https://example.com", 0, 0) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/avatars/get-q-r.md b/app/sdks/go/docs/examples/avatars/get-q-r.md index c04a3ba850..d23d83782f 100644 --- a/app/sdks/go/docs/examples/avatars/get-q-r.md +++ b/app/sdks/go/docs/examples/avatars/get-q-r.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetQR("[TEXT]") + var response, error := service.GetQR("[TEXT]", 0, 0, 0) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/database/create-document.md b/app/sdks/go/docs/examples/database/create-document.md index 66753a4b69..64abf25349 100644 --- a/app/sdks/go/docs/examples/database/create-document.md +++ b/app/sdks/go/docs/examples/database/create-document.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.CreateDocument("[COLLECTION_ID]", "{}", [], []) + var response, error := service.CreateDocument("[COLLECTION_ID]", "{}", [], [], "[PARENT_DOCUMENT]", "", "assign") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/database/list-collections.md b/app/sdks/go/docs/examples/database/list-collections.md index f781fc78ca..dbb5d68ac2 100644 --- a/app/sdks/go/docs/examples/database/list-collections.md +++ b/app/sdks/go/docs/examples/database/list-collections.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.ListCollections() + var response, error := service.ListCollections("[SEARCH]", 0, 0, "ASC") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/database/list-documents.md b/app/sdks/go/docs/examples/database/list-documents.md index 171b7d25c2..f842f46e3a 100644 --- a/app/sdks/go/docs/examples/database/list-documents.md +++ b/app/sdks/go/docs/examples/database/list-documents.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.ListDocuments("[COLLECTION_ID]") + var response, error := service.ListDocuments("[COLLECTION_ID]", [], 0, 0, "[ORDER_FIELD]", "DESC", "int", "[SEARCH]", 0, 0) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/database/update-collection.md b/app/sdks/go/docs/examples/database/update-collection.md index c0bfea1163..9ec0b1c20d 100644 --- a/app/sdks/go/docs/examples/database/update-collection.md +++ b/app/sdks/go/docs/examples/database/update-collection.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.UpdateCollection("[COLLECTION_ID]", "[NAME]", [], []) + var response, error := service.UpdateCollection("[COLLECTION_ID]", "[NAME]", [], [], []) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/get-file-preview.md b/app/sdks/go/docs/examples/storage/get-file-preview.md index aa80c7cf0f..6ee4a129cb 100644 --- a/app/sdks/go/docs/examples/storage/get-file-preview.md +++ b/app/sdks/go/docs/examples/storage/get-file-preview.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetFilePreview("[FILE_ID]") + var response, error := service.GetFilePreview("[FILE_ID]", 0, 0, 0, "", "jpg") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/get-file-view.md b/app/sdks/go/docs/examples/storage/get-file-view.md index ba8fa9b020..2a444aa6a5 100644 --- a/app/sdks/go/docs/examples/storage/get-file-view.md +++ b/app/sdks/go/docs/examples/storage/get-file-view.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetFileView("[FILE_ID]") + var response, error := service.GetFileView("[FILE_ID]", "pdf") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/list-files.md b/app/sdks/go/docs/examples/storage/list-files.md index ba59152eb9..78cf9379a3 100644 --- a/app/sdks/go/docs/examples/storage/list-files.md +++ b/app/sdks/go/docs/examples/storage/list-files.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.ListFiles() + var response, error := service.ListFiles("[SEARCH]", 0, 0, "ASC") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/teams/create-team-membership.md b/app/sdks/go/docs/examples/teams/create-team-membership.md index 242bc06ee1..0cc0e4c379 100644 --- a/app/sdks/go/docs/examples/teams/create-team-membership.md +++ b/app/sdks/go/docs/examples/teams/create-team-membership.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com") + var response, error := service.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com", "[NAME]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/teams/create-team.md b/app/sdks/go/docs/examples/teams/create-team.md index c859919c65..27aea5d2f5 100644 --- a/app/sdks/go/docs/examples/teams/create-team.md +++ b/app/sdks/go/docs/examples/teams/create-team.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.CreateTeam("[NAME]") + var response, error := service.CreateTeam("[NAME]", []) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/teams/list-teams.md b/app/sdks/go/docs/examples/teams/list-teams.md index abd0e9cd00..cf7e13f6a1 100644 --- a/app/sdks/go/docs/examples/teams/list-teams.md +++ b/app/sdks/go/docs/examples/teams/list-teams.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.ListTeams() + var response, error := service.ListTeams("[SEARCH]", 0, 0, "ASC") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/users/create-user.md b/app/sdks/go/docs/examples/users/create-user.md index 1ce7639b73..098d65800a 100644 --- a/app/sdks/go/docs/examples/users/create-user.md +++ b/app/sdks/go/docs/examples/users/create-user.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.CreateUser("email@example.com", "password") + var response, error := service.CreateUser("email@example.com", "password", "[NAME]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/users/list-users.md b/app/sdks/go/docs/examples/users/list-users.md index 64d241faf2..a77f46f225 100644 --- a/app/sdks/go/docs/examples/users/list-users.md +++ b/app/sdks/go/docs/examples/users/list-users.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.ListUsers() + var response, error := service.ListUsers("[SEARCH]", 0, 0, "ASC") if error != nil { panic(error) diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go index a79bddcbad..2b4813bbdc 100644 --- a/app/sdks/go/locale.go +++ b/app/sdks/go/locale.go @@ -8,6 +8,11 @@ type Locale struct { client Client } +func New(client *Client) *Locale { + service := Locale{client} + return service +} + // GetLocale get the current user location based on IP. Returns an object with // user country code, country name, continent name, continent code, ip address // and suggested currency. You can use the locale header to get the data in a @@ -20,7 +25,7 @@ func (srv *Locale) GetLocale() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetContinents list of all continents. You can use the locale header to get @@ -31,7 +36,7 @@ func (srv *Locale) GetContinents() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetCountries list of all countries. You can use the locale header to get @@ -42,7 +47,7 @@ func (srv *Locale) GetCountries() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetCountriesEU list of all countries that are currently members of the EU. @@ -53,7 +58,7 @@ func (srv *Locale) GetCountriesEU() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetCountriesPhones list of all countries phone codes. You can use the @@ -64,7 +69,7 @@ func (srv *Locale) GetCountriesPhones() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetCurrencies list of all currencies, including currency symol, name, @@ -76,5 +81,5 @@ func (srv *Locale) GetCurrencies() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go index 0f3bf55d03..b1fe2192f3 100644 --- a/app/sdks/go/storage.go +++ b/app/sdks/go/storage.go @@ -9,6 +9,11 @@ type Storage struct { client Client } +func New(client *Client) *Storage { + service := Storage{client} + return service +} + // ListFiles get a list of all the user files. You can use the query params to // filter your results. On admin mode, this endpoint will return a list of all // of the project files. [Learn more about different API modes](/docs/admin). @@ -22,7 +27,7 @@ func (srv *Storage) ListFiles(Search string, Limit int, Offset int, OrderType st "orderType": OrderType, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // CreateFile create a new file. The user who creates the file will @@ -37,7 +42,7 @@ func (srv *Storage) CreateFile(File string, Read []interface{}, Write []interfac "write": Write, } - return srv.client.Call("POST", path, nil, params) + return srv.Client.Call("POST", path, nil, params) } // GetFile get file by its unique ID. This endpoint response returns a JSON @@ -49,7 +54,7 @@ func (srv *Storage) GetFile(FileId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // UpdateFile update file by its unique ID. Only users with write permissions @@ -63,7 +68,7 @@ func (srv *Storage) UpdateFile(FileId string, Read []interface{}, Write []interf "write": Write, } - return srv.client.Call("PUT", path, nil, params) + return srv.Client.Call("PUT", path, nil, params) } // DeleteFile delete a file by its unique ID. Only users with write @@ -75,7 +80,7 @@ func (srv *Storage) DeleteFile(FileId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("DELETE", path, nil, params) + return srv.Client.Call("DELETE", path, nil, params) } // GetFileDownload get file content by its unique ID. The endpoint response @@ -88,7 +93,7 @@ func (srv *Storage) GetFileDownload(FileId string) (map[string]interface{}, erro params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetFilePreview get a file preview image. Currently, this method supports @@ -108,7 +113,7 @@ func (srv *Storage) GetFilePreview(FileId string, Width int, Height int, Quality "output": Output, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetFileView get file content by its unique ID. This endpoint is similar to @@ -122,5 +127,5 @@ func (srv *Storage) GetFileView(FileId string, As string) (map[string]interface{ "as": As, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index b79452237c..97b73d1985 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -9,6 +9,11 @@ type Teams struct { client Client } +func New(client *Client) *Teams { + service := Teams{client} + return service +} + // ListTeams get a list of all the current user teams. You can use the query // params to filter your results. On admin mode, this endpoint will return a // list of all of the project teams. [Learn more about different API @@ -23,7 +28,7 @@ func (srv *Teams) ListTeams(Search string, Limit int, Offset int, OrderType stri "orderType": OrderType, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // CreateTeam create a new team. The user who creates the team will @@ -38,7 +43,7 @@ func (srv *Teams) CreateTeam(Name string, Roles []interface{}) (map[string]inter "roles": Roles, } - return srv.client.Call("POST", path, nil, params) + return srv.Client.Call("POST", path, nil, params) } // GetTeam get team by its unique ID. All team members have read access for @@ -50,7 +55,7 @@ func (srv *Teams) GetTeam(TeamId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // UpdateTeam update team by its unique ID. Only team owners have write access @@ -63,7 +68,7 @@ func (srv *Teams) UpdateTeam(TeamId string, Name string) (map[string]interface{} "name": Name, } - return srv.client.Call("PUT", path, nil, params) + return srv.Client.Call("PUT", path, nil, params) } // DeleteTeam delete team by its unique ID. Only team owners have write access @@ -75,7 +80,7 @@ func (srv *Teams) DeleteTeam(TeamId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("DELETE", path, nil, params) + return srv.Client.Call("DELETE", path, nil, params) } // GetTeamMemberships get team members by the team unique ID. All team members @@ -87,7 +92,7 @@ func (srv *Teams) GetTeamMemberships(TeamId string) (map[string]interface{}, err params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // CreateTeamMembership use this endpoint to invite a new member to your team. @@ -115,7 +120,7 @@ func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []inte "url": Url, } - return srv.client.Call("POST", path, nil, params) + return srv.Client.Call("POST", path, nil, params) } // DeleteTeamMembership this endpoint allows a user to leave a team or for a @@ -128,5 +133,5 @@ func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[stri params := map[string]interface{}{ } - return srv.client.Call("DELETE", path, nil, params) + return srv.Client.Call("DELETE", path, nil, params) } diff --git a/app/sdks/go/users.go b/app/sdks/go/users.go index cb4f728566..671f1ed7fa 100644 --- a/app/sdks/go/users.go +++ b/app/sdks/go/users.go @@ -9,6 +9,11 @@ type Users struct { client Client } +func New(client *Client) *Users { + service := Users{client} + return service +} + // ListUsers get a list of all the project users. You can use the query params // to filter your results. func (srv *Users) ListUsers(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { @@ -21,7 +26,7 @@ func (srv *Users) ListUsers(Search string, Limit int, Offset int, OrderType stri "orderType": OrderType, } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // CreateUser create a new user. @@ -34,7 +39,7 @@ func (srv *Users) CreateUser(Email string, Password string, Name string) (map[st "name": Name, } - return srv.client.Call("POST", path, nil, params) + return srv.Client.Call("POST", path, nil, params) } // GetUser get user by its unique ID. @@ -45,7 +50,7 @@ func (srv *Users) GetUser(UserId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetUserLogs get user activity logs list by its unique ID. @@ -56,7 +61,7 @@ func (srv *Users) GetUserLogs(UserId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // GetUserPrefs get user preferences by its unique ID. @@ -67,7 +72,7 @@ func (srv *Users) GetUserPrefs(UserId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // UpdateUserPrefs update user preferences by its unique ID. You can pass only @@ -80,7 +85,7 @@ func (srv *Users) UpdateUserPrefs(UserId string, Prefs string) (map[string]inter "prefs": Prefs, } - return srv.client.Call("PATCH", path, nil, params) + return srv.Client.Call("PATCH", path, nil, params) } // GetUserSessions get user sessions list by its unique ID. @@ -91,7 +96,7 @@ func (srv *Users) GetUserSessions(UserId string) (map[string]interface{}, error) params := map[string]interface{}{ } - return srv.client.Call("GET", path, nil, params) + return srv.Client.Call("GET", path, nil, params) } // DeleteUserSessions delete all user sessions by its unique ID. @@ -102,7 +107,7 @@ func (srv *Users) DeleteUserSessions(UserId string) (map[string]interface{}, err params := map[string]interface{}{ } - return srv.client.Call("DELETE", path, nil, params) + return srv.Client.Call("DELETE", path, nil, params) } // DeleteUserSession delete user sessions by its unique ID. @@ -114,7 +119,7 @@ func (srv *Users) DeleteUserSession(UserId string, SessionId string) (map[string "sessionId": SessionId, } - return srv.client.Call("DELETE", path, nil, params) + return srv.Client.Call("DELETE", path, nil, params) } // UpdateUserStatus update user status by its unique ID. @@ -126,5 +131,5 @@ func (srv *Users) UpdateUserStatus(UserId string, Status string) (map[string]int "status": Status, } - return srv.client.Call("PATCH", path, nil, params) + return srv.Client.Call("PATCH", path, nil, params) } diff --git a/composer.lock b/composer.lock index bdc81ca724..2ece8e9ede 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "6dc240f55ef5cfe99563899dadd0d63afe882f00" + "reference": "590cd29f649869dcbe431c5784bd1483f195e2ec" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T20:20:14+00:00" + "time": "2020-01-28T20:57:54+00:00" }, { "name": "doctrine/instantiator", From d25a1f4f7804f4669e56ed01ec29741bf2c6149e Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 29 Jan 2020 00:56:24 +0200 Subject: [PATCH 112/237] Update for Go --- app/sdks/go/avatars.go | 12 ++++++------ app/sdks/go/database.go | 20 ++++++++++---------- app/sdks/go/locale.go | 12 ++++++------ app/sdks/go/storage.go | 16 ++++++++-------- app/sdks/go/teams.go | 16 ++++++++-------- app/sdks/go/users.go | 20 ++++++++++---------- composer.lock | 4 ++-- 7 files changed, 50 insertions(+), 50 deletions(-) diff --git a/app/sdks/go/avatars.go b/app/sdks/go/avatars.go index bf2d394105..0fde923722 100644 --- a/app/sdks/go/avatars.go +++ b/app/sdks/go/avatars.go @@ -28,7 +28,7 @@ func (srv *Avatars) GetBrowser(Code string, Width int, Height int, Quality int) "quality": Quality, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetCreditCard need to display your users with your billing method or their @@ -45,7 +45,7 @@ func (srv *Avatars) GetCreditCard(Code string, Width int, Height int, Quality in "quality": Quality, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetFavicon use this endpoint to fetch the favorite icon (AKA favicon) of a @@ -57,7 +57,7 @@ func (srv *Avatars) GetFavicon(Url string) (map[string]interface{}, error) { "url": Url, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetFlag you can use this endpoint to show different country flags icons to @@ -73,7 +73,7 @@ func (srv *Avatars) GetFlag(Code string, Width int, Height int, Quality int) (ma "quality": Quality, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetImage use this endpoint to fetch a remote image URL and crop it to any @@ -89,7 +89,7 @@ func (srv *Avatars) GetImage(Url string, Width int, Height int) (map[string]inte "height": Height, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetQR converts a given plain text to a QR code image. You can use the query @@ -104,5 +104,5 @@ func (srv *Avatars) GetQR(Text string, Size int, Margin int, Download int) (map[ "download": Download, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } diff --git a/app/sdks/go/database.go b/app/sdks/go/database.go index f10a520d5a..e21b4810c5 100644 --- a/app/sdks/go/database.go +++ b/app/sdks/go/database.go @@ -28,7 +28,7 @@ func (srv *Database) ListCollections(Search string, Limit int, Offset int, Order "orderType": OrderType, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // CreateCollection create a new Collection. @@ -42,7 +42,7 @@ func (srv *Database) CreateCollection(Name string, Read []interface{}, Write []i "rules": Rules, } - return srv.Client.Call("POST", path, nil, params) + return srv.client.Call("POST", path, nil, params) } // GetCollection get collection by its unique ID. This endpoint response @@ -54,7 +54,7 @@ func (srv *Database) GetCollection(CollectionId string) (map[string]interface{}, params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // UpdateCollection update collection by its unique ID. @@ -69,7 +69,7 @@ func (srv *Database) UpdateCollection(CollectionId string, Name string, Read []i "rules": Rules, } - return srv.Client.Call("PUT", path, nil, params) + return srv.client.Call("PUT", path, nil, params) } // DeleteCollection delete a collection by its unique ID. Only users with @@ -81,7 +81,7 @@ func (srv *Database) DeleteCollection(CollectionId string) (map[string]interface params := map[string]interface{}{ } - return srv.Client.Call("DELETE", path, nil, params) + return srv.client.Call("DELETE", path, nil, params) } // ListDocuments get a list of all the user documents. You can use the query @@ -104,7 +104,7 @@ func (srv *Database) ListDocuments(CollectionId string, Filters []interface{}, O "last": Last, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // CreateDocument create a new Document. @@ -121,7 +121,7 @@ func (srv *Database) CreateDocument(CollectionId string, Data string, Read []int "parentPropertyType": ParentPropertyType, } - return srv.Client.Call("POST", path, nil, params) + return srv.client.Call("POST", path, nil, params) } // GetDocument get document by its unique ID. This endpoint response returns a @@ -133,7 +133,7 @@ func (srv *Database) GetDocument(CollectionId string, DocumentId string) (map[st params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // UpdateDocument @@ -147,7 +147,7 @@ func (srv *Database) UpdateDocument(CollectionId string, DocumentId string, Data "write": Write, } - return srv.Client.Call("PATCH", path, nil, params) + return srv.client.Call("PATCH", path, nil, params) } // DeleteDocument delete document by its unique ID. This endpoint deletes only @@ -160,5 +160,5 @@ func (srv *Database) DeleteDocument(CollectionId string, DocumentId string) (map params := map[string]interface{}{ } - return srv.Client.Call("DELETE", path, nil, params) + return srv.client.Call("DELETE", path, nil, params) } diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go index 2b4813bbdc..704f749d43 100644 --- a/app/sdks/go/locale.go +++ b/app/sdks/go/locale.go @@ -25,7 +25,7 @@ func (srv *Locale) GetLocale() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetContinents list of all continents. You can use the locale header to get @@ -36,7 +36,7 @@ func (srv *Locale) GetContinents() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetCountries list of all countries. You can use the locale header to get @@ -47,7 +47,7 @@ func (srv *Locale) GetCountries() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetCountriesEU list of all countries that are currently members of the EU. @@ -58,7 +58,7 @@ func (srv *Locale) GetCountriesEU() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetCountriesPhones list of all countries phone codes. You can use the @@ -69,7 +69,7 @@ func (srv *Locale) GetCountriesPhones() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetCurrencies list of all currencies, including currency symol, name, @@ -81,5 +81,5 @@ func (srv *Locale) GetCurrencies() (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go index b1fe2192f3..693fc38536 100644 --- a/app/sdks/go/storage.go +++ b/app/sdks/go/storage.go @@ -27,7 +27,7 @@ func (srv *Storage) ListFiles(Search string, Limit int, Offset int, OrderType st "orderType": OrderType, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // CreateFile create a new file. The user who creates the file will @@ -42,7 +42,7 @@ func (srv *Storage) CreateFile(File string, Read []interface{}, Write []interfac "write": Write, } - return srv.Client.Call("POST", path, nil, params) + return srv.client.Call("POST", path, nil, params) } // GetFile get file by its unique ID. This endpoint response returns a JSON @@ -54,7 +54,7 @@ func (srv *Storage) GetFile(FileId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // UpdateFile update file by its unique ID. Only users with write permissions @@ -68,7 +68,7 @@ func (srv *Storage) UpdateFile(FileId string, Read []interface{}, Write []interf "write": Write, } - return srv.Client.Call("PUT", path, nil, params) + return srv.client.Call("PUT", path, nil, params) } // DeleteFile delete a file by its unique ID. Only users with write @@ -80,7 +80,7 @@ func (srv *Storage) DeleteFile(FileId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("DELETE", path, nil, params) + return srv.client.Call("DELETE", path, nil, params) } // GetFileDownload get file content by its unique ID. The endpoint response @@ -93,7 +93,7 @@ func (srv *Storage) GetFileDownload(FileId string) (map[string]interface{}, erro params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetFilePreview get a file preview image. Currently, this method supports @@ -113,7 +113,7 @@ func (srv *Storage) GetFilePreview(FileId string, Width int, Height int, Quality "output": Output, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetFileView get file content by its unique ID. This endpoint is similar to @@ -127,5 +127,5 @@ func (srv *Storage) GetFileView(FileId string, As string) (map[string]interface{ "as": As, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index 97b73d1985..e744e6a96e 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -28,7 +28,7 @@ func (srv *Teams) ListTeams(Search string, Limit int, Offset int, OrderType stri "orderType": OrderType, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // CreateTeam create a new team. The user who creates the team will @@ -43,7 +43,7 @@ func (srv *Teams) CreateTeam(Name string, Roles []interface{}) (map[string]inter "roles": Roles, } - return srv.Client.Call("POST", path, nil, params) + return srv.client.Call("POST", path, nil, params) } // GetTeam get team by its unique ID. All team members have read access for @@ -55,7 +55,7 @@ func (srv *Teams) GetTeam(TeamId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // UpdateTeam update team by its unique ID. Only team owners have write access @@ -68,7 +68,7 @@ func (srv *Teams) UpdateTeam(TeamId string, Name string) (map[string]interface{} "name": Name, } - return srv.Client.Call("PUT", path, nil, params) + return srv.client.Call("PUT", path, nil, params) } // DeleteTeam delete team by its unique ID. Only team owners have write access @@ -80,7 +80,7 @@ func (srv *Teams) DeleteTeam(TeamId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("DELETE", path, nil, params) + return srv.client.Call("DELETE", path, nil, params) } // GetTeamMemberships get team members by the team unique ID. All team members @@ -92,7 +92,7 @@ func (srv *Teams) GetTeamMemberships(TeamId string) (map[string]interface{}, err params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // CreateTeamMembership use this endpoint to invite a new member to your team. @@ -120,7 +120,7 @@ func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []inte "url": Url, } - return srv.Client.Call("POST", path, nil, params) + return srv.client.Call("POST", path, nil, params) } // DeleteTeamMembership this endpoint allows a user to leave a team or for a @@ -133,5 +133,5 @@ func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[stri params := map[string]interface{}{ } - return srv.Client.Call("DELETE", path, nil, params) + return srv.client.Call("DELETE", path, nil, params) } diff --git a/app/sdks/go/users.go b/app/sdks/go/users.go index 671f1ed7fa..49f60effe7 100644 --- a/app/sdks/go/users.go +++ b/app/sdks/go/users.go @@ -26,7 +26,7 @@ func (srv *Users) ListUsers(Search string, Limit int, Offset int, OrderType stri "orderType": OrderType, } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // CreateUser create a new user. @@ -39,7 +39,7 @@ func (srv *Users) CreateUser(Email string, Password string, Name string) (map[st "name": Name, } - return srv.Client.Call("POST", path, nil, params) + return srv.client.Call("POST", path, nil, params) } // GetUser get user by its unique ID. @@ -50,7 +50,7 @@ func (srv *Users) GetUser(UserId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetUserLogs get user activity logs list by its unique ID. @@ -61,7 +61,7 @@ func (srv *Users) GetUserLogs(UserId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // GetUserPrefs get user preferences by its unique ID. @@ -72,7 +72,7 @@ func (srv *Users) GetUserPrefs(UserId string) (map[string]interface{}, error) { params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // UpdateUserPrefs update user preferences by its unique ID. You can pass only @@ -85,7 +85,7 @@ func (srv *Users) UpdateUserPrefs(UserId string, Prefs string) (map[string]inter "prefs": Prefs, } - return srv.Client.Call("PATCH", path, nil, params) + return srv.client.Call("PATCH", path, nil, params) } // GetUserSessions get user sessions list by its unique ID. @@ -96,7 +96,7 @@ func (srv *Users) GetUserSessions(UserId string) (map[string]interface{}, error) params := map[string]interface{}{ } - return srv.Client.Call("GET", path, nil, params) + return srv.client.Call("GET", path, nil, params) } // DeleteUserSessions delete all user sessions by its unique ID. @@ -107,7 +107,7 @@ func (srv *Users) DeleteUserSessions(UserId string) (map[string]interface{}, err params := map[string]interface{}{ } - return srv.Client.Call("DELETE", path, nil, params) + return srv.client.Call("DELETE", path, nil, params) } // DeleteUserSession delete user sessions by its unique ID. @@ -119,7 +119,7 @@ func (srv *Users) DeleteUserSession(UserId string, SessionId string) (map[string "sessionId": SessionId, } - return srv.Client.Call("DELETE", path, nil, params) + return srv.client.Call("DELETE", path, nil, params) } // UpdateUserStatus update user status by its unique ID. @@ -131,5 +131,5 @@ func (srv *Users) UpdateUserStatus(UserId string, Status string) (map[string]int "status": Status, } - return srv.Client.Call("PATCH", path, nil, params) + return srv.client.Call("PATCH", path, nil, params) } diff --git a/composer.lock b/composer.lock index 2ece8e9ede..e0ebc2a801 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "590cd29f649869dcbe431c5784bd1483f195e2ec" + "reference": "4d6189abf1fa793556f4f9177c83058b35750fe1" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T20:57:54+00:00" + "time": "2020-01-28T22:54:26+00:00" }, { "name": "doctrine/instantiator", From 5478dcd9348710d51b007b461a29a09f3cf19491 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 29 Jan 2020 01:14:30 +0200 Subject: [PATCH 113/237] Updated Go SDK --- app/sdks/go/avatars.go | 7 +++++-- app/sdks/go/database.go | 7 +++++-- app/sdks/go/locale.go | 7 +++++-- app/sdks/go/storage.go | 7 +++++-- app/sdks/go/teams.go | 7 +++++-- app/sdks/go/users.go | 7 +++++-- composer.lock | 4 ++-- 7 files changed, 32 insertions(+), 14 deletions(-) diff --git a/app/sdks/go/avatars.go b/app/sdks/go/avatars.go index 0fde923722..9803b76af9 100644 --- a/app/sdks/go/avatars.go +++ b/app/sdks/go/avatars.go @@ -9,8 +9,11 @@ type Avatars struct { client Client } -func New(client *Client) *Avatars { - service := Avatars{client} +func NewAvatars(clt *Client) *Avatars { + service := Avatars{ + client: clt, + } + return service } diff --git a/app/sdks/go/database.go b/app/sdks/go/database.go index e21b4810c5..b216270f8a 100644 --- a/app/sdks/go/database.go +++ b/app/sdks/go/database.go @@ -9,8 +9,11 @@ type Database struct { client Client } -func New(client *Client) *Database { - service := Database{client} +func NewDatabase(clt *Client) *Database { + service := Database{ + client: clt, + } + return service } diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go index 704f749d43..c0227e522d 100644 --- a/app/sdks/go/locale.go +++ b/app/sdks/go/locale.go @@ -8,8 +8,11 @@ type Locale struct { client Client } -func New(client *Client) *Locale { - service := Locale{client} +func NewLocale(clt *Client) *Locale { + service := Locale{ + client: clt, + } + return service } diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go index 693fc38536..262d80604e 100644 --- a/app/sdks/go/storage.go +++ b/app/sdks/go/storage.go @@ -9,8 +9,11 @@ type Storage struct { client Client } -func New(client *Client) *Storage { - service := Storage{client} +func NewStorage(clt *Client) *Storage { + service := Storage{ + client: clt, + } + return service } diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index e744e6a96e..40de6613d7 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -9,8 +9,11 @@ type Teams struct { client Client } -func New(client *Client) *Teams { - service := Teams{client} +func NewTeams(clt *Client) *Teams { + service := Teams{ + client: clt, + } + return service } diff --git a/app/sdks/go/users.go b/app/sdks/go/users.go index 49f60effe7..13ab9d8be3 100644 --- a/app/sdks/go/users.go +++ b/app/sdks/go/users.go @@ -9,8 +9,11 @@ type Users struct { client Client } -func New(client *Client) *Users { - service := Users{client} +func NewUsers(clt *Client) *Users { + service := Users{ + client: clt, + } + return service } diff --git a/composer.lock b/composer.lock index e0ebc2a801..5447bc538a 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "4d6189abf1fa793556f4f9177c83058b35750fe1" + "reference": "cc85b5b82e9c91b57f45e61d15c9abaf71749436" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T22:54:26+00:00" + "time": "2020-01-28T23:13:19+00:00" }, { "name": "doctrine/instantiator", From fe0ca71c5d18412d33802025445c306a6bbfba5b Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Wed, 29 Jan 2020 07:08:39 +0200 Subject: [PATCH 114/237] Updated Go services --- app/sdks/go/avatars.go | 2 +- app/sdks/go/database.go | 2 +- app/sdks/go/locale.go | 2 +- app/sdks/go/storage.go | 2 +- app/sdks/go/teams.go | 2 +- app/sdks/go/users.go | 2 +- composer.lock | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/sdks/go/avatars.go b/app/sdks/go/avatars.go index 9803b76af9..feafa9da31 100644 --- a/app/sdks/go/avatars.go +++ b/app/sdks/go/avatars.go @@ -9,7 +9,7 @@ type Avatars struct { client Client } -func NewAvatars(clt *Client) *Avatars { +func NewAvatars(clt Client) Avatars { service := Avatars{ client: clt, } diff --git a/app/sdks/go/database.go b/app/sdks/go/database.go index b216270f8a..e67aa130d9 100644 --- a/app/sdks/go/database.go +++ b/app/sdks/go/database.go @@ -9,7 +9,7 @@ type Database struct { client Client } -func NewDatabase(clt *Client) *Database { +func NewDatabase(clt Client) Database { service := Database{ client: clt, } diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go index c0227e522d..5c379fab4a 100644 --- a/app/sdks/go/locale.go +++ b/app/sdks/go/locale.go @@ -8,7 +8,7 @@ type Locale struct { client Client } -func NewLocale(clt *Client) *Locale { +func NewLocale(clt Client) Locale { service := Locale{ client: clt, } diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go index 262d80604e..7ede9c3255 100644 --- a/app/sdks/go/storage.go +++ b/app/sdks/go/storage.go @@ -9,7 +9,7 @@ type Storage struct { client Client } -func NewStorage(clt *Client) *Storage { +func NewStorage(clt Client) Storage { service := Storage{ client: clt, } diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index 40de6613d7..03e5425d0f 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -9,7 +9,7 @@ type Teams struct { client Client } -func NewTeams(clt *Client) *Teams { +func NewTeams(clt Client) Teams { service := Teams{ client: clt, } diff --git a/app/sdks/go/users.go b/app/sdks/go/users.go index 13ab9d8be3..ecd75f076a 100644 --- a/app/sdks/go/users.go +++ b/app/sdks/go/users.go @@ -9,7 +9,7 @@ type Users struct { client Client } -func NewUsers(clt *Client) *Users { +func NewUsers(clt Client) Users { service := Users{ client: clt, } diff --git a/composer.lock b/composer.lock index 5447bc538a..ec06eba4c9 100644 --- a/composer.lock +++ b/composer.lock @@ -1526,7 +1526,7 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator", - "reference": "cc85b5b82e9c91b57f45e61d15c9abaf71749436" + "reference": "61756346867a1560b790c3a8421a05dfa6fbd421" }, "require": { "ext-curl": "*", @@ -1556,7 +1556,7 @@ } ], "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", - "time": "2020-01-28T23:13:19+00:00" + "time": "2020-01-29T05:06:48+00:00" }, { "name": "doctrine/instantiator", From e9d48712444545795ef67688e7192c81aa1995ca Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 30 Jan 2020 18:17:58 +0200 Subject: [PATCH 115/237] Updated platforms --- app/config/platforms.php | 61 ++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index a18fd1c7d7..98d51c4185 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -5,23 +5,10 @@ const APP_PLATFORM_IOS = 'ios'; const APP_PLATFORM_ANDROID = 'android'; const APP_PLATFORM_UNITY = 'unity'; const APP_PLATFORM_FLUTTER = 'flutter'; + const APP_PLATFORM_SERVER = 'server'; const APP_PLATFORM_CLIENT = 'client'; - -$langDart = [ - 'key' => 'dart', - 'name' => 'Dart', - 'version' => '0.0.6', - 'url' => 'https://github.com/appwrite/sdk-for-dart', - 'enabled' => true, - 'beta' => false, - 'family' => APP_PLATFORM_CLIENT, - 'prism' => 'dart', - 'source' => realpath(__DIR__ . '/../sdks/dart'), - 'gitUrl' => 'git@github.com:appwrite/sdk-for-dart.git', - 'gitRepoName' => 'sdk-for-dart', - 'gitUserName' => 'appwrite', -]; +const APP_PLATFORM_CONSOLE = 'console'; return [ APP_PLATFORM_WEB => [ @@ -127,6 +114,50 @@ return [ ], ], + APP_PLATFORM_FLUTTER => [ + 'name' => 'Flutter', + 'enabled' => false, + 'beta' => false, + 'languages' => [ + [ + 'key' => 'dart', + 'name' => 'Dart', + 'version' => '0.0.6', + 'url' => 'https://github.com/appwrite/sdk-for-dart', + 'enabled' => true, + 'beta' => false, + 'family' => APP_PLATFORM_CLIENT, + 'prism' => 'dart', + 'source' => realpath(__DIR__ . '/../sdks/dart'), + 'gitUrl' => 'git@github.com:appwrite/sdk-for-dart.git', + 'gitRepoName' => 'sdk-for-dart', + 'gitUserName' => 'appwrite', + ], + ], + ], + + // APP_PLATFORM_CONSOLE => [ + // 'name' => 'Console', + // 'enabled' => false, + // 'beta' => false, + // 'languages' => [ + // [ + // 'key' => 'javascript', + // 'name' => 'JS', + // 'version' => '1.0.0', + // 'url' => 'https://github.com/appwrite/sdk-for-console', + // 'enabled' => true, + // 'beta' => false, + // 'family' => APP_PLATFORM_CONSOLE, + // 'prism' => 'console', + // 'source' => realpath(__DIR__ . '/../sdks/console'), + // 'gitUrl' => 'git@github.com:appwrite/sdk-for-console.git', + // 'gitRepoName' => 'sdk-for-console', + // 'gitUserName' => 'appwrite', + // ], + // ], + // ], + APP_PLATFORM_SERVER => [ 'name' => 'Server', 'enabled' => true, From 1beaa237f0bf434a725c509853949aeb7612c623 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 30 Jan 2020 18:18:46 +0200 Subject: [PATCH 116/237] Updated SDK examples --- app/app.php | 10 ++++++---- app/controllers/api/account.php | 32 ++++++++++++++++---------------- app/controllers/api/database.php | 20 ++++++++++---------- app/controllers/api/health.php | 2 +- app/controllers/api/locale.php | 2 +- app/controllers/api/projects.php | 14 +++++++------- app/controllers/api/storage.php | 21 ++++++++++----------- app/controllers/api/teams.php | 18 +++++++++--------- app/controllers/api/users.php | 20 ++++++++++---------- 9 files changed, 70 insertions(+), 69 deletions(-) diff --git a/app/app.php b/app/app.php index 45e2e98bd5..96fdf2a723 100644 --- a/app/app.php +++ b/app/app.php @@ -413,7 +413,7 @@ $utopia->get('/v1/proxy') $utopia->get('/v1/open-api-2.json') ->label('scope', 'public') ->label('docs', false) - ->param('platform', 'client', function () {return new WhiteList(['client', 'server']);}, 'Choose target platform.', true) + ->param('platform', 'client', function () {return new WhiteList([APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER, APP_PLATFORM_CONSOLE]);}, 'Choose target platform.', true) ->param('extensions', 0, function () {return new Range(0, 1);}, 'Show extra data.', true) ->param('tests', 0, function () {return new Range(0, 1);}, 'Include only test services.', true) ->action( @@ -448,13 +448,15 @@ $utopia->get('/v1/open-api-2.json') } $security = [ - 'client' => ['Project' => []], - 'server' => ['Project' => [], 'Key' => []], + APP_PLATFORM_CLIENT => ['Project' => []], + APP_PLATFORM_SERVER => ['Project' => [], 'Key' => []], + APP_PLATFORM_CONSOLE => ['Project' => [], 'Key' => []], ]; $platforms = [ 'client' => APP_PLATFORM_CLIENT, 'server' => APP_PLATFORM_SERVER, + 'all' => APP_PLATFORM_CONSOLE, ]; /* @@ -571,7 +573,7 @@ $utopia->get('/v1/open-api-2.json') continue; } - if(!in_array($platforms[$platform], $route->getLabel('sdk.platform', []))) { + if($platform !== APP_PLATFORM_CONSOLE && !in_array($platforms[$platform], $route->getLabel('sdk.platform', []))) { continue; } diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index 7c78712904..26db054c45 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -46,7 +46,7 @@ $utopia->get('/v1/account') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'getAccount') + ->label('sdk.method', 'get') ->label('sdk.description', '/docs/references/account/get.md') ->label('sdk.response', ['200' => 'user']) ->action( @@ -68,7 +68,7 @@ $utopia->get('/v1/account/prefs') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'getAccountPrefs') + ->label('sdk.method', 'getPrefs') ->label('sdk.description', '/docs/references/account/get-prefs.md') ->action( function () use ($response, $user) { @@ -90,7 +90,7 @@ $utopia->get('/v1/account/sessions') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'getAccountSessions') + ->label('sdk.method', 'getSessions') ->label('sdk.description', '/docs/references/account/get-sessions.md') ->action( function () use ($response, $user) { @@ -148,7 +148,7 @@ $utopia->get('/v1/account/logs') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'getAccountLogs') + ->label('sdk.method', 'getLogs') ->label('sdk.description', '/docs/references/account/get-logs.md') ->action( function () use ($response, $register, $project, $user) { @@ -223,7 +223,7 @@ $utopia->post('/v1/account') ->label('scope', 'public') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'createAccount') + ->label('sdk.method', 'create') ->label('sdk.description', '/docs/references/account/create.md') ->label('abuse-limit', 10) ->param('email', '', function () { return new Email(); }, 'Account email') @@ -319,7 +319,7 @@ $utopia->post('/v1/account/sessions') ->label('scope', 'public') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'createAccountSession') + ->label('sdk.method', 'createSession') ->label('sdk.description', '/docs/references/account/create-session.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},email:{param-email}') @@ -402,7 +402,7 @@ $utopia->get('/v1/account/sessions/oauth/:provider') ->label('scope', 'public') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'createAccountSessionOAuth') + ->label('sdk.method', 'createOAuthSession') ->label('sdk.description', '/docs/references/account/create-session-oauth.md') ->label('sdk.response.code', 301) ->label('sdk.response.type', 'text/html') @@ -631,7 +631,7 @@ $utopia->patch('/v1/account/name') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'updateAccountName') + ->label('sdk.method', 'updateName') ->label('sdk.description', '/docs/references/account/update-name.md') ->param('name', '', function () { return new Text(100); }, 'User name') ->action( @@ -667,7 +667,7 @@ $utopia->patch('/v1/account/password') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'updateAccountPassword') + ->label('sdk.method', 'updatePassword') ->label('sdk.description', '/docs/references/account/update-password.md') ->param('password', '', function () { return new Password(); }, 'New password') ->param('old-password', '', function () { return new Password(); }, 'Old password') @@ -851,7 +851,7 @@ $utopia->delete('/v1/account/sessions/:id') ->label('webhook', 'account.sessions.delete') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'deleteAccountSession') + ->label('sdk.method', 'deleteSession') ->label('sdk.description', '/docs/references/account/delete-session.md') ->label('abuse-limit', 100) ->param('id', null, function () { return new UID(); }, 'Session unique ID.') @@ -896,7 +896,7 @@ $utopia->delete('/v1/account/sessions/current') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'deleteAccountCurrentSession') + ->label('sdk.method', 'deleteCurrentSession') ->label('sdk.description', '/docs/references/account/delete-session-current.md') ->label('abuse-limit', 100) ->action( @@ -930,7 +930,7 @@ $utopia->delete('/v1/account/sessions') ->label('webhook', 'account.sessions.delete') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'deleteAccountSessions') + ->label('sdk.method', 'deleteSessions') ->label('sdk.description', '/docs/references/account/delete-sessions.md') ->label('abuse-limit', 100) ->action( @@ -971,7 +971,7 @@ $utopia->post('/v1/account/recovery') ->label('scope', 'public') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'createAccountRecovery') + ->label('sdk.method', 'createRecovery') ->label('sdk.description', '/docs/references/account/create-recovery.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},email:{param-email}') @@ -1063,7 +1063,7 @@ $utopia->put('/v1/account/recovery') ->label('scope', 'public') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'updateAccountRecovery') + ->label('sdk.method', 'updateRecovery') ->label('sdk.description', '/docs/references/account/update-recovery.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{param-userId}') @@ -1132,7 +1132,7 @@ $utopia->put('/v1/account/recovery') ->desc('Create Verification') ->label('scope', 'account') ->label('sdk.namespace', 'account') - ->label('sdk.method', 'createAccountVerification') + ->label('sdk.method', 'createVerification') ->label('sdk.description', '/docs/references/account/create-verification.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},email:{param-email}') @@ -1211,7 +1211,7 @@ $utopia->put('/v1/account/verification') ->label('scope', 'public') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'account') - ->label('sdk.method', 'updateAccountVerification') + ->label('sdk.method', 'updateVerification') ->label('sdk.description', '/docs/references/account/update-verification.md') ->label('abuse-limit', 10) ->label('abuse-key', 'url:{url},userId:{param-userId}') diff --git a/app/controllers/api/database.php b/app/controllers/api/database.php index aba5c94485..61003b15cd 100644 --- a/app/controllers/api/database.php +++ b/app/controllers/api/database.php @@ -23,7 +23,7 @@ include_once __DIR__ . '/../shared/api.php'; $isDev = (App::ENV_TYPE_PRODUCTION !== $utopia->getEnv()); -$utopia->get('/v1/database') +$utopia->get('/v1/database/collections') ->desc('List Collections') ->label('scope', 'collections.read') ->label('sdk.namespace', 'database') @@ -71,7 +71,7 @@ $utopia->get('/v1/database') } ); -$utopia->get('/v1/database/:collectionId') +$utopia->get('/v1/database/collections/:collectionId') ->desc('Get Collection') ->label('scope', 'collections.read') ->label('sdk.namespace', 'database') @@ -91,7 +91,7 @@ $utopia->get('/v1/database/:collectionId') } ); -$utopia->post('/v1/database') +$utopia->post('/v1/database/collections') ->desc('Create Collection') ->label('webhook', 'database.collections.create') ->label('scope', 'collections.write') @@ -160,7 +160,7 @@ $utopia->post('/v1/database') } ); -$utopia->put('/v1/database/:collectionId') +$utopia->put('/v1/database/collections/:collectionId') ->desc('Update Collection') ->label('scope', 'collections.write') ->label('webhook', 'database.collections.update') @@ -224,7 +224,7 @@ $utopia->put('/v1/database/:collectionId') } ); -$utopia->delete('/v1/database/:collectionId') +$utopia->delete('/v1/database/collections/:collectionId') ->desc('Delete Collection') ->label('scope', 'collections.write') ->label('webhook', 'database.collections.delete') @@ -261,7 +261,7 @@ $utopia->delete('/v1/database/:collectionId') } ); -$utopia->get('/v1/database/:collectionId/documents') +$utopia->get('/v1/database/collections/:collectionId/documents') ->desc('List Documents') ->label('scope', 'documents.read') ->label('sdk.namespace', 'database') @@ -328,7 +328,7 @@ $utopia->get('/v1/database/:collectionId/documents') } ); -$utopia->get('/v1/database/:collectionId/documents/:documentId') +$utopia->get('/v1/database/collections/:collectionId/documents/:documentId') ->desc('Get Document') ->label('scope', 'documents.read') ->label('sdk.namespace', 'database') @@ -373,7 +373,7 @@ $utopia->get('/v1/database/:collectionId/documents/:documentId') } ); -$utopia->post('/v1/database/:collectionId/documents') +$utopia->post('/v1/database/collections/:collectionId/documents') ->desc('Create Document') ->label('webhook', 'database.documents.create') ->label('scope', 'documents.write') @@ -480,7 +480,7 @@ $utopia->post('/v1/database/:collectionId/documents') } ); -$utopia->patch('/v1/database/:collectionId/documents/:documentId') +$utopia->patch('/v1/database/collections/:collectionId/documents/:documentId') ->desc('Update Document') ->label('webhook', 'database.documents.update') ->label('scope', 'documents.write') @@ -559,7 +559,7 @@ $utopia->patch('/v1/database/:collectionId/documents/:documentId') } ); -$utopia->delete('/v1/database/:collectionId/documents/:documentId') +$utopia->delete('/v1/database/collections/:collectionId/documents/:documentId') ->desc('Delete Document') ->label('scope', 'documents.write') ->label('webhook', 'database.documents.delete') diff --git a/app/controllers/api/health.php b/app/controllers/api/health.php index 810799815d..04cf1dba77 100644 --- a/app/controllers/api/health.php +++ b/app/controllers/api/health.php @@ -12,7 +12,7 @@ $utopia->get('/v1/health') ->label('scope', 'health.read') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'health') - ->label('sdk.method', 'getDB') + ->label('sdk.method', 'get') ->label('docs', false) ->action( function () use ($response) { diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php index 114e5da9de..8b78dc66bf 100644 --- a/app/controllers/api/locale.php +++ b/app/controllers/api/locale.php @@ -13,7 +13,7 @@ $utopia->get('/v1/locale') ->label('scope', 'locale.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'locale') - ->label('sdk.method', 'getLocale') + ->label('sdk.method', 'get') ->label('sdk.description', '/docs/references/locale/get-locale.md') ->action( function () use ($response, $request, $utopia) { diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index d10717905c..67c7065cdb 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -24,7 +24,7 @@ $utopia->get('/v1/projects') ->desc('List Projects') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'listProjects') + ->label('sdk.method', 'list') ->action( function () use ($request, $response, $providers, $consoleDB) { $results = $consoleDB->getCollection([ @@ -57,7 +57,7 @@ $utopia->get('/v1/projects/:projectId') ->desc('Get Project') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'getProject') + ->label('sdk.method', 'get') ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($request, $response, $providers, $consoleDB) { @@ -84,7 +84,7 @@ $utopia->get('/v1/projects/:projectId/usage') ->desc('Get Project') ->label('scope', 'projects.read') ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'getProjectUsage') + ->label('sdk.method', 'getUsage') ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($response, $consoleDB, $projectDB, $register) { @@ -218,7 +218,7 @@ $utopia->post('/v1/projects') ->desc('Create Project') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'createProject') + ->label('sdk.method', 'create') ->param('name', null, function () { return new Text(100); }, 'Project name') ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->param('description', '', function () { return new Text(255); }, 'Project description', true) @@ -278,7 +278,7 @@ $utopia->patch('/v1/projects/:projectId') ->desc('Update Project') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'updateProject') + ->label('sdk.method', 'update') ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->param('name', null, function () { return new Text(100); }, 'Project name') ->param('description', '', function () { return new Text(255); }, 'Project description', true) @@ -323,7 +323,7 @@ $utopia->patch('/v1/projects/:projectId/oauth') ->desc('Update Project OAuth') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'updateProjectOAuth') + ->label('sdk.method', 'updateOAuth') ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->param('provider', '', function () use ($providers) { return new WhiteList(array_keys($providers)); }, 'Provider Name', false) ->param('appId', '', function () { return new Text(256); }, 'Provider App ID', true) @@ -364,7 +364,7 @@ $utopia->delete('/v1/projects/:projectId') ->desc('Delete Project') ->label('scope', 'projects.write') ->label('sdk.namespace', 'projects') - ->label('sdk.method', 'deleteProject') + ->label('sdk.method', 'delete') ->param('projectId', '', function () { return new UID(); }, 'Project unique ID.') ->action( function ($projectId) use ($response, $consoleDB) { diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index ca7e213ccb..ca3748b6f4 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -121,7 +121,7 @@ $utopia->get('/v1/storage/files') ->label('scope', 'files.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'listFiles') + ->label('sdk.method', 'list') ->label('sdk.description', '/docs/references/storage/list-files.md') ->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true) ->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) @@ -154,7 +154,7 @@ $utopia->get('/v1/storage/files/:fileId') ->label('scope', 'files.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'getFile') + ->label('sdk.method', 'get') ->label('sdk.description', '/docs/references/storage/get-file.md') ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->action( @@ -174,7 +174,7 @@ $utopia->get('/v1/storage/files/:fileId/preview') ->label('scope', 'files.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'getFilePreview') + ->label('sdk.method', 'getPreview') ->label('sdk.description', '/docs/references/storage/get-file-preview.md') ->label('sdk.response.type', 'image/*') ->param('fileId', '', function () { return new UID(); }, 'File unique ID') @@ -287,7 +287,7 @@ $utopia->get('/v1/storage/files/:fileId/download') ->label('scope', 'files.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'getFileDownload') + ->label('sdk.method', 'getDownload') ->label('sdk.description', '/docs/references/storage/get-file-download.md') ->label('sdk.response.type', '*') ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') @@ -339,7 +339,7 @@ $utopia->get('/v1/storage/files/:fileId/view') ->label('scope', 'files.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'getFileView') + ->label('sdk.method', 'getView') ->label('sdk.description', '/docs/references/storage/get-file-view.md') ->label('sdk.response.type', '*') ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') @@ -409,7 +409,7 @@ $utopia->post('/v1/storage/files') ->label('webhook', 'storage.files.create') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'createFile') + ->label('sdk.method', 'create') ->label('sdk.description', '/docs/references/storage/create-file.md') ->label('sdk.consumes', 'multipart/form-data') ->param('file', [], function () { return new File(); }, 'Binary Files.', false) @@ -543,7 +543,7 @@ $utopia->put('/v1/storage/files/:fileId') ->label('webhook', 'storage.files.update') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'updateFile') + ->label('sdk.method', 'update') ->label('sdk.description', '/docs/references/storage/update-file.md') ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->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.') @@ -588,7 +588,7 @@ $utopia->delete('/v1/storage/files/:fileId') ->label('webhook', 'storage.files.delete') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'deleteFile') + ->label('sdk.method', 'delete') ->label('sdk.description', '/docs/references/storage/delete-file.md') ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') ->action( @@ -629,11 +629,10 @@ $utopia->get('/v1/storage/files/:fileId/scan') ->label('scope', 'god') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'storage') - ->label('sdk.method', 'getFileScan') + ->label('sdk.method', 'getScan') ->label('sdk.hide', true) ->param('fileId', '', function () { return new UID(); }, 'File unique ID.') - ->param('storage', 'local', function () { return new WhiteList(['local']); - }) + ->param('storage', 'local', function () { return new WhiteList(['local']);}) ->action( function ($fileId, $storage) use ($response, $request, $projectDB) { $file = $projectDB->getDocument($fileId); diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index d0fef46184..65008811c4 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -25,7 +25,7 @@ $utopia->get('/v1/teams') ->label('scope', 'teams.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'listTeams') + ->label('sdk.method', 'list') ->label('sdk.description', '/docs/references/teams/list-teams.md') ->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true) ->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) @@ -54,7 +54,7 @@ $utopia->get('/v1/teams/:teamId') ->label('scope', 'teams.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'getTeam') + ->label('sdk.method', 'get') ->label('sdk.description', '/docs/references/teams/get-team.md') ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->action( @@ -74,7 +74,7 @@ $utopia->post('/v1/teams') ->label('scope', 'teams.write') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'createTeam') + ->label('sdk.method', 'create') ->label('sdk.description', '/docs/references/teams/create-team.md') ->param('name', null, function () { return new Text(100); }, 'Team name.') ->param('roles', ['owner'], function () { return new ArrayList(new Text(128)); }, 'User roles array. Use this param to set the roles in the team for the user who created the team. The default role is **owner**, a role can be any string.', true) @@ -137,7 +137,7 @@ $utopia->put('/v1/teams/:teamId') ->label('scope', 'teams.write') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'updateTeam') + ->label('sdk.method', 'update') ->label('sdk.description', '/docs/references/teams/update-team.md') ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->param('name', null, function () { return new Text(100); }, 'Team name.') @@ -166,7 +166,7 @@ $utopia->delete('/v1/teams/:teamId') ->label('scope', 'teams.write') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'deleteTeam') + ->label('sdk.method', 'delete') ->label('sdk.description', '/docs/references/teams/delete-team.md') ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->action( @@ -205,7 +205,7 @@ $utopia->get('/v1/teams/:teamId/memberships') ->label('scope', 'teams.read') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'getTeamMemberships') + ->label('sdk.method', 'getMemberships') ->label('sdk.description', '/docs/references/teams/get-team-members.md') ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->action( @@ -262,7 +262,7 @@ $utopia->post('/v1/teams/:teamId/memberships') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'createTeamMembership') + ->label('sdk.method', 'createMembership') ->label('sdk.description', '/docs/references/teams/create-team-membership.md') ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->param('email', '', function () { return new Email(); }, 'New team member email address.') @@ -418,7 +418,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') ->label('scope', 'public') ->label('sdk.platform', [APP_PLATFORM_CLIENT]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'updateTeamMembershipStatus') + ->label('sdk.method', 'updateMembershipStatus') ->label('sdk.description', '/docs/references/teams/update-team-membership-status.md') ->label('sdk.cookies', true) ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') @@ -543,7 +543,7 @@ $utopia->delete('/v1/teams/:teamId/memberships/:inviteId') ->label('scope', 'account') ->label('sdk.platform', [APP_PLATFORM_CLIENT, APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'teams') - ->label('sdk.method', 'deleteTeamMembership') + ->label('sdk.method', 'deleteMembership') ->label('sdk.description', '/docs/references/teams/delete-team-membership.md') ->param('teamId', '', function () { return new UID(); }, 'Team unique ID.') ->param('inviteId', '', function () { return new UID(); }, 'Invite unique ID') diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index f748057f91..0623f1788f 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -26,7 +26,7 @@ $utopia->get('/v1/users') ->label('scope', 'users.read') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'listUsers') + ->label('sdk.method', 'list') ->label('sdk.description', '/docs/references/users/list-users.md') ->param('search', '', function () { return new Text(256); }, 'Search term to filter your list results.', true) ->param('limit', 25, function () { return new Range(0, 100); }, 'Results limit value. By default will return maximum 25 results. Maximum of 100 results allowed per request.', true) @@ -80,7 +80,7 @@ $utopia->get('/v1/users/:userId') ->label('scope', 'users.read') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'getUser') + ->label('sdk.method', 'get') ->label('sdk.description', '/docs/references/users/get-user.md') ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( @@ -121,7 +121,7 @@ $utopia->get('/v1/users/:userId/prefs') ->label('scope', 'users.read') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'getUserPrefs') + ->label('sdk.method', 'getPrefs') ->label('sdk.description', '/docs/references/users/get-user-prefs.md') ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( @@ -150,7 +150,7 @@ $utopia->get('/v1/users/:userId/sessions') ->label('scope', 'users.read') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'getUserSessions') + ->label('sdk.method', 'getSessions') ->label('sdk.description', '/docs/references/users/get-user-sessions.md') ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( @@ -213,7 +213,7 @@ $utopia->get('/v1/users/:userId/logs') ->label('scope', 'users.read') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'getUserLogs') + ->label('sdk.method', 'getLogs') ->label('sdk.description', '/docs/references/users/get-user-logs.md') ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->action( @@ -277,7 +277,7 @@ $utopia->post('/v1/users') ->label('scope', 'users.write') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'createUser') + ->label('sdk.method', 'create') ->label('sdk.description', '/docs/references/users/create-user.md') ->param('email', '', function () { return new Email(); }, 'User account email.') ->param('password', '', function () { return new Password(); }, 'User account password.') @@ -342,7 +342,7 @@ $utopia->patch('/v1/users/:userId/status') ->label('scope', 'users.write') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'updateUserStatus') + ->label('sdk.method', 'updateStatus') ->label('sdk.description', '/docs/references/users/update-user-status.md') ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->param('status', '', function () { return new WhiteList([Auth::USER_STATUS_ACTIVATED, Auth::USER_STATUS_BLOCKED, Auth::USER_STATUS_UNACTIVATED]); }, 'User Status code. To activate the user pass '.Auth::USER_STATUS_ACTIVATED.', to block the user pass '.Auth::USER_STATUS_BLOCKED.' and for disabling the user pass '.Auth::USER_STATUS_UNACTIVATED) @@ -390,7 +390,7 @@ $utopia->patch('/v1/users/:userId/prefs') ->label('scope', 'users.write') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'updateUserPrefs') + ->label('sdk.method', 'updatePrefs') ->label('sdk.description', '/docs/references/users/update-user-prefs.md') ->param('userId', '', function () { return new UID(); }, 'User unique ID.') ->param('prefs', '', function () { return new Assoc();}, 'Prefs key-value JSON object.') @@ -432,7 +432,7 @@ $utopia->delete('/v1/users/:userId/sessions/:session') ->label('scope', 'users.write') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'deleteUserSession') + ->label('sdk.method', 'deleteSession') ->label('sdk.description', '/docs/references/users/delete-user-session.md') ->label('abuse-limit', 100) ->param('userId', '', function () { return new UID(); }, 'User unique ID.') @@ -464,7 +464,7 @@ $utopia->delete('/v1/users/:userId/sessions') ->label('scope', 'users.write') ->label('sdk.platform', [APP_PLATFORM_SERVER]) ->label('sdk.namespace', 'users') - ->label('sdk.method', 'deleteUserSessions') + ->label('sdk.method', 'deleteSessions') ->label('sdk.description', '/docs/references/users/delete-user-sessions.md') ->label('abuse-limit', 100) ->param('userId', '', function () { return new UID(); }, 'User unique ID.') From d03840bb0508247a805d24ef48ef6e6d17f2c1cc Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 30 Jan 2020 18:18:59 +0200 Subject: [PATCH 117/237] Updated SDK examples --- app/sdks/dart/LICENSE | 12 + app/sdks/dart/README.md | 29 + app/sdks/dart/lib/appwrite.dart | 8 + app/sdks/dart/lib/client.dart | 100 + app/sdks/dart/lib/service.dart | 9 + app/sdks/dart/lib/services/account.dart | 259 ++ app/sdks/dart/lib/services/avatars.dart | 93 + app/sdks/dart/lib/services/database.dart | 139 + app/sdks/dart/lib/services/locale.dart | 74 + app/sdks/dart/lib/services/storage.dart | 109 + app/sdks/dart/lib/services/teams.dart | 140 + app/sdks/dart/pubspec.yaml | 11 + app/sdks/go/database.go | 20 +- .../examples/locale/{get-locale.md => get.md} | 2 +- .../storage/{get-file.md => create.md} | 2 +- .../storage/{delete-file.md => delete.md} | 2 +- .../{create-file.md => get-download.md} | 2 +- .../docs/examples/storage/get-file-preview.md | 25 - .../{get-file-view.md => get-preview.md} | 2 +- .../{get-file-download.md => get-view.md} | 2 +- app/sdks/go/docs/examples/storage/get.md | 25 + .../go/docs/examples/storage/list-files.md | 25 - app/sdks/go/docs/examples/storage/list.md | 25 + .../go/docs/examples/storage/update-file.md | 25 - app/sdks/go/docs/examples/storage/update.md | 25 + ...eam-membership.md => create-membership.md} | 2 +- .../examples/teams/create-team-membership.md | 25 - .../examples/teams/{get-team.md => create.md} | 2 +- .../docs/examples/teams/delete-membership.md | 25 + .../teams/{delete-team.md => delete.md} | 2 +- ...team-memberships.md => get-memberships.md} | 2 +- .../examples/teams/{create-team.md => get.md} | 2 +- app/sdks/go/docs/examples/teams/list-teams.md | 25 - app/sdks/go/docs/examples/teams/list.md | 25 + .../go/docs/examples/teams/update-team.md | 25 - app/sdks/go/docs/examples/teams/update.md | 25 + .../go/docs/examples/users/create-user.md | 25 - .../{delete-user-session.md => create.md} | 2 +- ...ete-user-sessions.md => delete-session.md} | 2 +- ...et-user-sessions.md => delete-sessions.md} | 2 +- .../users/{get-user.md => get-logs.md} | 2 +- .../users/{get-user-logs.md => get-prefs.md} | 2 +- .../{get-user-prefs.md => get-sessions.md} | 2 +- app/sdks/go/docs/examples/users/get.md | 25 + app/sdks/go/docs/examples/users/list-users.md | 25 - app/sdks/go/docs/examples/users/list.md | 25 + .../go/docs/examples/users/update-prefs.md | 25 + .../go/docs/examples/users/update-status.md | 25 + .../docs/examples/users/update-user-prefs.md | 25 - .../docs/examples/users/update-user-status.md | 25 - app/sdks/go/locale.go | 8 +- app/sdks/go/storage.go | 48 +- app/sdks/go/teams.go | 54 +- app/sdks/go/users.go | 44 +- .../account/create-account-session-o-auth.md | 12 - .../examples/account/create-o-auth-session.md | 12 + .../docs/examples/account/create-recovery.md | 12 + .../{create-account.md => create-session.md} | 2 +- .../docs/examples/account/create.md | 12 + .../account/delete-current-session.md | 13 + .../docs/examples/account/delete-session.md | 13 + ...get-account-logs.md => delete-sessions.md} | 2 +- .../list-teams.md => account/get-logs.md} | 2 +- .../get-locale.md => account/get-prefs.md} | 2 +- .../docs/examples/account/get-sessions.md | 13 + .../{storage/list-files.md => account/get.md} | 2 +- .../examples/account/update-account-name.md | 13 - .../account/update-account-password.md | 13 - .../account/update-account-recovery.md | 12 - .../account/update-account-verification.md | 12 - ...get-account-sessions.md => update-name.md} | 2 +- ...-current-session.md => update-password.md} | 2 +- .../docs/examples/account/update-recovery.md | 12 + ...ount-session.md => update-verification.md} | 2 +- .../{account/get-account.md => locale/get.md} | 2 +- .../docs/examples/storage/create-file.md | 13 - .../docs/examples/storage/create.md | 13 + .../docs/examples/storage/delete-file.md | 13 - .../docs/examples/storage/delete.md | 13 + .../docs/examples/storage/get-download.md | 13 + .../examples/storage/get-file-download.md | 13 - .../docs/examples/storage/get-file-preview.md | 13 - .../docs/examples/storage/get-file-view.md | 13 - .../docs/examples/storage/get-file.md | 13 - .../get-preview.md} | 2 +- .../docs/examples/storage/get-view.md | 13 + .../javascript/docs/examples/storage/get.md | 13 + .../javascript/docs/examples/storage/list.md | 13 + .../docs/examples/storage/update-file.md | 13 - .../docs/examples/storage/update.md | 13 + .../docs/examples/teams/create-membership.md | 13 + .../examples/teams/create-team-membership.md | 13 - .../docs/examples/teams/create-team.md | 13 - .../javascript/docs/examples/teams/create.md | 13 + .../delete-membership.md} | 2 +- .../examples/teams/delete-team-membership.md | 13 - .../docs/examples/teams/delete-team.md | 13 - .../get-account-prefs.md => teams/delete.md} | 2 +- .../docs/examples/teams/get-memberships.md | 13 + .../examples/teams/get-team-memberships.md | 13 - .../docs/examples/teams/get-team.md | 13 - .../javascript/docs/examples/teams/get.md | 13 + .../javascript/docs/examples/teams/list.md | 13 + .../update-membership-status.md} | 2 +- .../teams/update-team-membership-status.md | 12 - .../docs/examples/teams/update-team.md | 13 - .../javascript/docs/examples/teams/update.md | 13 + app/sdks/javascript/src/sdk.js | 86 +- app/sdks/javascript/src/sdk.min.js | 72 +- .../examples/locale/{get-locale.md => get.md} | 2 +- .../docs/examples/storage/create-file.md | 19 - .../{get-file-download.md => create.md} | 2 +- .../storage/{get-file.md => delete.md} | 2 +- .../{get-file-view.md => get-download.md} | 2 +- .../{delete-file.md => get-preview.md} | 2 +- .../nodejs/docs/examples/storage/get-view.md | 19 + app/sdks/nodejs/docs/examples/storage/get.md | 19 + .../storage/{list-files.md => list.md} | 2 +- .../docs/examples/storage/update-file.md | 19 - .../{get-file-preview.md => update.md} | 2 +- ...eam-membership.md => create-membership.md} | 2 +- .../examples/teams/create-team-membership.md | 19 - .../examples/teams/{get-team.md => create.md} | 2 +- ...am-memberships.md => delete-membership.md} | 2 +- .../teams/{create-team.md => delete.md} | 2 +- .../docs/examples/teams/get-memberships.md | 19 + .../examples/teams/{delete-team.md => get.md} | 2 +- .../examples/teams/{list-teams.md => list.md} | 2 +- .../nodejs/docs/examples/teams/update-team.md | 19 - app/sdks/nodejs/docs/examples/teams/update.md | 19 + .../nodejs/docs/examples/users/create-user.md | 19 - .../{delete-user-sessions.md => create.md} | 2 +- .../docs/examples/users/delete-session.md | 19 + .../docs/examples/users/delete-sessions.md | 19 + .../examples/users/delete-user-session.md | 19 - .../users/{get-user.md => get-logs.md} | 2 +- .../users/{get-user-logs.md => get-prefs.md} | 2 +- .../{get-user-prefs.md => get-sessions.md} | 2 +- app/sdks/nodejs/docs/examples/users/get.md | 19 + .../examples/users/{list-users.md => list.md} | 2 +- .../{get-user-sessions.md => update-prefs.md} | 2 +- .../docs/examples/users/update-status.md | 19 + .../docs/examples/users/update-user-prefs.md | 19 - .../docs/examples/users/update-user-status.md | 19 - app/sdks/nodejs/lib/services/database.js | 20 +- app/sdks/nodejs/lib/services/locale.js | 2 +- app/sdks/nodejs/lib/services/storage.js | 16 +- app/sdks/nodejs/lib/services/teams.js | 16 +- app/sdks/nodejs/lib/services/users.js | 20 +- app/sdks/php/docs/database.md | 20 +- .../examples/locale/{get-locale.md => get.md} | 2 +- .../php/docs/examples/storage/create-file.md | 15 - .../{get-file-download.md => create.md} | 2 +- .../storage/{get-file.md => delete.md} | 2 +- .../{get-file-view.md => get-download.md} | 2 +- .../{delete-file.md => get-preview.md} | 2 +- .../php/docs/examples/storage/get-view.md | 15 + app/sdks/php/docs/examples/storage/get.md | 15 + .../storage/{list-files.md => list.md} | 2 +- .../php/docs/examples/storage/update-file.md | 15 - .../{get-file-preview.md => update.md} | 2 +- ...eam-membership.md => create-membership.md} | 2 +- .../examples/teams/create-team-membership.md | 15 - .../examples/teams/{get-team.md => create.md} | 2 +- ...am-memberships.md => delete-membership.md} | 2 +- .../teams/{create-team.md => delete.md} | 2 +- .../docs/examples/teams/get-memberships.md | 15 + .../examples/teams/{delete-team.md => get.md} | 2 +- .../examples/teams/{list-teams.md => list.md} | 2 +- .../php/docs/examples/teams/update-team.md | 15 - app/sdks/php/docs/examples/teams/update.md | 15 + .../php/docs/examples/users/create-user.md | 15 - .../{delete-user-sessions.md => create.md} | 2 +- .../php/docs/examples/users/delete-session.md | 15 + .../docs/examples/users/delete-sessions.md | 15 + .../examples/users/delete-user-session.md | 15 - .../users/{get-user.md => get-logs.md} | 2 +- .../users/{get-user-logs.md => get-prefs.md} | 2 +- .../{get-user-prefs.md => get-sessions.md} | 2 +- app/sdks/php/docs/examples/users/get.md | 15 + .../examples/users/{list-users.md => list.md} | 2 +- .../{get-user-sessions.md => update-prefs.md} | 2 +- .../php/docs/examples/users/update-status.md | 15 + .../docs/examples/users/update-user-prefs.md | 15 - .../docs/examples/users/update-user-status.md | 15 - .../php/src/Appwrite/Services/Database.php | 20 +- app/sdks/php/src/Appwrite/Services/Locale.php | 2 +- .../php/src/Appwrite/Services/Storage.php | 16 +- app/sdks/php/src/Appwrite/Services/Teams.php | 16 +- app/sdks/php/src/Appwrite/Services/Users.php | 20 +- app/sdks/python/appwrite/services/database.py | 20 +- app/sdks/python/appwrite/services/locale.py | 2 +- app/sdks/python/appwrite/services/storage.py | 16 +- app/sdks/python/appwrite/services/teams.py | 16 +- app/sdks/python/appwrite/services/users.py | 20 +- .../examples/locale/{get-locale.md => get.md} | 2 +- .../docs/examples/storage/create-file.md | 13 - .../{get-file-download.md => create.md} | 2 +- .../storage/{get-file.md => delete.md} | 2 +- .../{get-file-view.md => get-download.md} | 2 +- .../docs/examples/storage/get-file-preview.md | 13 - .../{delete-file.md => get-preview.md} | 2 +- .../python/docs/examples/storage/get-view.md | 13 + app/sdks/python/docs/examples/storage/get.md | 13 + .../storage/{list-files.md => list.md} | 2 +- .../docs/examples/storage/update-file.md | 13 - .../python/docs/examples/storage/update.md | 13 + ...eam-membership.md => create-membership.md} | 2 +- .../examples/teams/create-team-membership.md | 13 - .../teams/{create-team.md => create.md} | 2 +- ...am-memberships.md => delete-membership.md} | 2 +- .../examples/teams/{get-team.md => delete.md} | 2 +- .../docs/examples/teams/get-memberships.md | 13 + .../examples/teams/{delete-team.md => get.md} | 2 +- .../examples/teams/{list-teams.md => list.md} | 2 +- .../python/docs/examples/teams/update-team.md | 13 - app/sdks/python/docs/examples/teams/update.md | 13 + .../python/docs/examples/users/create-user.md | 13 - .../{delete-user-sessions.md => create.md} | 2 +- .../docs/examples/users/delete-session.md | 13 + .../docs/examples/users/delete-sessions.md | 13 + .../examples/users/delete-user-session.md | 13 - .../users/{get-user.md => get-logs.md} | 2 +- .../users/{get-user-logs.md => get-prefs.md} | 2 +- .../{get-user-prefs.md => get-sessions.md} | 2 +- app/sdks/python/docs/examples/users/get.md | 13 + .../examples/users/{list-users.md => list.md} | 2 +- .../docs/examples/users/update-prefs.md | 13 + ...{get-user-sessions.md => update-status.md} | 2 +- .../docs/examples/users/update-user-prefs.md | 13 - .../docs/examples/users/update-user-status.md | 13 - .../ruby/lib/appwrite/services/database.rb | 20 +- app/sdks/ruby/lib/appwrite/services/locale.rb | 2 +- .../ruby/lib/appwrite/services/storage.rb | 16 +- app/sdks/ruby/lib/appwrite/services/teams.rb | 16 +- app/sdks/ruby/lib/appwrite/services/users.rb | 20 +- gulpfile.js | 3 +- package.json | 1 - public/dist/scripts/app-dep.js | 247 +- public/scripts/dependencies/appwrite.js | 3885 +++++++++++++++++ 240 files changed, 6299 insertions(+), 1430 deletions(-) create mode 100644 app/sdks/dart/LICENSE create mode 100644 app/sdks/dart/README.md create mode 100644 app/sdks/dart/lib/appwrite.dart create mode 100644 app/sdks/dart/lib/client.dart create mode 100644 app/sdks/dart/lib/service.dart create mode 100644 app/sdks/dart/lib/services/account.dart create mode 100644 app/sdks/dart/lib/services/avatars.dart create mode 100644 app/sdks/dart/lib/services/database.dart create mode 100644 app/sdks/dart/lib/services/locale.dart create mode 100644 app/sdks/dart/lib/services/storage.dart create mode 100644 app/sdks/dart/lib/services/teams.dart create mode 100644 app/sdks/dart/pubspec.yaml rename app/sdks/go/docs/examples/locale/{get-locale.md => get.md} (87%) rename app/sdks/go/docs/examples/storage/{get-file.md => create.md} (85%) rename app/sdks/go/docs/examples/storage/{delete-file.md => delete.md} (84%) rename app/sdks/go/docs/examples/storage/{create-file.md => get-download.md} (84%) delete mode 100644 app/sdks/go/docs/examples/storage/get-file-preview.md rename app/sdks/go/docs/examples/storage/{get-file-view.md => get-preview.md} (80%) rename app/sdks/go/docs/examples/storage/{get-file-download.md => get-view.md} (83%) create mode 100644 app/sdks/go/docs/examples/storage/get.md delete mode 100644 app/sdks/go/docs/examples/storage/list-files.md create mode 100644 app/sdks/go/docs/examples/storage/list.md delete mode 100644 app/sdks/go/docs/examples/storage/update-file.md create mode 100644 app/sdks/go/docs/examples/storage/update.md rename app/sdks/go/docs/examples/teams/{delete-team-membership.md => create-membership.md} (72%) delete mode 100644 app/sdks/go/docs/examples/teams/create-team-membership.md rename app/sdks/go/docs/examples/teams/{get-team.md => create.md} (84%) create mode 100644 app/sdks/go/docs/examples/teams/delete-membership.md rename app/sdks/go/docs/examples/teams/{delete-team.md => delete.md} (84%) rename app/sdks/go/docs/examples/teams/{get-team-memberships.md => get-memberships.md} (82%) rename app/sdks/go/docs/examples/teams/{create-team.md => get.md} (84%) delete mode 100644 app/sdks/go/docs/examples/teams/list-teams.md create mode 100644 app/sdks/go/docs/examples/teams/list.md delete mode 100644 app/sdks/go/docs/examples/teams/update-team.md create mode 100644 app/sdks/go/docs/examples/teams/update.md delete mode 100644 app/sdks/go/docs/examples/users/create-user.md rename app/sdks/go/docs/examples/users/{delete-user-session.md => create.md} (78%) rename app/sdks/go/docs/examples/users/{delete-user-sessions.md => delete-session.md} (80%) rename app/sdks/go/docs/examples/users/{get-user-sessions.md => delete-sessions.md} (83%) rename app/sdks/go/docs/examples/users/{get-user.md => get-logs.md} (84%) rename app/sdks/go/docs/examples/users/{get-user-logs.md => get-prefs.md} (84%) rename app/sdks/go/docs/examples/users/{get-user-prefs.md => get-sessions.md} (83%) create mode 100644 app/sdks/go/docs/examples/users/get.md delete mode 100644 app/sdks/go/docs/examples/users/list-users.md create mode 100644 app/sdks/go/docs/examples/users/list.md create mode 100644 app/sdks/go/docs/examples/users/update-prefs.md create mode 100644 app/sdks/go/docs/examples/users/update-status.md delete mode 100644 app/sdks/go/docs/examples/users/update-user-prefs.md delete mode 100644 app/sdks/go/docs/examples/users/update-user-status.md delete mode 100644 app/sdks/javascript/docs/examples/account/create-account-session-o-auth.md create mode 100644 app/sdks/javascript/docs/examples/account/create-o-auth-session.md create mode 100644 app/sdks/javascript/docs/examples/account/create-recovery.md rename app/sdks/javascript/docs/examples/account/{create-account.md => create-session.md} (70%) create mode 100644 app/sdks/javascript/docs/examples/account/create.md create mode 100644 app/sdks/javascript/docs/examples/account/delete-current-session.md create mode 100644 app/sdks/javascript/docs/examples/account/delete-session.md rename app/sdks/javascript/docs/examples/account/{get-account-logs.md => delete-sessions.md} (79%) rename app/sdks/javascript/docs/examples/{teams/list-teams.md => account/get-logs.md} (81%) rename app/sdks/javascript/docs/examples/{locale/get-locale.md => account/get-prefs.md} (81%) create mode 100644 app/sdks/javascript/docs/examples/account/get-sessions.md rename app/sdks/javascript/docs/examples/{storage/list-files.md => account/get.md} (80%) delete mode 100644 app/sdks/javascript/docs/examples/account/update-account-name.md delete mode 100644 app/sdks/javascript/docs/examples/account/update-account-password.md delete mode 100644 app/sdks/javascript/docs/examples/account/update-account-recovery.md delete mode 100644 app/sdks/javascript/docs/examples/account/update-account-verification.md rename app/sdks/javascript/docs/examples/account/{get-account-sessions.md => update-name.md} (77%) rename app/sdks/javascript/docs/examples/account/{delete-account-current-session.md => update-password.md} (71%) create mode 100644 app/sdks/javascript/docs/examples/account/update-recovery.md rename app/sdks/javascript/docs/examples/account/{create-account-session.md => update-verification.md} (63%) rename app/sdks/javascript/docs/examples/{account/get-account.md => locale/get.md} (80%) delete mode 100644 app/sdks/javascript/docs/examples/storage/create-file.md create mode 100644 app/sdks/javascript/docs/examples/storage/create.md delete mode 100644 app/sdks/javascript/docs/examples/storage/delete-file.md create mode 100644 app/sdks/javascript/docs/examples/storage/delete.md create mode 100644 app/sdks/javascript/docs/examples/storage/get-download.md delete mode 100644 app/sdks/javascript/docs/examples/storage/get-file-download.md delete mode 100644 app/sdks/javascript/docs/examples/storage/get-file-preview.md delete mode 100644 app/sdks/javascript/docs/examples/storage/get-file-view.md delete mode 100644 app/sdks/javascript/docs/examples/storage/get-file.md rename app/sdks/javascript/docs/examples/{account/delete-account-sessions.md => storage/get-preview.md} (76%) create mode 100644 app/sdks/javascript/docs/examples/storage/get-view.md create mode 100644 app/sdks/javascript/docs/examples/storage/get.md create mode 100644 app/sdks/javascript/docs/examples/storage/list.md delete mode 100644 app/sdks/javascript/docs/examples/storage/update-file.md create mode 100644 app/sdks/javascript/docs/examples/storage/update.md create mode 100644 app/sdks/javascript/docs/examples/teams/create-membership.md delete mode 100644 app/sdks/javascript/docs/examples/teams/create-team-membership.md delete mode 100644 app/sdks/javascript/docs/examples/teams/create-team.md create mode 100644 app/sdks/javascript/docs/examples/teams/create.md rename app/sdks/javascript/docs/examples/{account/delete-account-session.md => teams/delete-membership.md} (70%) delete mode 100644 app/sdks/javascript/docs/examples/teams/delete-team-membership.md delete mode 100644 app/sdks/javascript/docs/examples/teams/delete-team.md rename app/sdks/javascript/docs/examples/{account/get-account-prefs.md => teams/delete.md} (78%) create mode 100644 app/sdks/javascript/docs/examples/teams/get-memberships.md delete mode 100644 app/sdks/javascript/docs/examples/teams/get-team-memberships.md delete mode 100644 app/sdks/javascript/docs/examples/teams/get-team.md create mode 100644 app/sdks/javascript/docs/examples/teams/get.md create mode 100644 app/sdks/javascript/docs/examples/teams/list.md rename app/sdks/javascript/docs/examples/{account/create-account-recovery.md => teams/update-membership-status.md} (59%) delete mode 100644 app/sdks/javascript/docs/examples/teams/update-team-membership-status.md delete mode 100644 app/sdks/javascript/docs/examples/teams/update-team.md create mode 100644 app/sdks/javascript/docs/examples/teams/update.md rename app/sdks/nodejs/docs/examples/locale/{get-locale.md => get.md} (89%) delete mode 100644 app/sdks/nodejs/docs/examples/storage/create-file.md rename app/sdks/nodejs/docs/examples/storage/{get-file-download.md => create.md} (76%) rename app/sdks/nodejs/docs/examples/storage/{get-file.md => delete.md} (86%) rename app/sdks/nodejs/docs/examples/storage/{get-file-view.md => get-download.md} (85%) rename app/sdks/nodejs/docs/examples/storage/{delete-file.md => get-preview.md} (85%) create mode 100644 app/sdks/nodejs/docs/examples/storage/get-view.md create mode 100644 app/sdks/nodejs/docs/examples/storage/get.md rename app/sdks/nodejs/docs/examples/storage/{list-files.md => list.md} (88%) delete mode 100644 app/sdks/nodejs/docs/examples/storage/update-file.md rename app/sdks/nodejs/docs/examples/storage/{get-file-preview.md => update.md} (84%) rename app/sdks/nodejs/docs/examples/teams/{delete-team-membership.md => create-membership.md} (73%) delete mode 100644 app/sdks/nodejs/docs/examples/teams/create-team-membership.md rename app/sdks/nodejs/docs/examples/teams/{get-team.md => create.md} (86%) rename app/sdks/nodejs/docs/examples/teams/{get-team-memberships.md => delete-membership.md} (80%) rename app/sdks/nodejs/docs/examples/teams/{create-team.md => delete.md} (86%) create mode 100644 app/sdks/nodejs/docs/examples/teams/get-memberships.md rename app/sdks/nodejs/docs/examples/teams/{delete-team.md => get.md} (86%) rename app/sdks/nodejs/docs/examples/teams/{list-teams.md => list.md} (89%) delete mode 100644 app/sdks/nodejs/docs/examples/teams/update-team.md create mode 100644 app/sdks/nodejs/docs/examples/teams/update.md delete mode 100644 app/sdks/nodejs/docs/examples/users/create-user.md rename app/sdks/nodejs/docs/examples/users/{delete-user-sessions.md => create.md} (81%) create mode 100644 app/sdks/nodejs/docs/examples/users/delete-session.md create mode 100644 app/sdks/nodejs/docs/examples/users/delete-sessions.md delete mode 100644 app/sdks/nodejs/docs/examples/users/delete-user-session.md rename app/sdks/nodejs/docs/examples/users/{get-user.md => get-logs.md} (86%) rename app/sdks/nodejs/docs/examples/users/{get-user-logs.md => get-prefs.md} (85%) rename app/sdks/nodejs/docs/examples/users/{get-user-prefs.md => get-sessions.md} (85%) create mode 100644 app/sdks/nodejs/docs/examples/users/get.md rename app/sdks/nodejs/docs/examples/users/{list-users.md => list.md} (89%) rename app/sdks/nodejs/docs/examples/users/{get-user-sessions.md => update-prefs.md} (84%) create mode 100644 app/sdks/nodejs/docs/examples/users/update-status.md delete mode 100644 app/sdks/nodejs/docs/examples/users/update-user-prefs.md delete mode 100644 app/sdks/nodejs/docs/examples/users/update-user-status.md rename app/sdks/php/docs/examples/locale/{get-locale.md => get.md} (84%) delete mode 100644 app/sdks/php/docs/examples/storage/create-file.md rename app/sdks/php/docs/examples/storage/{get-file-download.md => create.md} (63%) rename app/sdks/php/docs/examples/storage/{get-file.md => delete.md} (80%) rename app/sdks/php/docs/examples/storage/{get-file-view.md => get-download.md} (78%) rename app/sdks/php/docs/examples/storage/{delete-file.md => get-preview.md} (79%) create mode 100644 app/sdks/php/docs/examples/storage/get-view.md create mode 100644 app/sdks/php/docs/examples/storage/get.md rename app/sdks/php/docs/examples/storage/{list-files.md => list.md} (84%) delete mode 100644 app/sdks/php/docs/examples/storage/update-file.md rename app/sdks/php/docs/examples/storage/{get-file-preview.md => update.md} (77%) rename app/sdks/php/docs/examples/teams/{delete-team-membership.md => create-membership.md} (62%) delete mode 100644 app/sdks/php/docs/examples/teams/create-team-membership.md rename app/sdks/php/docs/examples/teams/{get-team.md => create.md} (80%) rename app/sdks/php/docs/examples/teams/{get-team-memberships.md => delete-membership.md} (72%) rename app/sdks/php/docs/examples/teams/{create-team.md => delete.md} (80%) create mode 100644 app/sdks/php/docs/examples/teams/get-memberships.md rename app/sdks/php/docs/examples/teams/{delete-team.md => get.md} (79%) rename app/sdks/php/docs/examples/teams/{list-teams.md => list.md} (84%) delete mode 100644 app/sdks/php/docs/examples/teams/update-team.md create mode 100644 app/sdks/php/docs/examples/teams/update.md delete mode 100644 app/sdks/php/docs/examples/users/create-user.md rename app/sdks/php/docs/examples/users/{delete-user-sessions.md => create.md} (73%) create mode 100644 app/sdks/php/docs/examples/users/delete-session.md create mode 100644 app/sdks/php/docs/examples/users/delete-sessions.md delete mode 100644 app/sdks/php/docs/examples/users/delete-user-session.md rename app/sdks/php/docs/examples/users/{get-user.md => get-logs.md} (80%) rename app/sdks/php/docs/examples/users/{get-user-logs.md => get-prefs.md} (79%) rename app/sdks/php/docs/examples/users/{get-user-prefs.md => get-sessions.md} (78%) create mode 100644 app/sdks/php/docs/examples/users/get.md rename app/sdks/php/docs/examples/users/{list-users.md => list.md} (84%) rename app/sdks/php/docs/examples/users/{get-user-sessions.md => update-prefs.md} (77%) create mode 100644 app/sdks/php/docs/examples/users/update-status.md delete mode 100644 app/sdks/php/docs/examples/users/update-user-prefs.md delete mode 100644 app/sdks/php/docs/examples/users/update-user-status.md rename app/sdks/python/docs/examples/locale/{get-locale.md => get.md} (85%) delete mode 100644 app/sdks/python/docs/examples/storage/create-file.md rename app/sdks/python/docs/examples/storage/{get-file-download.md => create.md} (68%) rename app/sdks/python/docs/examples/storage/{get-file.md => delete.md} (81%) rename app/sdks/python/docs/examples/storage/{get-file-view.md => get-download.md} (79%) delete mode 100644 app/sdks/python/docs/examples/storage/get-file-preview.md rename app/sdks/python/docs/examples/storage/{delete-file.md => get-preview.md} (80%) create mode 100644 app/sdks/python/docs/examples/storage/get-view.md create mode 100644 app/sdks/python/docs/examples/storage/get.md rename app/sdks/python/docs/examples/storage/{list-files.md => list.md} (85%) delete mode 100644 app/sdks/python/docs/examples/storage/update-file.md create mode 100644 app/sdks/python/docs/examples/storage/update.md rename app/sdks/python/docs/examples/teams/{delete-team-membership.md => create-membership.md} (63%) delete mode 100644 app/sdks/python/docs/examples/teams/create-team-membership.md rename app/sdks/python/docs/examples/teams/{create-team.md => create.md} (81%) rename app/sdks/python/docs/examples/teams/{get-team-memberships.md => delete-membership.md} (73%) rename app/sdks/python/docs/examples/teams/{get-team.md => delete.md} (81%) create mode 100644 app/sdks/python/docs/examples/teams/get-memberships.md rename app/sdks/python/docs/examples/teams/{delete-team.md => get.md} (80%) rename app/sdks/python/docs/examples/teams/{list-teams.md => list.md} (85%) delete mode 100644 app/sdks/python/docs/examples/teams/update-team.md create mode 100644 app/sdks/python/docs/examples/teams/update.md delete mode 100644 app/sdks/python/docs/examples/users/create-user.md rename app/sdks/python/docs/examples/users/{delete-user-sessions.md => create.md} (75%) create mode 100644 app/sdks/python/docs/examples/users/delete-session.md create mode 100644 app/sdks/python/docs/examples/users/delete-sessions.md delete mode 100644 app/sdks/python/docs/examples/users/delete-user-session.md rename app/sdks/python/docs/examples/users/{get-user.md => get-logs.md} (81%) rename app/sdks/python/docs/examples/users/{get-user-logs.md => get-prefs.md} (79%) rename app/sdks/python/docs/examples/users/{get-user-prefs.md => get-sessions.md} (79%) create mode 100644 app/sdks/python/docs/examples/users/get.md rename app/sdks/python/docs/examples/users/{list-users.md => list.md} (85%) create mode 100644 app/sdks/python/docs/examples/users/update-prefs.md rename app/sdks/python/docs/examples/users/{get-user-sessions.md => update-status.md} (77%) delete mode 100644 app/sdks/python/docs/examples/users/update-user-prefs.md delete mode 100644 app/sdks/python/docs/examples/users/update-user-status.md create mode 100644 public/scripts/dependencies/appwrite.js diff --git a/app/sdks/dart/LICENSE b/app/sdks/dart/LICENSE new file mode 100644 index 0000000000..fc7c051a91 --- /dev/null +++ b/app/sdks/dart/LICENSE @@ -0,0 +1,12 @@ +Copyright (c) 2019 Appwrite (https://appwrite.io) and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name Appwrite nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/sdks/dart/README.md b/app/sdks/dart/README.md new file mode 100644 index 0000000000..5988469846 --- /dev/null +++ b/app/sdks/dart/README.md @@ -0,0 +1,29 @@ +# Appwrite SDK for Dart + +![License](https://img.shields.io/github/license/appwrite/sdk-for-dart.svg?v=1) +![Version](https://img.shields.io/badge/api%20version-0.4.0-blue.svg?v=1) + +Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) + + + +![Appwrite](https://appwrite.io/images/github.png) + +## Installation + +Add this to your package's pubspec.yaml file: + +```yml +dependencies: + appwrite: ^0.0.6 +``` + +You can install packages from the command line: + +```bash +pub get +``` + +## License + +Please see the [BSD-3-Clause license](https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE) file for more information. \ No newline at end of file diff --git a/app/sdks/dart/lib/appwrite.dart b/app/sdks/dart/lib/appwrite.dart new file mode 100644 index 0000000000..905f90058b --- /dev/null +++ b/app/sdks/dart/lib/appwrite.dart @@ -0,0 +1,8 @@ +export 'package:appwrite/services/account.dart'; +export 'package:appwrite/services/avatars.dart'; +export 'package:appwrite/services/database.dart'; +export 'package:appwrite/services/locale.dart'; +export 'package:appwrite/services/storage.dart'; +export 'package:appwrite/services/teams.dart'; +export 'package:appwrite/client.dart'; +export 'package:dio/dio.dart' show Response; \ No newline at end of file diff --git a/app/sdks/dart/lib/client.dart b/app/sdks/dart/lib/client.dart new file mode 100644 index 0000000000..05a5370651 --- /dev/null +++ b/app/sdks/dart/lib/client.dart @@ -0,0 +1,100 @@ +import 'package:dio/dio.dart'; +import 'package:dio_cookie_manager/dio_cookie_manager.dart'; +import 'package:cookie_jar/cookie_jar.dart'; + +class Client { + String endPoint; + Map headers; + bool selfSigned; + Dio http; + + Client() { + this.endPoint = 'https://appwrite.io/v1'; + this.headers = { + 'content-type': 'application/json', + 'x-sdk-version': 'appwrite:dart:0.0.6', + }; + this.selfSigned = false; + + this.http = Dio(); + this.http.options.baseUrl = this.endPoint; + this.http.options.validateStatus = (status) => status != 404; + this.http.interceptors.add(CookieManager(CookieJar())); + } + + + /// Your Appwrite project ID + Client setProject(value) { + this.addHeader('X-Appwrite-Project', value); + + return this; + } + + + /// Your Appwrite project secret key + Client setKey(value) { + this.addHeader('X-Appwrite-Key', value); + + return this; + } + + + Client setLocale(value) { + this.addHeader('X-Appwrite-Locale', value); + + return this; + } + + + Client setMode(value) { + this.addHeader('X-Appwrite-Mode', value); + + return this; + } + + Client setSelfSigned({bool status = true}) { + this.selfSigned = status; + + return this; + } + + Client setEndpoint(String endPoint) + { + this.endPoint = endPoint; + this.http.options.baseUrl = this.endPoint; + return this; + } + + Client addHeader(String key, String value) { + this.headers[key.toLowerCase()] = value.toLowerCase(); + + return this; + } + + Future call(String method, {String path = '', Map headers = const {}, Map params = const {}}) { + if(this.selfSigned) { + // Allow self signed requests + } + + String reqPath = path; + bool isGet = method.toUpperCase() == "GET"; + + // Origin is hardcoded for testing + Options options = Options( + headers: {...this.headers, ...headers, "Origin": "http://localhost"}, + method: method.toUpperCase(), + ); + + if (isGet) { + path += "?"; + params.forEach((k, v) { + path += "${k}=${v}&"; + }); + } + + if (!isGet) + return http.request(reqPath, data: params, options: options); + else + return http.request(reqPath, options: options); + } +} \ No newline at end of file diff --git a/app/sdks/dart/lib/service.dart b/app/sdks/dart/lib/service.dart new file mode 100644 index 0000000000..81107c7803 --- /dev/null +++ b/app/sdks/dart/lib/service.dart @@ -0,0 +1,9 @@ +import 'package:appwrite/client.dart'; + +class Service { + Client client; + + Service(Client client) { + this.client = client; + } +} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/account.dart b/app/sdks/dart/lib/services/account.dart new file mode 100644 index 0000000000..d0230c628d --- /dev/null +++ b/app/sdks/dart/lib/services/account.dart @@ -0,0 +1,259 @@ +import "package:appwrite/service.dart"; +import "package:appwrite/client.dart"; +import 'package:dio/dio.dart'; + +class Account extends Service { + + Account(Client client): super(client); + + /// Get currently logged in user data as JSON object. + Future get() async { + String path = '/account'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Use this endpoint to allow a new user to register an account in your + /// project. Use the success and failure URLs to redirect users back to your + /// application after signup completes. + /// + /// If registration completes successfully user will be sent with a + /// confirmation email in order to confirm he is the owner of the account email + /// address. Use the confirmation parameter to redirect the user from the + /// confirmation email back to your app. When the user is redirected, use the + /// /auth/confirm endpoint to complete the account confirmation. + /// + /// Please note that in order to avoid a [Redirect + /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + /// the only valid redirect URLs are the ones from domains you have set when + /// adding your platforms in the console interface. + /// + /// When accessing this route using Javascript from the browser, success and + /// failure parameter URLs are required. Appwrite server will respond with a + /// 301 redirect status code and will set the user session cookie. This + /// behavior is enforced because modern browsers are limiting 3rd party cookies + /// in XHR of fetch requests to protect user privacy. + Future create({email, password, name = null}) async { + String path = '/account'; + + Map params = { + 'email': email, + 'password': password, + 'name': name, + }; + + return await this.client.call('post', path: path, params: params); + } + /// Delete a currently logged in user account. Behind the scene, the user + /// record is not deleted but permanently blocked from any access. This is done + /// to avoid deleted accounts being overtaken by new users with the same email + /// address. Any user-related resources like documents or storage files should + /// be deleted separately. + Future delete() async { + String path = '/account'; + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } + /// Update currently logged in user account email address. After changing user + /// address, user confirmation status is being reset and a new confirmation + /// mail is sent. For security measures, user password is required to complete + /// this request. + Future updateEmail({email, password}) async { + String path = '/account/email'; + + Map params = { + 'email': email, + 'password': password, + }; + + return await this.client.call('patch', path: path, params: params); + } + /// Get currently logged in user list of latest security activity logs. Each + /// log returns user IP address, location and date and time of log. + Future getLogs() async { + String path = '/account/logs'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Update currently logged in user account name. + Future updateName({name}) async { + String path = '/account/name'; + + Map params = { + 'name': name, + }; + + return await this.client.call('patch', path: path, params: params); + } + /// Update currently logged in user password. For validation, user is required + /// to pass the password twice. + Future updatePassword({password, oldPassword}) async { + String path = '/account/password'; + + Map params = { + 'password': password, + 'old-password': oldPassword, + }; + + return await this.client.call('patch', path: path, params: params); + } + /// Get currently logged in user preferences key-value object. + Future getPrefs() async { + String path = '/account/prefs'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Update currently logged in user account preferences. You can pass only the + /// specific settings you wish to update. + Future updatePrefs({prefs}) async { + String path = '/account/prefs'; + + Map params = { + 'prefs': prefs, + }; + + return await this.client.call('patch', path: path, params: params); + } + /// Sends the user an email with a temporary secret key for password reset. + /// When the user clicks the confirmation link he is redirected back to your + /// app password reset URL with the secret key and email address values + /// attached to the URL query string. Use the query string params to submit a + /// request to the /auth/password/reset endpoint to complete the process. + Future createRecovery({email, url}) async { + String path = '/account/recovery'; + + Map params = { + 'email': email, + 'url': url, + }; + + return await this.client.call('post', path: path, params: params); + } + /// Use this endpoint to complete the user account password reset. Both the + /// **userId** and **secret** arguments will be passed as query parameters to + /// the redirect URL you have provided when sending your request to the + /// /auth/recovery endpoint. + /// + /// Please note that in order to avoid a [Redirect + /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + /// the only valid redirect URLs are the ones from domains you have set when + /// adding your platforms in the console interface. + Future updateRecovery({userId, secret, passwordA, passwordB}) async { + String path = '/account/recovery'; + + Map params = { + 'userId': userId, + 'secret': secret, + 'password-a': passwordA, + 'password-b': passwordB, + }; + + return await this.client.call('put', path: path, params: params); + } + /// Get currently logged in user list of active sessions across different + /// devices. + Future getSessions() async { + String path = '/account/sessions'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Allow the user to login into his account by providing a valid email and + /// password combination. Use the success and failure arguments to provide a + /// redirect URL's back to your app when login is completed. + /// + /// Please note that in order to avoid a [Redirect + /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + /// the only valid redirect URLs are the ones from domains you have set when + /// adding your platforms in the console interface. + /// + /// When accessing this route using Javascript from the browser, success and + /// failure parameter URLs are required. Appwrite server will respond with a + /// 301 redirect status code and will set the user session cookie. This + /// behavior is enforced because modern browsers are limiting 3rd party cookies + /// in XHR of fetch requests to protect user privacy. + Future createSession({email, password}) async { + String path = '/account/sessions'; + + Map params = { + 'email': email, + 'password': password, + }; + + return await this.client.call('post', path: path, params: params); + } + /// Delete all sessions from the user account and remove any sessions cookies + /// from the end client. + Future deleteSessions() async { + String path = '/account/sessions'; + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } + /// Use this endpoint to log out the currently logged in user from his account. + /// When successful this endpoint will delete the user session and remove the + /// session secret cookie from the user client. + Future deleteCurrentSession() async { + String path = '/account/sessions/current'; + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } + /// Allow the user to login to his account using the OAuth provider of his + /// choice. Each OAuth provider should be enabled from the Appwrite console + /// first. Use the success and failure arguments to provide a redirect URL's + /// back to your app when login is completed. + Future createOAuthSession({provider, success, failure}) async { + String path = '/account/sessions/oauth/{provider}'.replaceAll(RegExp('{provider}'), provider); + + Map params = { + 'success': success, + 'failure': failure, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Use this endpoint to log out the currently logged in user from all his + /// account sessions across all his different devices. When using the option id + /// argument, only the session unique ID provider will be deleted. + Future deleteSession({id}) async { + String path = '/account/sessions/{id}'.replaceAll(RegExp('{id}'), id); + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } + /// Use this endpoint to complete the user email verification process. Use both + /// the **userId** and **secret** parameters that were attached to your app URL + /// to verify the user email ownership. If confirmed this route will return a + /// 200 status code. + Future updateVerification({userId, secret, passwordB}) async { + String path = '/account/verification'; + + Map params = { + 'userId': userId, + 'secret': secret, + 'password-b': passwordB, + }; + + return await this.client.call('put', path: path, params: params); + } +} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/avatars.dart b/app/sdks/dart/lib/services/avatars.dart new file mode 100644 index 0000000000..4ffcc6aa15 --- /dev/null +++ b/app/sdks/dart/lib/services/avatars.dart @@ -0,0 +1,93 @@ +import "package:appwrite/service.dart"; +import "package:appwrite/client.dart"; +import 'package:dio/dio.dart'; + +class Avatars extends Service { + + Avatars(Client client): super(client); + + /// You can use this endpoint to show different browser icons to your users. + /// The code argument receives the browser code as it appears in your user + /// /account/sessions endpoint. Use width, height and quality arguments to + /// change the output settings. + Future getBrowser({code, width = 100, height = 100, quality = 100}) async { + String path = '/avatars/browsers/{code}'.replaceAll(RegExp('{code}'), code); + + Map params = { + 'width': width, + 'height': height, + 'quality': quality, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Need to display your users with your billing method or their payment + /// methods? The credit card endpoint will return you the icon of the credit + /// card provider you need. Use width, height and quality arguments to change + /// the output settings. + Future getCreditCard({code, width = 100, height = 100, quality = 100}) async { + String path = '/avatars/credit-cards/{code}'.replaceAll(RegExp('{code}'), code); + + Map params = { + 'width': width, + 'height': height, + 'quality': quality, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote + /// website URL. + Future getFavicon({url}) async { + String path = '/avatars/favicon'; + + Map params = { + 'url': url, + }; + + return await this.client.call('get', path: path, params: params); + } + /// You can use this endpoint to show different country flags icons to your + /// users. The code argument receives the 2 letter country code. Use width, + /// height and quality arguments to change the output settings. + Future getFlag({code, width = 100, height = 100, quality = 100}) async { + String path = '/avatars/flags/{code}'.replaceAll(RegExp('{code}'), code); + + Map params = { + 'width': width, + 'height': height, + 'quality': quality, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Use this endpoint to fetch a remote image URL and crop it to any image size + /// you want. This endpoint is very useful if you need to crop and display + /// remote images in your app or in case you want to make sure a 3rd party + /// image is properly served using a TLS protocol. + Future getImage({url, width = 400, height = 400}) async { + String path = '/avatars/image'; + + Map params = { + 'url': url, + 'width': width, + 'height': height, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Converts a given plain text to a QR code image. You can use the query + /// parameters to change the size and style of the resulting image. + Future getQR({text, size = 400, margin = 1, download = null}) async { + String path = '/avatars/qr'; + + Map params = { + 'text': text, + 'size': size, + 'margin': margin, + 'download': download, + }; + + return await this.client.call('get', path: path, params: params); + } +} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/database.dart b/app/sdks/dart/lib/services/database.dart new file mode 100644 index 0000000000..fe475e2afc --- /dev/null +++ b/app/sdks/dart/lib/services/database.dart @@ -0,0 +1,139 @@ +import "package:appwrite/service.dart"; +import "package:appwrite/client.dart"; +import 'package:dio/dio.dart'; + +class Database extends Service { + + Database(Client client): super(client); + + /// Get a list of all the user collections. You can use the query params to + /// filter your results. On admin mode, this endpoint will return a list of all + /// of the project collections. [Learn more about different API + /// modes](/docs/admin). + Future listCollections({search = null, limit = 25, offset = null, orderType = 'ASC'}) async { + String path = '/database/collections'; + + Map params = { + 'search': search, + 'limit': limit, + 'offset': offset, + 'orderType': orderType, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Create a new Collection. + Future createCollection({name, read, write, rules}) async { + String path = '/database/collections'; + + Map params = { + 'name': name, + 'read': read, + 'write': write, + 'rules': rules, + }; + + return await this.client.call('post', path: path, params: params); + } + /// Get collection by its unique ID. This endpoint response returns a JSON + /// object with the collection metadata. + Future getCollection({collectionId}) async { + String path = '/database/collections/{collectionId}'.replaceAll(RegExp('{collectionId}'), collectionId); + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Update collection by its unique ID. + Future updateCollection({collectionId, name, read, write, rules = const []}) async { + String path = '/database/collections/{collectionId}'.replaceAll(RegExp('{collectionId}'), collectionId); + + Map params = { + 'name': name, + 'read': read, + 'write': write, + 'rules': rules, + }; + + return await this.client.call('put', path: path, params: params); + } + /// Delete a collection by its unique ID. Only users with write permissions + /// have access to delete this resource. + Future deleteCollection({collectionId}) async { + String path = '/database/collections/{collectionId}'.replaceAll(RegExp('{collectionId}'), collectionId); + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } + /// Get a list of all the user documents. You can use the query params to + /// filter your results. On admin mode, this endpoint will return a list of all + /// of the project documents. [Learn more about different API + /// modes](/docs/admin). + Future listDocuments({collectionId, filters = const [], offset = null, limit = 50, orderField = '\$uid', orderType = 'ASC', orderCast = 'string', search = null, first = null, last = null}) async { + String path = '/database/collections/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId); + + Map params = { + 'filters': filters, + 'offset': offset, + 'limit': limit, + 'order-field': orderField, + 'order-type': orderType, + 'order-cast': orderCast, + 'search': search, + 'first': first, + 'last': last, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Create a new Document. + Future createDocument({collectionId, data, read, write, parentDocument = null, parentProperty = null, parentPropertyType = 'assign'}) async { + String path = '/database/collections/{collectionId}/documents'.replaceAll(RegExp('{collectionId}'), collectionId); + + Map params = { + 'data': data, + 'read': read, + 'write': write, + 'parentDocument': parentDocument, + 'parentProperty': parentProperty, + 'parentPropertyType': parentPropertyType, + }; + + return await this.client.call('post', path: path, params: params); + } + /// Get document by its unique ID. This endpoint response returns a JSON object + /// with the document data. + Future getDocument({collectionId, documentId}) async { + String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + Future updateDocument({collectionId, documentId, data, read, write}) async { + String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); + + Map params = { + 'data': data, + 'read': read, + 'write': write, + }; + + return await this.client.call('patch', path: path, params: params); + } + /// Delete document by its unique ID. This endpoint deletes only the parent + /// documents, his attributes and relations to other documents. Child documents + /// **will not** be deleted. + Future deleteDocument({collectionId, documentId}) async { + String path = '/database/collections/{collectionId}/documents/{documentId}'.replaceAll(RegExp('{collectionId}'), collectionId).replaceAll(RegExp('{documentId}'), documentId); + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } +} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/locale.dart b/app/sdks/dart/lib/services/locale.dart new file mode 100644 index 0000000000..208c72bd08 --- /dev/null +++ b/app/sdks/dart/lib/services/locale.dart @@ -0,0 +1,74 @@ +import "package:appwrite/service.dart"; +import "package:appwrite/client.dart"; +import 'package:dio/dio.dart'; + +class Locale extends Service { + + Locale(Client client): super(client); + + /// Get the current user location based on IP. Returns an object with user + /// country code, country name, continent name, continent code, ip address and + /// suggested currency. You can use the locale header to get the data in a + /// supported language. + /// + /// ([IP Geolocation by DB-IP](https://db-ip.com)) + Future get() async { + String path = '/locale'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// List of all continents. You can use the locale header to get the data in a + /// supported language. + Future getContinents() async { + String path = '/locale/continents'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// List of all countries. You can use the locale header to get the data in a + /// supported language. + Future getCountries() async { + String path = '/locale/countries'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// List of all countries that are currently members of the EU. You can use the + /// locale header to get the data in a supported language. + Future getCountriesEU() async { + String path = '/locale/countries/eu'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// List of all countries phone codes. You can use the locale header to get the + /// data in a supported language. + Future getCountriesPhones() async { + String path = '/locale/countries/phones'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// List of all currencies, including currency symol, name, plural, and decimal + /// digits for all major and minor currencies. You can use the locale header to + /// get the data in a supported language. + Future getCurrencies() async { + String path = '/locale/currencies'; + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } +} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/storage.dart b/app/sdks/dart/lib/services/storage.dart new file mode 100644 index 0000000000..8e333f689d --- /dev/null +++ b/app/sdks/dart/lib/services/storage.dart @@ -0,0 +1,109 @@ +import "package:appwrite/service.dart"; +import "package:appwrite/client.dart"; +import 'package:dio/dio.dart'; + +class Storage extends Service { + + Storage(Client client): super(client); + + /// Get a list of all the user files. You can use the query params to filter + /// your results. On admin mode, this endpoint will return a list of all of the + /// project files. [Learn more about different API modes](/docs/admin). + Future list({search = null, limit = 25, offset = null, orderType = 'ASC'}) async { + String path = '/storage/files'; + + Map params = { + 'search': search, + 'limit': limit, + 'offset': offset, + 'orderType': orderType, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Create a new file. The user who creates the file will automatically be + /// assigned to read and write access unless he has passed custom values for + /// read and write arguments. + Future create({file, read, write}) async { + String path = '/storage/files'; + + Map params = { + 'file': file, + 'read': read, + 'write': write, + }; + + return await this.client.call('post', path: path, params: params); + } + /// Get file by its unique ID. This endpoint response returns a JSON object + /// with the file metadata. + Future get({fileId}) async { + String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Update file by its unique ID. Only users with write permissions have access + /// to update this resource. + Future update({fileId, read, write}) async { + String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); + + Map params = { + 'read': read, + 'write': write, + }; + + return await this.client.call('put', path: path, params: params); + } + /// Delete a file by its unique ID. Only users with write permissions have + /// access to delete this resource. + Future delete({fileId}) async { + String path = '/storage/files/{fileId}'.replaceAll(RegExp('{fileId}'), fileId); + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } + /// Get file content by its unique ID. The endpoint response return with a + /// 'Content-Disposition: attachment' header that tells the browser to start + /// downloading the file to user downloads directory. + Future getDownload({fileId}) async { + String path = '/storage/files/{fileId}/download'.replaceAll(RegExp('{fileId}'), fileId); + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Get a file preview image. Currently, this method supports preview for image + /// files (jpg, png, and gif), other supported formats, like pdf, docs, slides, + /// and spreadsheets, will return the file icon image. You can also pass query + /// string arguments for cutting and resizing your preview image. + Future getPreview({fileId, width = null, height = null, quality = 100, background = null, output = null}) async { + String path = '/storage/files/{fileId}/preview'.replaceAll(RegExp('{fileId}'), fileId); + + Map params = { + 'width': width, + 'height': height, + 'quality': quality, + 'background': background, + 'output': output, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Get file content by its unique ID. This endpoint is similar to the download + /// method but returns with no 'Content-Disposition: attachment' header. + Future getView({fileId, as = null}) async { + String path = '/storage/files/{fileId}/view'.replaceAll(RegExp('{fileId}'), fileId); + + Map params = { + 'as': as, + }; + + return await this.client.call('get', path: path, params: params); + } +} \ No newline at end of file diff --git a/app/sdks/dart/lib/services/teams.dart b/app/sdks/dart/lib/services/teams.dart new file mode 100644 index 0000000000..486b43a027 --- /dev/null +++ b/app/sdks/dart/lib/services/teams.dart @@ -0,0 +1,140 @@ +import "package:appwrite/service.dart"; +import "package:appwrite/client.dart"; +import 'package:dio/dio.dart'; + +class Teams extends Service { + + Teams(Client client): super(client); + + /// Get a list of all the current user teams. You can use the query params to + /// filter your results. On admin mode, this endpoint will return a list of all + /// of the project teams. [Learn more about different API modes](/docs/admin). + Future list({search = null, limit = 25, offset = null, orderType = 'ASC'}) async { + String path = '/teams'; + + Map params = { + 'search': search, + 'limit': limit, + 'offset': offset, + 'orderType': orderType, + }; + + return await this.client.call('get', path: path, params: params); + } + /// Create a new team. The user who creates the team will automatically be + /// assigned as the owner of the team. The team owner can invite new members, + /// who will be able add new owners and update or delete the team from your + /// project. + Future create({name, roles = const ["owner"]}) async { + String path = '/teams'; + + Map params = { + 'name': name, + 'roles': roles, + }; + + return await this.client.call('post', path: path, params: params); + } + /// Get team by its unique ID. All team members have read access for this + /// resource. + Future get({teamId}) async { + String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Update team by its unique ID. Only team owners have write access for this + /// resource. + Future update({teamId, name}) async { + String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); + + Map params = { + 'name': name, + }; + + return await this.client.call('put', path: path, params: params); + } + /// Delete team by its unique ID. Only team owners have write access for this + /// resource. + Future delete({teamId}) async { + String path = '/teams/{teamId}'.replaceAll(RegExp('{teamId}'), teamId); + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } + /// Get team members by the team unique ID. All team members have read access + /// for this list of resources. + Future getMemberships({teamId}) async { + String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId); + + Map params = { + }; + + return await this.client.call('get', path: path, params: params); + } + /// Use this endpoint to invite a new member to your team. An email with a link + /// to join the team will be sent to the new member email address. If member + /// doesn't exists in the project it will be automatically created. + /// + /// Use the 'url' parameter to redirect the user from the invitation email back + /// to your app. When the user is redirected, use the [Update Team Membership + /// Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join + /// the user to the team. + /// + /// Please note that in order to avoid a [Redirect + /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + /// the only valid redirect URL's are the once from domains you have set when + /// added your platforms in the console interface. + Future createMembership({teamId, email, roles, url, name = null}) async { + String path = '/teams/{teamId}/memberships'.replaceAll(RegExp('{teamId}'), teamId); + + Map params = { + 'email': email, + 'name': name, + 'roles': roles, + 'url': url, + }; + + return await this.client.call('post', path: path, params: params); + } + /// This endpoint allows a user to leave a team or for a team owner to delete + /// the membership of any other team member. You can also use this endpoint to + /// delete a user membership even if he didn't accept it. + Future deleteMembership({teamId, inviteId}) async { + String path = '/teams/{teamId}/memberships/{inviteId}'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId); + + Map params = { + }; + + return await this.client.call('delete', path: path, params: params); + } + /// Use this endpoint to let user accept an invitation to join a team after he + /// is being redirect back to your app from the invitation email. Use the + /// success and failure URL's to redirect users back to your application after + /// the request completes. + /// + /// Please note that in order to avoid a [Redirect + /// Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + /// the only valid redirect URL's are the once from domains you have set when + /// added your platforms in the console interface. + /// + /// When not using the success or failure redirect arguments this endpoint will + /// result with a 200 status code on success and with 401 status error on + /// failure. This behavior was applied to help the web clients deal with + /// browsers who don't allow to set 3rd party HTTP cookies needed for saving + /// the account session key. + Future updateMembershipStatus({teamId, inviteId, userId, secret}) async { + String path = '/teams/{teamId}/memberships/{inviteId}/status'.replaceAll(RegExp('{teamId}'), teamId).replaceAll(RegExp('{inviteId}'), inviteId); + + Map params = { + 'userId': userId, + 'secret': secret, + }; + + return await this.client.call('patch', path: path, params: params); + } +} \ No newline at end of file diff --git a/app/sdks/dart/pubspec.yaml b/app/sdks/dart/pubspec.yaml new file mode 100644 index 0000000000..95225dfda5 --- /dev/null +++ b/app/sdks/dart/pubspec.yaml @@ -0,0 +1,11 @@ +name: appwrite +version: 0.0.6 +description: Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) +author: Appwrite Team +homepage: https://github.com/appwrite/sdk-for-dart +environment: + sdk: '>=2.2.2 <3.0.0' +dependencies: + dio: ^3.0.0 + cookie_jar: ^1.0.0 + dio_cookie_manager: ^1.0.0 \ No newline at end of file diff --git a/app/sdks/go/database.go b/app/sdks/go/database.go index e67aa130d9..9a26c19374 100644 --- a/app/sdks/go/database.go +++ b/app/sdks/go/database.go @@ -22,7 +22,7 @@ func NewDatabase(clt Client) Database { // return a list of all of the project collections. [Learn more about // different API modes](/docs/admin). func (srv *Database) ListCollections(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { - path := "/database" + path := "/database/collections" params := map[string]interface{}{ "search": Search, @@ -36,7 +36,7 @@ func (srv *Database) ListCollections(Search string, Limit int, Offset int, Order // CreateCollection create a new Collection. func (srv *Database) CreateCollection(Name string, Read []interface{}, Write []interface{}, Rules []interface{}) (map[string]interface{}, error) { - path := "/database" + path := "/database/collections" params := map[string]interface{}{ "name": Name, @@ -52,7 +52,7 @@ func (srv *Database) CreateCollection(Name string, Read []interface{}, Write []i // returns a JSON object with the collection metadata. func (srv *Database) GetCollection(CollectionId string) (map[string]interface{}, error) { r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}") + path := r.Replace("/database/collections/{collectionId}") params := map[string]interface{}{ } @@ -63,7 +63,7 @@ func (srv *Database) GetCollection(CollectionId string) (map[string]interface{}, // UpdateCollection update collection by its unique ID. func (srv *Database) UpdateCollection(CollectionId string, Name string, Read []interface{}, Write []interface{}, Rules []interface{}) (map[string]interface{}, error) { r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}") + path := r.Replace("/database/collections/{collectionId}") params := map[string]interface{}{ "name": Name, @@ -79,7 +79,7 @@ func (srv *Database) UpdateCollection(CollectionId string, Name string, Read []i // write permissions have access to delete this resource. func (srv *Database) DeleteCollection(CollectionId string) (map[string]interface{}, error) { r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}") + path := r.Replace("/database/collections/{collectionId}") params := map[string]interface{}{ } @@ -93,7 +93,7 @@ func (srv *Database) DeleteCollection(CollectionId string) (map[string]interface // modes](/docs/admin). func (srv *Database) ListDocuments(CollectionId string, Filters []interface{}, Offset int, Limit int, OrderField string, OrderType string, OrderCast string, Search string, First int, Last int) (map[string]interface{}, error) { r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}/documents") + path := r.Replace("/database/collections/{collectionId}/documents") params := map[string]interface{}{ "filters": Filters, @@ -113,7 +113,7 @@ func (srv *Database) ListDocuments(CollectionId string, Filters []interface{}, O // CreateDocument create a new Document. func (srv *Database) CreateDocument(CollectionId string, Data string, Read []interface{}, Write []interface{}, ParentDocument string, ParentProperty string, ParentPropertyType string) (map[string]interface{}, error) { r := strings.NewReplacer("{collectionId}", CollectionId) - path := r.Replace("/database/{collectionId}/documents") + path := r.Replace("/database/collections/{collectionId}/documents") params := map[string]interface{}{ "data": Data, @@ -131,7 +131,7 @@ func (srv *Database) CreateDocument(CollectionId string, Data string, Read []int // JSON object with the document data. func (srv *Database) GetDocument(CollectionId string, DocumentId string) (map[string]interface{}, error) { r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) - path := r.Replace("/database/{collectionId}/documents/{documentId}") + path := r.Replace("/database/collections/{collectionId}/documents/{documentId}") params := map[string]interface{}{ } @@ -142,7 +142,7 @@ func (srv *Database) GetDocument(CollectionId string, DocumentId string) (map[st // UpdateDocument func (srv *Database) UpdateDocument(CollectionId string, DocumentId string, Data string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) - path := r.Replace("/database/{collectionId}/documents/{documentId}") + path := r.Replace("/database/collections/{collectionId}/documents/{documentId}") params := map[string]interface{}{ "data": Data, @@ -158,7 +158,7 @@ func (srv *Database) UpdateDocument(CollectionId string, DocumentId string, Data // Child documents **will not** be deleted. func (srv *Database) DeleteDocument(CollectionId string, DocumentId string) (map[string]interface{}, error) { r := strings.NewReplacer("{collectionId}", CollectionId, "{documentId}", DocumentId) - path := r.Replace("/database/{collectionId}/documents/{documentId}") + path := r.Replace("/database/collections/{collectionId}/documents/{documentId}") params := map[string]interface{}{ } diff --git a/app/sdks/go/docs/examples/locale/get-locale.md b/app/sdks/go/docs/examples/locale/get.md similarity index 87% rename from app/sdks/go/docs/examples/locale/get-locale.md rename to app/sdks/go/docs/examples/locale/get.md index e3596c4939..edca6b6bc7 100644 --- a/app/sdks/go/docs/examples/locale/get-locale.md +++ b/app/sdks/go/docs/examples/locale/get.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetLocale() + var response, error := service.Get() if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/get-file.md b/app/sdks/go/docs/examples/storage/create.md similarity index 85% rename from app/sdks/go/docs/examples/storage/get-file.md rename to app/sdks/go/docs/examples/storage/create.md index 18ba1bd623..edfe6466fc 100644 --- a/app/sdks/go/docs/examples/storage/get-file.md +++ b/app/sdks/go/docs/examples/storage/create.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetFile("[FILE_ID]") + var response, error := service.Create(file, [], []) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/delete-file.md b/app/sdks/go/docs/examples/storage/delete.md similarity index 84% rename from app/sdks/go/docs/examples/storage/delete-file.md rename to app/sdks/go/docs/examples/storage/delete.md index 58bdf43fc2..e1d6ebf227 100644 --- a/app/sdks/go/docs/examples/storage/delete-file.md +++ b/app/sdks/go/docs/examples/storage/delete.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.DeleteFile("[FILE_ID]") + var response, error := service.Delete("[FILE_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/create-file.md b/app/sdks/go/docs/examples/storage/get-download.md similarity index 84% rename from app/sdks/go/docs/examples/storage/create-file.md rename to app/sdks/go/docs/examples/storage/get-download.md index 167661e740..e4b44e0bef 100644 --- a/app/sdks/go/docs/examples/storage/create-file.md +++ b/app/sdks/go/docs/examples/storage/get-download.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.CreateFile(file, [], []) + var response, error := service.GetDownload("[FILE_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/get-file-preview.md b/app/sdks/go/docs/examples/storage/get-file-preview.md deleted file mode 100644 index 6ee4a129cb..0000000000 --- a/app/sdks/go/docs/examples/storage/get-file-preview.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Storage{ - client: &client - } - - var response, error := service.GetFilePreview("[FILE_ID]", 0, 0, 0, "", "jpg") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/get-file-view.md b/app/sdks/go/docs/examples/storage/get-preview.md similarity index 80% rename from app/sdks/go/docs/examples/storage/get-file-view.md rename to app/sdks/go/docs/examples/storage/get-preview.md index 2a444aa6a5..5c59b45223 100644 --- a/app/sdks/go/docs/examples/storage/get-file-view.md +++ b/app/sdks/go/docs/examples/storage/get-preview.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetFileView("[FILE_ID]", "pdf") + var response, error := service.GetPreview("[FILE_ID]", 0, 0, 0, "", "jpg") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/get-file-download.md b/app/sdks/go/docs/examples/storage/get-view.md similarity index 83% rename from app/sdks/go/docs/examples/storage/get-file-download.md rename to app/sdks/go/docs/examples/storage/get-view.md index 1ac2f94d4d..983b76c05e 100644 --- a/app/sdks/go/docs/examples/storage/get-file-download.md +++ b/app/sdks/go/docs/examples/storage/get-view.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetFileDownload("[FILE_ID]") + var response, error := service.GetView("[FILE_ID]", "pdf") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/storage/get.md b/app/sdks/go/docs/examples/storage/get.md new file mode 100644 index 0000000000..7c203b1092 --- /dev/null +++ b/app/sdks/go/docs/examples/storage/get.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Storage{ + client: &client + } + + var response, error := service.Get("[FILE_ID]") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/list-files.md b/app/sdks/go/docs/examples/storage/list-files.md deleted file mode 100644 index 78cf9379a3..0000000000 --- a/app/sdks/go/docs/examples/storage/list-files.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Storage{ - client: &client - } - - var response, error := service.ListFiles("[SEARCH]", 0, 0, "ASC") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/list.md b/app/sdks/go/docs/examples/storage/list.md new file mode 100644 index 0000000000..836098be57 --- /dev/null +++ b/app/sdks/go/docs/examples/storage/list.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Storage{ + client: &client + } + + var response, error := service.List("[SEARCH]", 0, 0, "ASC") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/update-file.md b/app/sdks/go/docs/examples/storage/update-file.md deleted file mode 100644 index 4ef34d4d59..0000000000 --- a/app/sdks/go/docs/examples/storage/update-file.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Storage{ - client: &client - } - - var response, error := service.UpdateFile("[FILE_ID]", [], []) - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/storage/update.md b/app/sdks/go/docs/examples/storage/update.md new file mode 100644 index 0000000000..a46025b485 --- /dev/null +++ b/app/sdks/go/docs/examples/storage/update.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Storage{ + client: &client + } + + var response, error := service.Update("[FILE_ID]", [], []) + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/delete-team-membership.md b/app/sdks/go/docs/examples/teams/create-membership.md similarity index 72% rename from app/sdks/go/docs/examples/teams/delete-team-membership.md rename to app/sdks/go/docs/examples/teams/create-membership.md index 6d69bfbccc..5d526cdefd 100644 --- a/app/sdks/go/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/go/docs/examples/teams/create-membership.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.DeleteTeamMembership("[TEAM_ID]", "[INVITE_ID]") + var response, error := service.CreateMembership("[TEAM_ID]", "email@example.com", [], "https://example.com", "[NAME]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/teams/create-team-membership.md b/app/sdks/go/docs/examples/teams/create-team-membership.md deleted file mode 100644 index 0cc0e4c379..0000000000 --- a/app/sdks/go/docs/examples/teams/create-team-membership.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Teams{ - client: &client - } - - var response, error := service.CreateTeamMembership("[TEAM_ID]", "email@example.com", [], "https://example.com", "[NAME]") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/get-team.md b/app/sdks/go/docs/examples/teams/create.md similarity index 84% rename from app/sdks/go/docs/examples/teams/get-team.md rename to app/sdks/go/docs/examples/teams/create.md index 27a8505f7d..a9a3684271 100644 --- a/app/sdks/go/docs/examples/teams/get-team.md +++ b/app/sdks/go/docs/examples/teams/create.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetTeam("[TEAM_ID]") + var response, error := service.Create("[NAME]", []) if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/teams/delete-membership.md b/app/sdks/go/docs/examples/teams/delete-membership.md new file mode 100644 index 0000000000..ef5517a4d5 --- /dev/null +++ b/app/sdks/go/docs/examples/teams/delete-membership.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Teams{ + client: &client + } + + var response, error := service.DeleteMembership("[TEAM_ID]", "[INVITE_ID]") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/delete-team.md b/app/sdks/go/docs/examples/teams/delete.md similarity index 84% rename from app/sdks/go/docs/examples/teams/delete-team.md rename to app/sdks/go/docs/examples/teams/delete.md index 09c3e10f5f..b0dd016239 100644 --- a/app/sdks/go/docs/examples/teams/delete-team.md +++ b/app/sdks/go/docs/examples/teams/delete.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.DeleteTeam("[TEAM_ID]") + var response, error := service.Delete("[TEAM_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/teams/get-team-memberships.md b/app/sdks/go/docs/examples/teams/get-memberships.md similarity index 82% rename from app/sdks/go/docs/examples/teams/get-team-memberships.md rename to app/sdks/go/docs/examples/teams/get-memberships.md index 4ca6e7630c..0cfc217436 100644 --- a/app/sdks/go/docs/examples/teams/get-team-memberships.md +++ b/app/sdks/go/docs/examples/teams/get-memberships.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetTeamMemberships("[TEAM_ID]") + var response, error := service.GetMemberships("[TEAM_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/teams/create-team.md b/app/sdks/go/docs/examples/teams/get.md similarity index 84% rename from app/sdks/go/docs/examples/teams/create-team.md rename to app/sdks/go/docs/examples/teams/get.md index 27aea5d2f5..ffc6013e06 100644 --- a/app/sdks/go/docs/examples/teams/create-team.md +++ b/app/sdks/go/docs/examples/teams/get.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.CreateTeam("[NAME]", []) + var response, error := service.Get("[TEAM_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/teams/list-teams.md b/app/sdks/go/docs/examples/teams/list-teams.md deleted file mode 100644 index cf7e13f6a1..0000000000 --- a/app/sdks/go/docs/examples/teams/list-teams.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Teams{ - client: &client - } - - var response, error := service.ListTeams("[SEARCH]", 0, 0, "ASC") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/list.md b/app/sdks/go/docs/examples/teams/list.md new file mode 100644 index 0000000000..8fb23566bd --- /dev/null +++ b/app/sdks/go/docs/examples/teams/list.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Teams{ + client: &client + } + + var response, error := service.List("[SEARCH]", 0, 0, "ASC") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/update-team.md b/app/sdks/go/docs/examples/teams/update-team.md deleted file mode 100644 index 192cae2d0f..0000000000 --- a/app/sdks/go/docs/examples/teams/update-team.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Teams{ - client: &client - } - - var response, error := service.UpdateTeam("[TEAM_ID]", "[NAME]") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/teams/update.md b/app/sdks/go/docs/examples/teams/update.md new file mode 100644 index 0000000000..32fbc3752c --- /dev/null +++ b/app/sdks/go/docs/examples/teams/update.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Teams{ + client: &client + } + + var response, error := service.Update("[TEAM_ID]", "[NAME]") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/create-user.md b/app/sdks/go/docs/examples/users/create-user.md deleted file mode 100644 index 098d65800a..0000000000 --- a/app/sdks/go/docs/examples/users/create-user.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Users{ - client: &client - } - - var response, error := service.CreateUser("email@example.com", "password", "[NAME]") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/delete-user-session.md b/app/sdks/go/docs/examples/users/create.md similarity index 78% rename from app/sdks/go/docs/examples/users/delete-user-session.md rename to app/sdks/go/docs/examples/users/create.md index 3ad927b3b0..76c932441c 100644 --- a/app/sdks/go/docs/examples/users/delete-user-session.md +++ b/app/sdks/go/docs/examples/users/create.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.DeleteUserSession("[USER_ID]", "[SESSION_ID]") + var response, error := service.Create("email@example.com", "password", "[NAME]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/users/delete-user-sessions.md b/app/sdks/go/docs/examples/users/delete-session.md similarity index 80% rename from app/sdks/go/docs/examples/users/delete-user-sessions.md rename to app/sdks/go/docs/examples/users/delete-session.md index cd6d79d98c..a3c5879b8e 100644 --- a/app/sdks/go/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/go/docs/examples/users/delete-session.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.DeleteUserSessions("[USER_ID]") + var response, error := service.DeleteSession("[USER_ID]", "[SESSION_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/users/get-user-sessions.md b/app/sdks/go/docs/examples/users/delete-sessions.md similarity index 83% rename from app/sdks/go/docs/examples/users/get-user-sessions.md rename to app/sdks/go/docs/examples/users/delete-sessions.md index f2beabc22b..d4acdf8fa3 100644 --- a/app/sdks/go/docs/examples/users/get-user-sessions.md +++ b/app/sdks/go/docs/examples/users/delete-sessions.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetUserSessions("[USER_ID]") + var response, error := service.DeleteSessions("[USER_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/users/get-user.md b/app/sdks/go/docs/examples/users/get-logs.md similarity index 84% rename from app/sdks/go/docs/examples/users/get-user.md rename to app/sdks/go/docs/examples/users/get-logs.md index 8903b422e9..91e6ffe302 100644 --- a/app/sdks/go/docs/examples/users/get-user.md +++ b/app/sdks/go/docs/examples/users/get-logs.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetUser("[USER_ID]") + var response, error := service.GetLogs("[USER_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/users/get-user-logs.md b/app/sdks/go/docs/examples/users/get-prefs.md similarity index 84% rename from app/sdks/go/docs/examples/users/get-user-logs.md rename to app/sdks/go/docs/examples/users/get-prefs.md index 6fbddb92b5..cc1a409098 100644 --- a/app/sdks/go/docs/examples/users/get-user-logs.md +++ b/app/sdks/go/docs/examples/users/get-prefs.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetUserLogs("[USER_ID]") + var response, error := service.GetPrefs("[USER_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/users/get-user-prefs.md b/app/sdks/go/docs/examples/users/get-sessions.md similarity index 83% rename from app/sdks/go/docs/examples/users/get-user-prefs.md rename to app/sdks/go/docs/examples/users/get-sessions.md index 18c412dc3e..e071d83e08 100644 --- a/app/sdks/go/docs/examples/users/get-user-prefs.md +++ b/app/sdks/go/docs/examples/users/get-sessions.md @@ -15,7 +15,7 @@ func main() { client: &client } - var response, error := service.GetUserPrefs("[USER_ID]") + var response, error := service.GetSessions("[USER_ID]") if error != nil { panic(error) diff --git a/app/sdks/go/docs/examples/users/get.md b/app/sdks/go/docs/examples/users/get.md new file mode 100644 index 0000000000..f3f2bb94f6 --- /dev/null +++ b/app/sdks/go/docs/examples/users/get.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Users{ + client: &client + } + + var response, error := service.Get("[USER_ID]") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/list-users.md b/app/sdks/go/docs/examples/users/list-users.md deleted file mode 100644 index a77f46f225..0000000000 --- a/app/sdks/go/docs/examples/users/list-users.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Users{ - client: &client - } - - var response, error := service.ListUsers("[SEARCH]", 0, 0, "ASC") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/list.md b/app/sdks/go/docs/examples/users/list.md new file mode 100644 index 0000000000..de90f8763f --- /dev/null +++ b/app/sdks/go/docs/examples/users/list.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Users{ + client: &client + } + + var response, error := service.List("[SEARCH]", 0, 0, "ASC") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/update-prefs.md b/app/sdks/go/docs/examples/users/update-prefs.md new file mode 100644 index 0000000000..405d631f8f --- /dev/null +++ b/app/sdks/go/docs/examples/users/update-prefs.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Users{ + client: &client + } + + var response, error := service.UpdatePrefs("[USER_ID]", "") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/update-status.md b/app/sdks/go/docs/examples/users/update-status.md new file mode 100644 index 0000000000..46ca7eb469 --- /dev/null +++ b/app/sdks/go/docs/examples/users/update-status.md @@ -0,0 +1,25 @@ +package main + +import ( + "fmt" + "github.com/appwrite/sdk-for-go" +) + +func main() { + var client := appwrite.Client{} + + client.SetProject("") + client.SetKey("") + + var service := appwrite.Users{ + client: &client + } + + var response, error := service.UpdateStatus("[USER_ID]", "1") + + if error != nil { + panic(error) + } + + fmt.Println(response) +} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/update-user-prefs.md b/app/sdks/go/docs/examples/users/update-user-prefs.md deleted file mode 100644 index 113f12fbb0..0000000000 --- a/app/sdks/go/docs/examples/users/update-user-prefs.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Users{ - client: &client - } - - var response, error := service.UpdateUserPrefs("[USER_ID]", "") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/docs/examples/users/update-user-status.md b/app/sdks/go/docs/examples/users/update-user-status.md deleted file mode 100644 index 943b401740..0000000000 --- a/app/sdks/go/docs/examples/users/update-user-status.md +++ /dev/null @@ -1,25 +0,0 @@ -package main - -import ( - "fmt" - "github.com/appwrite/sdk-for-go" -) - -func main() { - var client := appwrite.Client{} - - client.SetProject("") - client.SetKey("") - - var service := appwrite.Users{ - client: &client - } - - var response, error := service.UpdateUserStatus("[USER_ID]", "1") - - if error != nil { - panic(error) - } - - fmt.Println(response) -} \ No newline at end of file diff --git a/app/sdks/go/locale.go b/app/sdks/go/locale.go index 5c379fab4a..ecadd889cb 100644 --- a/app/sdks/go/locale.go +++ b/app/sdks/go/locale.go @@ -16,13 +16,13 @@ func NewLocale(clt Client) Locale { return service } -// GetLocale get the current user location based on IP. Returns an object with -// user country code, country name, continent name, continent code, ip address -// and suggested currency. You can use the locale header to get the data in a +// Get get the current user location based on IP. Returns an object with user +// country code, country name, continent name, continent code, ip address and +// suggested currency. You can use the locale header to get the data in a // supported language. // // ([IP Geolocation by DB-IP](https://db-ip.com)) -func (srv *Locale) GetLocale() (map[string]interface{}, error) { +func (srv *Locale) Get() (map[string]interface{}, error) { path := "/locale" params := map[string]interface{}{ diff --git a/app/sdks/go/storage.go b/app/sdks/go/storage.go index 7ede9c3255..898fa7aa0e 100644 --- a/app/sdks/go/storage.go +++ b/app/sdks/go/storage.go @@ -17,10 +17,10 @@ func NewStorage(clt Client) Storage { return service } -// ListFiles get a list of all the user files. You can use the query params to +// List get a list of all the user files. You can use the query params to // filter your results. On admin mode, this endpoint will return a list of all // of the project files. [Learn more about different API modes](/docs/admin). -func (srv *Storage) ListFiles(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { +func (srv *Storage) List(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { path := "/storage/files" params := map[string]interface{}{ @@ -33,10 +33,10 @@ func (srv *Storage) ListFiles(Search string, Limit int, Offset int, OrderType st return srv.client.Call("GET", path, nil, params) } -// CreateFile create a new file. The user who creates the file will -// automatically be assigned to read and write access unless he has passed -// custom values for read and write arguments. -func (srv *Storage) CreateFile(File string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { +// Create create a new file. The user who creates the file will automatically +// be assigned to read and write access unless he has passed custom values for +// read and write arguments. +func (srv *Storage) Create(File string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { path := "/storage/files" params := map[string]interface{}{ @@ -48,9 +48,9 @@ func (srv *Storage) CreateFile(File string, Read []interface{}, Write []interfac return srv.client.Call("POST", path, nil, params) } -// GetFile get file by its unique ID. This endpoint response returns a JSON -// object with the file metadata. -func (srv *Storage) GetFile(FileId string) (map[string]interface{}, error) { +// Get get file by its unique ID. This endpoint response returns a JSON object +// with the file metadata. +func (srv *Storage) Get(FileId string) (map[string]interface{}, error) { r := strings.NewReplacer("{fileId}", FileId) path := r.Replace("/storage/files/{fileId}") @@ -60,9 +60,9 @@ func (srv *Storage) GetFile(FileId string) (map[string]interface{}, error) { return srv.client.Call("GET", path, nil, params) } -// UpdateFile update file by its unique ID. Only users with write permissions -// have access to update this resource. -func (srv *Storage) UpdateFile(FileId string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { +// Update update file by its unique ID. Only users with write permissions have +// access to update this resource. +func (srv *Storage) Update(FileId string, Read []interface{}, Write []interface{}) (map[string]interface{}, error) { r := strings.NewReplacer("{fileId}", FileId) path := r.Replace("/storage/files/{fileId}") @@ -74,9 +74,9 @@ func (srv *Storage) UpdateFile(FileId string, Read []interface{}, Write []interf return srv.client.Call("PUT", path, nil, params) } -// DeleteFile delete a file by its unique ID. Only users with write -// permissions have access to delete this resource. -func (srv *Storage) DeleteFile(FileId string) (map[string]interface{}, error) { +// Delete delete a file by its unique ID. Only users with write permissions +// have access to delete this resource. +func (srv *Storage) Delete(FileId string) (map[string]interface{}, error) { r := strings.NewReplacer("{fileId}", FileId) path := r.Replace("/storage/files/{fileId}") @@ -86,10 +86,10 @@ func (srv *Storage) DeleteFile(FileId string) (map[string]interface{}, error) { return srv.client.Call("DELETE", path, nil, params) } -// GetFileDownload get file content by its unique ID. The endpoint response -// return with a 'Content-Disposition: attachment' header that tells the -// browser to start downloading the file to user downloads directory. -func (srv *Storage) GetFileDownload(FileId string) (map[string]interface{}, error) { +// GetDownload get file content by its unique ID. The endpoint response return +// with a 'Content-Disposition: attachment' header that tells the browser to +// start downloading the file to user downloads directory. +func (srv *Storage) GetDownload(FileId string) (map[string]interface{}, error) { r := strings.NewReplacer("{fileId}", FileId) path := r.Replace("/storage/files/{fileId}/download") @@ -99,12 +99,12 @@ func (srv *Storage) GetFileDownload(FileId string) (map[string]interface{}, erro return srv.client.Call("GET", path, nil, params) } -// GetFilePreview get a file preview image. Currently, this method supports +// GetPreview get a file preview image. Currently, this method supports // preview for image files (jpg, png, and gif), other supported formats, like // pdf, docs, slides, and spreadsheets, will return the file icon image. You // can also pass query string arguments for cutting and resizing your preview // image. -func (srv *Storage) GetFilePreview(FileId string, Width int, Height int, Quality int, Background string, Output string) (map[string]interface{}, error) { +func (srv *Storage) GetPreview(FileId string, Width int, Height int, Quality int, Background string, Output string) (map[string]interface{}, error) { r := strings.NewReplacer("{fileId}", FileId) path := r.Replace("/storage/files/{fileId}/preview") @@ -119,10 +119,10 @@ func (srv *Storage) GetFilePreview(FileId string, Width int, Height int, Quality return srv.client.Call("GET", path, nil, params) } -// GetFileView get file content by its unique ID. This endpoint is similar to -// the download method but returns with no 'Content-Disposition: attachment' +// GetView get file content by its unique ID. This endpoint is similar to the +// download method but returns with no 'Content-Disposition: attachment' // header. -func (srv *Storage) GetFileView(FileId string, As string) (map[string]interface{}, error) { +func (srv *Storage) GetView(FileId string, As string) (map[string]interface{}, error) { r := strings.NewReplacer("{fileId}", FileId) path := r.Replace("/storage/files/{fileId}/view") diff --git a/app/sdks/go/teams.go b/app/sdks/go/teams.go index 03e5425d0f..ce0ff645e8 100644 --- a/app/sdks/go/teams.go +++ b/app/sdks/go/teams.go @@ -17,11 +17,11 @@ func NewTeams(clt Client) Teams { return service } -// ListTeams get a list of all the current user teams. You can use the query -// params to filter your results. On admin mode, this endpoint will return a -// list of all of the project teams. [Learn more about different API +// List get a list of all the current user teams. You can use the query params +// to filter your results. On admin mode, this endpoint will return a list of +// all of the project teams. [Learn more about different API // modes](/docs/admin). -func (srv *Teams) ListTeams(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { +func (srv *Teams) List(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { path := "/teams" params := map[string]interface{}{ @@ -34,11 +34,11 @@ func (srv *Teams) ListTeams(Search string, Limit int, Offset int, OrderType stri return srv.client.Call("GET", path, nil, params) } -// CreateTeam create a new team. The user who creates the team will -// automatically be assigned as the owner of the team. The team owner can -// invite new members, who will be able add new owners and update or delete -// the team from your project. -func (srv *Teams) CreateTeam(Name string, Roles []interface{}) (map[string]interface{}, error) { +// Create create a new team. The user who creates the team will automatically +// be assigned as the owner of the team. The team owner can invite new +// members, who will be able add new owners and update or delete the team from +// your project. +func (srv *Teams) Create(Name string, Roles []interface{}) (map[string]interface{}, error) { path := "/teams" params := map[string]interface{}{ @@ -49,9 +49,9 @@ func (srv *Teams) CreateTeam(Name string, Roles []interface{}) (map[string]inter return srv.client.Call("POST", path, nil, params) } -// GetTeam get team by its unique ID. All team members have read access for -// this resource. -func (srv *Teams) GetTeam(TeamId string) (map[string]interface{}, error) { +// Get get team by its unique ID. All team members have read access for this +// resource. +func (srv *Teams) Get(TeamId string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId) path := r.Replace("/teams/{teamId}") @@ -61,9 +61,9 @@ func (srv *Teams) GetTeam(TeamId string) (map[string]interface{}, error) { return srv.client.Call("GET", path, nil, params) } -// UpdateTeam update team by its unique ID. Only team owners have write access -// for this resource. -func (srv *Teams) UpdateTeam(TeamId string, Name string) (map[string]interface{}, error) { +// Update update team by its unique ID. Only team owners have write access for +// this resource. +func (srv *Teams) Update(TeamId string, Name string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId) path := r.Replace("/teams/{teamId}") @@ -74,9 +74,9 @@ func (srv *Teams) UpdateTeam(TeamId string, Name string) (map[string]interface{} return srv.client.Call("PUT", path, nil, params) } -// DeleteTeam delete team by its unique ID. Only team owners have write access -// for this resource. -func (srv *Teams) DeleteTeam(TeamId string) (map[string]interface{}, error) { +// Delete delete team by its unique ID. Only team owners have write access for +// this resource. +func (srv *Teams) Delete(TeamId string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId) path := r.Replace("/teams/{teamId}") @@ -86,9 +86,9 @@ func (srv *Teams) DeleteTeam(TeamId string) (map[string]interface{}, error) { return srv.client.Call("DELETE", path, nil, params) } -// GetTeamMemberships get team members by the team unique ID. All team members +// GetMemberships get team members by the team unique ID. All team members // have read access for this list of resources. -func (srv *Teams) GetTeamMemberships(TeamId string) (map[string]interface{}, error) { +func (srv *Teams) GetMemberships(TeamId string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId) path := r.Replace("/teams/{teamId}/memberships") @@ -98,8 +98,8 @@ func (srv *Teams) GetTeamMemberships(TeamId string) (map[string]interface{}, err return srv.client.Call("GET", path, nil, params) } -// CreateTeamMembership use this endpoint to invite a new member to your team. -// An email with a link to join the team will be sent to the new member email +// CreateMembership use this endpoint to invite a new member to your team. An +// email with a link to join the team will be sent to the new member email // address. If member doesn't exists in the project it will be automatically // created. // @@ -112,7 +112,7 @@ func (srv *Teams) GetTeamMemberships(TeamId string) (map[string]interface{}, err // Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) // the only valid redirect URL's are the once from domains you have set when // added your platforms in the console interface. -func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []interface{}, Url string, Name string) (map[string]interface{}, error) { +func (srv *Teams) CreateMembership(TeamId string, Email string, Roles []interface{}, Url string, Name string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId) path := r.Replace("/teams/{teamId}/memberships") @@ -126,10 +126,10 @@ func (srv *Teams) CreateTeamMembership(TeamId string, Email string, Roles []inte return srv.client.Call("POST", path, nil, params) } -// DeleteTeamMembership this endpoint allows a user to leave a team or for a -// team owner to delete the membership of any other team member. You can also -// use this endpoint to delete a user membership even if he didn't accept it. -func (srv *Teams) DeleteTeamMembership(TeamId string, InviteId string) (map[string]interface{}, error) { +// DeleteMembership this endpoint allows a user to leave a team or for a team +// owner to delete the membership of any other team member. You can also use +// this endpoint to delete a user membership even if he didn't accept it. +func (srv *Teams) DeleteMembership(TeamId string, InviteId string) (map[string]interface{}, error) { r := strings.NewReplacer("{teamId}", TeamId, "{inviteId}", InviteId) path := r.Replace("/teams/{teamId}/memberships/{inviteId}") diff --git a/app/sdks/go/users.go b/app/sdks/go/users.go index ecd75f076a..86e4457f1a 100644 --- a/app/sdks/go/users.go +++ b/app/sdks/go/users.go @@ -17,9 +17,9 @@ func NewUsers(clt Client) Users { return service } -// ListUsers get a list of all the project users. You can use the query params -// to filter your results. -func (srv *Users) ListUsers(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { +// List get a list of all the project users. You can use the query params to +// filter your results. +func (srv *Users) List(Search string, Limit int, Offset int, OrderType string) (map[string]interface{}, error) { path := "/users" params := map[string]interface{}{ @@ -32,8 +32,8 @@ func (srv *Users) ListUsers(Search string, Limit int, Offset int, OrderType stri return srv.client.Call("GET", path, nil, params) } -// CreateUser create a new user. -func (srv *Users) CreateUser(Email string, Password string, Name string) (map[string]interface{}, error) { +// Create create a new user. +func (srv *Users) Create(Email string, Password string, Name string) (map[string]interface{}, error) { path := "/users" params := map[string]interface{}{ @@ -45,8 +45,8 @@ func (srv *Users) CreateUser(Email string, Password string, Name string) (map[st return srv.client.Call("POST", path, nil, params) } -// GetUser get user by its unique ID. -func (srv *Users) GetUser(UserId string) (map[string]interface{}, error) { +// Get get user by its unique ID. +func (srv *Users) Get(UserId string) (map[string]interface{}, error) { r := strings.NewReplacer("{userId}", UserId) path := r.Replace("/users/{userId}") @@ -56,8 +56,8 @@ func (srv *Users) GetUser(UserId string) (map[string]interface{}, error) { return srv.client.Call("GET", path, nil, params) } -// GetUserLogs get user activity logs list by its unique ID. -func (srv *Users) GetUserLogs(UserId string) (map[string]interface{}, error) { +// GetLogs get user activity logs list by its unique ID. +func (srv *Users) GetLogs(UserId string) (map[string]interface{}, error) { r := strings.NewReplacer("{userId}", UserId) path := r.Replace("/users/{userId}/logs") @@ -67,8 +67,8 @@ func (srv *Users) GetUserLogs(UserId string) (map[string]interface{}, error) { return srv.client.Call("GET", path, nil, params) } -// GetUserPrefs get user preferences by its unique ID. -func (srv *Users) GetUserPrefs(UserId string) (map[string]interface{}, error) { +// GetPrefs get user preferences by its unique ID. +func (srv *Users) GetPrefs(UserId string) (map[string]interface{}, error) { r := strings.NewReplacer("{userId}", UserId) path := r.Replace("/users/{userId}/prefs") @@ -78,9 +78,9 @@ func (srv *Users) GetUserPrefs(UserId string) (map[string]interface{}, error) { return srv.client.Call("GET", path, nil, params) } -// UpdateUserPrefs update user preferences by its unique ID. You can pass only -// the specific settings you wish to update. -func (srv *Users) UpdateUserPrefs(UserId string, Prefs string) (map[string]interface{}, error) { +// UpdatePrefs update user preferences by its unique ID. You can pass only the +// specific settings you wish to update. +func (srv *Users) UpdatePrefs(UserId string, Prefs string) (map[string]interface{}, error) { r := strings.NewReplacer("{userId}", UserId) path := r.Replace("/users/{userId}/prefs") @@ -91,8 +91,8 @@ func (srv *Users) UpdateUserPrefs(UserId string, Prefs string) (map[string]inter return srv.client.Call("PATCH", path, nil, params) } -// GetUserSessions get user sessions list by its unique ID. -func (srv *Users) GetUserSessions(UserId string) (map[string]interface{}, error) { +// GetSessions get user sessions list by its unique ID. +func (srv *Users) GetSessions(UserId string) (map[string]interface{}, error) { r := strings.NewReplacer("{userId}", UserId) path := r.Replace("/users/{userId}/sessions") @@ -102,8 +102,8 @@ func (srv *Users) GetUserSessions(UserId string) (map[string]interface{}, error) return srv.client.Call("GET", path, nil, params) } -// DeleteUserSessions delete all user sessions by its unique ID. -func (srv *Users) DeleteUserSessions(UserId string) (map[string]interface{}, error) { +// DeleteSessions delete all user sessions by its unique ID. +func (srv *Users) DeleteSessions(UserId string) (map[string]interface{}, error) { r := strings.NewReplacer("{userId}", UserId) path := r.Replace("/users/{userId}/sessions") @@ -113,8 +113,8 @@ func (srv *Users) DeleteUserSessions(UserId string) (map[string]interface{}, err return srv.client.Call("DELETE", path, nil, params) } -// DeleteUserSession delete user sessions by its unique ID. -func (srv *Users) DeleteUserSession(UserId string, SessionId string) (map[string]interface{}, error) { +// DeleteSession delete user sessions by its unique ID. +func (srv *Users) DeleteSession(UserId string, SessionId string) (map[string]interface{}, error) { r := strings.NewReplacer("{userId}", UserId) path := r.Replace("/users/{userId}/sessions/:session") @@ -125,8 +125,8 @@ func (srv *Users) DeleteUserSession(UserId string, SessionId string) (map[string return srv.client.Call("DELETE", path, nil, params) } -// UpdateUserStatus update user status by its unique ID. -func (srv *Users) UpdateUserStatus(UserId string, Status string) (map[string]interface{}, error) { +// UpdateStatus update user status by its unique ID. +func (srv *Users) UpdateStatus(UserId string, Status string) (map[string]interface{}, error) { r := strings.NewReplacer("{userId}", UserId) path := r.Replace("/users/{userId}/status") diff --git a/app/sdks/javascript/docs/examples/account/create-account-session-o-auth.md b/app/sdks/javascript/docs/examples/account/create-account-session-o-auth.md deleted file mode 100644 index f5fa4781e1..0000000000 --- a/app/sdks/javascript/docs/examples/account/create-account-session-o-auth.md +++ /dev/null @@ -1,12 +0,0 @@ -let sdk = new Appwrite(); - -sdk -; - -let promise = sdk.account.createAccountSessionOAuth('bitbucket', 'https://example.com', 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-o-auth-session.md b/app/sdks/javascript/docs/examples/account/create-o-auth-session.md new file mode 100644 index 0000000000..a6e19c5475 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/create-o-auth-session.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.createOAuthSession('bitbucket', 'https://example.com', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-recovery.md b/app/sdks/javascript/docs/examples/account/create-recovery.md new file mode 100644 index 0000000000..a20628d283 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/create-recovery.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.createRecovery('email@example.com', 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-account.md b/app/sdks/javascript/docs/examples/account/create-session.md similarity index 70% rename from app/sdks/javascript/docs/examples/account/create-account.md rename to app/sdks/javascript/docs/examples/account/create-session.md index 0c10009e12..caef5ee9f2 100644 --- a/app/sdks/javascript/docs/examples/account/create-account.md +++ b/app/sdks/javascript/docs/examples/account/create-session.md @@ -3,7 +3,7 @@ let sdk = new Appwrite(); sdk ; -let promise = sdk.account.createAccount('email@example.com', 'password'); +let promise = sdk.account.createSession('email@example.com', 'password'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/account/create.md b/app/sdks/javascript/docs/examples/account/create.md new file mode 100644 index 0000000000..a956373ecf --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/create.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.create('email@example.com', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/delete-current-session.md b/app/sdks/javascript/docs/examples/account/delete-current-session.md new file mode 100644 index 0000000000..a0ba8e88f4 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/delete-current-session.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.deleteCurrentSession(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/delete-session.md b/app/sdks/javascript/docs/examples/account/delete-session.md new file mode 100644 index 0000000000..56562c9007 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/delete-session.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.deleteSession('[ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/get-account-logs.md b/app/sdks/javascript/docs/examples/account/delete-sessions.md similarity index 79% rename from app/sdks/javascript/docs/examples/account/get-account-logs.md rename to app/sdks/javascript/docs/examples/account/delete-sessions.md index f913b22d34..acc78bcd3f 100644 --- a/app/sdks/javascript/docs/examples/account/get-account-logs.md +++ b/app/sdks/javascript/docs/examples/account/delete-sessions.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.account.getAccountLogs(); +let promise = sdk.account.deleteSessions(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/teams/list-teams.md b/app/sdks/javascript/docs/examples/account/get-logs.md similarity index 81% rename from app/sdks/javascript/docs/examples/teams/list-teams.md rename to app/sdks/javascript/docs/examples/account/get-logs.md index abd4fa420b..5017e74507 100644 --- a/app/sdks/javascript/docs/examples/teams/list-teams.md +++ b/app/sdks/javascript/docs/examples/account/get-logs.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.teams.listTeams(); +let promise = sdk.account.getLogs(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/locale/get-locale.md b/app/sdks/javascript/docs/examples/account/get-prefs.md similarity index 81% rename from app/sdks/javascript/docs/examples/locale/get-locale.md rename to app/sdks/javascript/docs/examples/account/get-prefs.md index 4cc5a3f3b2..39f8950138 100644 --- a/app/sdks/javascript/docs/examples/locale/get-locale.md +++ b/app/sdks/javascript/docs/examples/account/get-prefs.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.locale.getLocale(); +let promise = sdk.account.getPrefs(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/account/get-sessions.md b/app/sdks/javascript/docs/examples/account/get-sessions.md new file mode 100644 index 0000000000..963400deeb --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/get-sessions.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.account.getSessions(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/list-files.md b/app/sdks/javascript/docs/examples/account/get.md similarity index 80% rename from app/sdks/javascript/docs/examples/storage/list-files.md rename to app/sdks/javascript/docs/examples/account/get.md index 0033bb254d..682e09fbd8 100644 --- a/app/sdks/javascript/docs/examples/storage/list-files.md +++ b/app/sdks/javascript/docs/examples/account/get.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.storage.listFiles(); +let promise = sdk.account.get(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/account/update-account-name.md b/app/sdks/javascript/docs/examples/account/update-account-name.md deleted file mode 100644 index e527233999..0000000000 --- a/app/sdks/javascript/docs/examples/account/update-account-name.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.updateAccountName('[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-account-password.md b/app/sdks/javascript/docs/examples/account/update-account-password.md deleted file mode 100644 index fcf39adf17..0000000000 --- a/app/sdks/javascript/docs/examples/account/update-account-password.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.account.updateAccountPassword('password', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-account-recovery.md b/app/sdks/javascript/docs/examples/account/update-account-recovery.md deleted file mode 100644 index 2bf315b42e..0000000000 --- a/app/sdks/javascript/docs/examples/account/update-account-recovery.md +++ /dev/null @@ -1,12 +0,0 @@ -let sdk = new Appwrite(); - -sdk -; - -let promise = sdk.account.updateAccountRecovery('[USER_ID]', '[SECRET]', 'password', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/update-account-verification.md b/app/sdks/javascript/docs/examples/account/update-account-verification.md deleted file mode 100644 index 796e8d2aa5..0000000000 --- a/app/sdks/javascript/docs/examples/account/update-account-verification.md +++ /dev/null @@ -1,12 +0,0 @@ -let sdk = new Appwrite(); - -sdk -; - -let promise = sdk.account.updateAccountVerification('[USER_ID]', '[SECRET]', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/get-account-sessions.md b/app/sdks/javascript/docs/examples/account/update-name.md similarity index 77% rename from app/sdks/javascript/docs/examples/account/get-account-sessions.md rename to app/sdks/javascript/docs/examples/account/update-name.md index ab550e510f..2e5531e4c3 100644 --- a/app/sdks/javascript/docs/examples/account/get-account-sessions.md +++ b/app/sdks/javascript/docs/examples/account/update-name.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.account.getAccountSessions(); +let promise = sdk.account.updateName('[NAME]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/account/delete-account-current-session.md b/app/sdks/javascript/docs/examples/account/update-password.md similarity index 71% rename from app/sdks/javascript/docs/examples/account/delete-account-current-session.md rename to app/sdks/javascript/docs/examples/account/update-password.md index 1ec94ce7e6..e4ddc7fc49 100644 --- a/app/sdks/javascript/docs/examples/account/delete-account-current-session.md +++ b/app/sdks/javascript/docs/examples/account/update-password.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.account.deleteAccountCurrentSession(); +let promise = sdk.account.updatePassword('password', 'password'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/account/update-recovery.md b/app/sdks/javascript/docs/examples/account/update-recovery.md new file mode 100644 index 0000000000..a04f31f4d6 --- /dev/null +++ b/app/sdks/javascript/docs/examples/account/update-recovery.md @@ -0,0 +1,12 @@ +let sdk = new Appwrite(); + +sdk +; + +let promise = sdk.account.updateRecovery('[USER_ID]', '[SECRET]', 'password', 'password'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-account-session.md b/app/sdks/javascript/docs/examples/account/update-verification.md similarity index 63% rename from app/sdks/javascript/docs/examples/account/create-account-session.md rename to app/sdks/javascript/docs/examples/account/update-verification.md index 030c8a0997..61d7282d11 100644 --- a/app/sdks/javascript/docs/examples/account/create-account-session.md +++ b/app/sdks/javascript/docs/examples/account/update-verification.md @@ -3,7 +3,7 @@ let sdk = new Appwrite(); sdk ; -let promise = sdk.account.createAccountSession('email@example.com', 'password'); +let promise = sdk.account.updateVerification('[USER_ID]', '[SECRET]', 'password'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/account/get-account.md b/app/sdks/javascript/docs/examples/locale/get.md similarity index 80% rename from app/sdks/javascript/docs/examples/account/get-account.md rename to app/sdks/javascript/docs/examples/locale/get.md index 951c0339c4..0a61e3ae6b 100644 --- a/app/sdks/javascript/docs/examples/account/get-account.md +++ b/app/sdks/javascript/docs/examples/locale/get.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.account.getAccount(); +let promise = sdk.locale.get(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/storage/create-file.md b/app/sdks/javascript/docs/examples/storage/create-file.md deleted file mode 100644 index 53157d19a3..0000000000 --- a/app/sdks/javascript/docs/examples/storage/create-file.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.createFile(document.getElementById('uploader').files[0], [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/create.md b/app/sdks/javascript/docs/examples/storage/create.md new file mode 100644 index 0000000000..a994d2134b --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/create.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.create(document.getElementById('uploader').files[0], [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/delete-file.md b/app/sdks/javascript/docs/examples/storage/delete-file.md deleted file mode 100644 index 4e39bd9811..0000000000 --- a/app/sdks/javascript/docs/examples/storage/delete-file.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.deleteFile('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/delete.md b/app/sdks/javascript/docs/examples/storage/delete.md new file mode 100644 index 0000000000..eb05232cf6 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/delete.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.delete('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-download.md b/app/sdks/javascript/docs/examples/storage/get-download.md new file mode 100644 index 0000000000..def50c957f --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/get-download.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.getDownload('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-file-download.md b/app/sdks/javascript/docs/examples/storage/get-file-download.md deleted file mode 100644 index a53142184c..0000000000 --- a/app/sdks/javascript/docs/examples/storage/get-file-download.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.getFileDownload('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-file-preview.md b/app/sdks/javascript/docs/examples/storage/get-file-preview.md deleted file mode 100644 index 1cce3acd24..0000000000 --- a/app/sdks/javascript/docs/examples/storage/get-file-preview.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.getFilePreview('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-file-view.md b/app/sdks/javascript/docs/examples/storage/get-file-view.md deleted file mode 100644 index 4844b22ce3..0000000000 --- a/app/sdks/javascript/docs/examples/storage/get-file-view.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.getFileView('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get-file.md b/app/sdks/javascript/docs/examples/storage/get-file.md deleted file mode 100644 index 32b11a2175..0000000000 --- a/app/sdks/javascript/docs/examples/storage/get-file.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.getFile('[FILE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/delete-account-sessions.md b/app/sdks/javascript/docs/examples/storage/get-preview.md similarity index 76% rename from app/sdks/javascript/docs/examples/account/delete-account-sessions.md rename to app/sdks/javascript/docs/examples/storage/get-preview.md index 5c89537df8..52f7e64a41 100644 --- a/app/sdks/javascript/docs/examples/account/delete-account-sessions.md +++ b/app/sdks/javascript/docs/examples/storage/get-preview.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.account.deleteAccountSessions(); +let promise = sdk.storage.getPreview('[FILE_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/storage/get-view.md b/app/sdks/javascript/docs/examples/storage/get-view.md new file mode 100644 index 0000000000..93490036ae --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/get-view.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.getView('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/get.md b/app/sdks/javascript/docs/examples/storage/get.md new file mode 100644 index 0000000000..730a62d975 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/get.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.get('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/list.md b/app/sdks/javascript/docs/examples/storage/list.md new file mode 100644 index 0000000000..1ab4777ce5 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/list.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.list(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/update-file.md b/app/sdks/javascript/docs/examples/storage/update-file.md deleted file mode 100644 index 72d6ee3166..0000000000 --- a/app/sdks/javascript/docs/examples/storage/update-file.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.storage.updateFile('[FILE_ID]', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/storage/update.md b/app/sdks/javascript/docs/examples/storage/update.md new file mode 100644 index 0000000000..da3c6d4675 --- /dev/null +++ b/app/sdks/javascript/docs/examples/storage/update.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.storage.update('[FILE_ID]', [], []); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/create-membership.md b/app/sdks/javascript/docs/examples/teams/create-membership.md new file mode 100644 index 0000000000..349b229d0d --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/create-membership.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.createMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/create-team-membership.md b/app/sdks/javascript/docs/examples/teams/create-team-membership.md deleted file mode 100644 index 60f996c209..0000000000 --- a/app/sdks/javascript/docs/examples/teams/create-team-membership.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.createTeamMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/create-team.md b/app/sdks/javascript/docs/examples/teams/create-team.md deleted file mode 100644 index 2dafeac2ab..0000000000 --- a/app/sdks/javascript/docs/examples/teams/create-team.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.createTeam('[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/create.md b/app/sdks/javascript/docs/examples/teams/create.md new file mode 100644 index 0000000000..635aafc160 --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/create.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.create('[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/delete-account-session.md b/app/sdks/javascript/docs/examples/teams/delete-membership.md similarity index 70% rename from app/sdks/javascript/docs/examples/account/delete-account-session.md rename to app/sdks/javascript/docs/examples/teams/delete-membership.md index bd916923e0..4b3f29ae86 100644 --- a/app/sdks/javascript/docs/examples/account/delete-account-session.md +++ b/app/sdks/javascript/docs/examples/teams/delete-membership.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.account.deleteAccountSession('[ID]'); +let promise = sdk.teams.deleteMembership('[TEAM_ID]', '[INVITE_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/teams/delete-team-membership.md b/app/sdks/javascript/docs/examples/teams/delete-team-membership.md deleted file mode 100644 index 551dfd7dbb..0000000000 --- a/app/sdks/javascript/docs/examples/teams/delete-team-membership.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.deleteTeamMembership('[TEAM_ID]', '[INVITE_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/delete-team.md b/app/sdks/javascript/docs/examples/teams/delete-team.md deleted file mode 100644 index 3f9cd8b6f5..0000000000 --- a/app/sdks/javascript/docs/examples/teams/delete-team.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.deleteTeam('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/get-account-prefs.md b/app/sdks/javascript/docs/examples/teams/delete.md similarity index 78% rename from app/sdks/javascript/docs/examples/account/get-account-prefs.md rename to app/sdks/javascript/docs/examples/teams/delete.md index 043c9f2e71..f9ac0b3a98 100644 --- a/app/sdks/javascript/docs/examples/account/get-account-prefs.md +++ b/app/sdks/javascript/docs/examples/teams/delete.md @@ -4,7 +4,7 @@ sdk .setProject('') ; -let promise = sdk.account.getAccountPrefs(); +let promise = sdk.teams.delete('[TEAM_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/teams/get-memberships.md b/app/sdks/javascript/docs/examples/teams/get-memberships.md new file mode 100644 index 0000000000..456ee074df --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/get-memberships.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.getMemberships('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/get-team-memberships.md b/app/sdks/javascript/docs/examples/teams/get-team-memberships.md deleted file mode 100644 index 20ce7b2bea..0000000000 --- a/app/sdks/javascript/docs/examples/teams/get-team-memberships.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.getTeamMemberships('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/get-team.md b/app/sdks/javascript/docs/examples/teams/get-team.md deleted file mode 100644 index 7e1f8254fe..0000000000 --- a/app/sdks/javascript/docs/examples/teams/get-team.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.getTeam('[TEAM_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/get.md b/app/sdks/javascript/docs/examples/teams/get.md new file mode 100644 index 0000000000..c61fb5b89a --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/get.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.get('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/list.md b/app/sdks/javascript/docs/examples/teams/list.md new file mode 100644 index 0000000000..3944cce2e0 --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/list.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.list(); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/account/create-account-recovery.md b/app/sdks/javascript/docs/examples/teams/update-membership-status.md similarity index 59% rename from app/sdks/javascript/docs/examples/account/create-account-recovery.md rename to app/sdks/javascript/docs/examples/teams/update-membership-status.md index c72cb2e55e..ab01bd36fb 100644 --- a/app/sdks/javascript/docs/examples/account/create-account-recovery.md +++ b/app/sdks/javascript/docs/examples/teams/update-membership-status.md @@ -3,7 +3,7 @@ let sdk = new Appwrite(); sdk ; -let promise = sdk.account.createAccountRecovery('email@example.com', 'https://example.com'); +let promise = sdk.teams.updateMembershipStatus('[TEAM_ID]', '[INVITE_ID]', '[USER_ID]', '[SECRET]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/javascript/docs/examples/teams/update-team-membership-status.md b/app/sdks/javascript/docs/examples/teams/update-team-membership-status.md deleted file mode 100644 index d4d83e9705..0000000000 --- a/app/sdks/javascript/docs/examples/teams/update-team-membership-status.md +++ /dev/null @@ -1,12 +0,0 @@ -let sdk = new Appwrite(); - -sdk -; - -let promise = sdk.teams.updateTeamMembershipStatus('[TEAM_ID]', '[INVITE_ID]', '[USER_ID]', '[SECRET]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/update-team.md b/app/sdks/javascript/docs/examples/teams/update-team.md deleted file mode 100644 index 2ec35ec906..0000000000 --- a/app/sdks/javascript/docs/examples/teams/update-team.md +++ /dev/null @@ -1,13 +0,0 @@ -let sdk = new Appwrite(); - -sdk - .setProject('') -; - -let promise = sdk.teams.updateTeam('[TEAM_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/javascript/docs/examples/teams/update.md b/app/sdks/javascript/docs/examples/teams/update.md new file mode 100644 index 0000000000..f2d028d896 --- /dev/null +++ b/app/sdks/javascript/docs/examples/teams/update.md @@ -0,0 +1,13 @@ +let sdk = new Appwrite(); + +sdk + .setProject('') +; + +let promise = sdk.teams.update('[TEAM_ID]', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/javascript/src/sdk.js b/app/sdks/javascript/src/sdk.js index cd3fe716c4..69927295fd 100644 --- a/app/sdks/javascript/src/sdk.js +++ b/app/sdks/javascript/src/sdk.js @@ -307,7 +307,7 @@ * @throws {Error} * @return {Promise} */ - getAccount: function() { + get: function() { let path = '/account'; let payload = {}; @@ -348,7 +348,7 @@ * @throws {Error} * @return {Promise} */ - createAccount: function(email, password, name = '') { + create: function(email, password, name = '') { if(email === undefined) { throw new Error('Missing required parameter: "email"'); } @@ -451,7 +451,7 @@ * @throws {Error} * @return {Promise} */ - getAccountLogs: function() { + getLogs: function() { let path = '/account/logs'; let payload = {}; @@ -471,7 +471,7 @@ * @throws {Error} * @return {Promise} */ - updateAccountName: function(name) { + updateName: function(name) { if(name === undefined) { throw new Error('Missing required parameter: "name"'); } @@ -501,7 +501,7 @@ * @throws {Error} * @return {Promise} */ - updateAccountPassword: function(password, oldPassword) { + updatePassword: function(password, oldPassword) { if(password === undefined) { throw new Error('Missing required parameter: "password"'); } @@ -536,7 +536,7 @@ * @throws {Error} * @return {Promise} */ - getAccountPrefs: function() { + getPrefs: function() { let path = '/account/prefs'; let payload = {}; @@ -590,7 +590,7 @@ * @throws {Error} * @return {Promise} */ - createAccountRecovery: function(email, url) { + createRecovery: function(email, url) { if(email === undefined) { throw new Error('Missing required parameter: "email"'); } @@ -637,7 +637,7 @@ * @throws {Error} * @return {Promise} */ - updateAccountRecovery: function(userId, secret, passwordA, passwordB) { + updateRecovery: function(userId, secret, passwordA, passwordB) { if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } @@ -689,7 +689,7 @@ * @throws {Error} * @return {Promise} */ - getAccountSessions: function() { + getSessions: function() { let path = '/account/sessions'; let payload = {}; @@ -723,7 +723,7 @@ * @throws {Error} * @return {Promise} */ - createAccountSession: function(email, password) { + createSession: function(email, password) { if(email === undefined) { throw new Error('Missing required parameter: "email"'); } @@ -759,7 +759,7 @@ * @throws {Error} * @return {Promise} */ - deleteAccountSessions: function() { + deleteSessions: function() { let path = '/account/sessions'; let payload = {}; @@ -780,7 +780,7 @@ * @throws {Error} * @return {Promise} */ - deleteAccountCurrentSession: function() { + deleteCurrentSession: function() { let path = '/account/sessions/current'; let payload = {}; @@ -805,7 +805,7 @@ * @throws {Error} * @return {Promise} */ - createAccountSessionOAuth: function(provider, success, failure) { + createOAuthSession: function(provider, success, failure) { if(provider === undefined) { throw new Error('Missing required parameter: "provider"'); } @@ -847,7 +847,7 @@ * @throws {Error} * @return {Promise} */ - deleteAccountSession: function(id) { + deleteSession: function(id) { if(id === undefined) { throw new Error('Missing required parameter: "id"'); } @@ -876,7 +876,7 @@ * @throws {Error} * @return {Promise} */ - updateAccountVerification: function(userId, secret, passwordB) { + updateVerification: function(userId, secret, passwordB) { if(userId === undefined) { throw new Error('Missing required parameter: "userId"'); } @@ -1172,7 +1172,7 @@ * @return {Promise} */ listCollections: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/database'; + let path = '/database/collections'; let payload = {}; @@ -1227,7 +1227,7 @@ throw new Error('Missing required parameter: "rules"'); } - let path = '/database'; + let path = '/database/collections'; let payload = {}; @@ -1268,7 +1268,7 @@ throw new Error('Missing required parameter: "collectionId"'); } - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); let payload = {}; @@ -1308,7 +1308,7 @@ throw new Error('Missing required parameter: "write"'); } - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); let payload = {}; @@ -1349,7 +1349,7 @@ throw new Error('Missing required parameter: "collectionId"'); } - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); let payload = {}; @@ -1385,7 +1385,7 @@ throw new Error('Missing required parameter: "collectionId"'); } - let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); let payload = {}; @@ -1463,7 +1463,7 @@ throw new Error('Missing required parameter: "write"'); } - let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); let payload = {}; @@ -1517,7 +1517,7 @@ throw new Error('Missing required parameter: "documentId"'); } - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); let payload = {}; @@ -1560,7 +1560,7 @@ throw new Error('Missing required parameter: "write"'); } - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); let payload = {}; @@ -1603,7 +1603,7 @@ throw new Error('Missing required parameter: "documentId"'); } - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); let payload = {}; @@ -1629,7 +1629,7 @@ * @throws {Error} * @return {Promise} */ - getLocale: function() { + get: function() { let path = '/locale'; let payload = {}; @@ -1758,7 +1758,7 @@ * @throws {Error} * @return {Promise} */ - listFiles: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + list: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { let path = '/storage/files'; let payload = {}; @@ -1798,7 +1798,7 @@ * @throws {Error} * @return {Promise} */ - createFile: function(file, read, write) { + create: function(file, read, write) { if(file === undefined) { throw new Error('Missing required parameter: "file"'); } @@ -1843,7 +1843,7 @@ * @throws {Error} * @return {Promise} */ - getFile: function(fileId) { + get: function(fileId) { if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } @@ -1870,7 +1870,7 @@ * @throws {Error} * @return {Promise} */ - updateFile: function(fileId, read, write) { + update: function(fileId, read, write) { if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } @@ -1911,7 +1911,7 @@ * @throws {Error} * @return {Promise} */ - deleteFile: function(fileId) { + delete: function(fileId) { if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } @@ -1937,7 +1937,7 @@ * @throws {Error} * @return {Promise} */ - getFileDownload: function(fileId) { + getDownload: function(fileId) { if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } @@ -1969,7 +1969,7 @@ * @throws {Error} * @return {Promise} */ - getFilePreview: function(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { + getPreview: function(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } @@ -2015,7 +2015,7 @@ * @throws {Error} * @return {Promise} */ - getFileView: function(fileId, as = '') { + getView: function(fileId, as = '') { if(fileId === undefined) { throw new Error('Missing required parameter: "fileId"'); } @@ -2051,7 +2051,7 @@ * @throws {Error} * @return {Promise} */ - listTeams: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + list: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { let path = '/teams'; let payload = {}; @@ -2091,7 +2091,7 @@ * @throws {Error} * @return {Promise} */ - createTeam: function(name, roles = ["owner"]) { + create: function(name, roles = ["owner"]) { if(name === undefined) { throw new Error('Missing required parameter: "name"'); } @@ -2124,7 +2124,7 @@ * @throws {Error} * @return {Promise} */ - getTeam: function(teamId) { + get: function(teamId) { if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } @@ -2150,7 +2150,7 @@ * @throws {Error} * @return {Promise} */ - updateTeam: function(teamId, name) { + update: function(teamId, name) { if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } @@ -2183,7 +2183,7 @@ * @throws {Error} * @return {Promise} */ - deleteTeam: function(teamId) { + delete: function(teamId) { if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } @@ -2208,7 +2208,7 @@ * @throws {Error} * @return {Promise} */ - getTeamMemberships: function(teamId) { + getMemberships: function(teamId) { if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } @@ -2248,7 +2248,7 @@ * @throws {Error} * @return {Promise} */ - createTeamMembership: function(teamId, email, roles, url, name = '') { + createMembership: function(teamId, email, roles, url, name = '') { if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } @@ -2303,7 +2303,7 @@ * @throws {Error} * @return {Promise} */ - deleteTeamMembership: function(teamId, inviteId) { + deleteMembership: function(teamId, inviteId) { if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } @@ -2348,7 +2348,7 @@ * @throws {Error} * @return {null} */ - updateTeamMembershipStatus: function(teamId, inviteId, userId, secret) { + updateMembershipStatus: function(teamId, inviteId, userId, secret) { if(teamId === undefined) { throw new Error('Missing required parameter: "teamId"'); } diff --git a/app/sdks/javascript/src/sdk.min.js b/app/sdks/javascript/src/sdk.min.js index 223eb1fcd2..633f0f4684 100644 --- a/app/sdks/javascript/src/sdk.min.js +++ b/app/sdks/javascript/src/sdk.min.js @@ -11,7 +11,7 @@ request.setRequestHeader(key,headers[key])}} request.onload=function(){if(4===request.readyState&&399>=request.status){let data=request.response;let contentType=this.getResponseHeader('content-type')||'';contentType=contentType.substring(0,contentType.indexOf(';'));switch(contentType){case 'application/json':data=JSON.parse(data);break} resolve(data)}else{reject(new Error(request.statusText))}};if(progress){request.addEventListener('progress',progress);request.upload.addEventListener('progress',progress,!1)} request.onerror=function(){reject(new Error("Network Error"))};request.send(params)})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{})},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress)},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress)},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress)},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress)},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let iframe=function(method,url,params){let form=document.createElement('form');form.setAttribute('method',method);form.setAttribute('action',config.endpoint+url);for(let key in params){if(params.hasOwnProperty(key)){let hiddenField=document.createElement("input");hiddenField.setAttribute("type","hidden");hiddenField.setAttribute("name",key);hiddenField.setAttribute("value",params[key]);form.appendChild(hiddenField)}} -document.body.appendChild(form);return form.submit()};let account={getAccount:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload)},createAccount:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} +document.body.appendChild(form);return form.submit()};let account={get:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload)},create:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"')} if(password===undefined){throw new Error('Missing required parameter: "password"')} let path='/account';let payload={};if(email){payload.email=email} if(password){payload.password=password} @@ -20,19 +20,19 @@ return http.post(path,{'content-type':'application/json',},payload)},delete:func if(password===undefined){throw new Error('Missing required parameter: "password"')} let path='/account/email';let payload={};if(email){payload.email=email} if(password){payload.password=password} -return http.patch(path,{'content-type':'application/json',},payload)},getAccountLogs:function(){let path='/account/logs';let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateAccountName:function(name){if(name===undefined){throw new Error('Missing required parameter: "name"')} +return http.patch(path,{'content-type':'application/json',},payload)},getLogs:function(){let path='/account/logs';let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateName:function(name){if(name===undefined){throw new Error('Missing required parameter: "name"')} let path='/account/name';let payload={};if(name){payload.name=name} -return http.patch(path,{'content-type':'application/json',},payload)},updateAccountPassword:function(password,oldPassword){if(password===undefined){throw new Error('Missing required parameter: "password"')} +return http.patch(path,{'content-type':'application/json',},payload)},updatePassword:function(password,oldPassword){if(password===undefined){throw new Error('Missing required parameter: "password"')} if(oldPassword===undefined){throw new Error('Missing required parameter: "oldPassword"')} let path='/account/password';let payload={};if(password){payload.password=password} if(oldPassword){payload['old-password']=oldPassword} -return http.patch(path,{'content-type':'application/json',},payload)},getAccountPrefs:function(){let path='/account/prefs';let payload={};return http.get(path,{'content-type':'application/json',},payload)},updatePrefs:function(prefs){if(prefs===undefined){throw new Error('Missing required parameter: "prefs"')} +return http.patch(path,{'content-type':'application/json',},payload)},getPrefs:function(){let path='/account/prefs';let payload={};return http.get(path,{'content-type':'application/json',},payload)},updatePrefs:function(prefs){if(prefs===undefined){throw new Error('Missing required parameter: "prefs"')} let path='/account/prefs';let payload={};if(prefs){payload.prefs=prefs} -return http.patch(path,{'content-type':'application/json',},payload)},createAccountRecovery:function(email,url){if(email===undefined){throw new Error('Missing required parameter: "email"')} +return http.patch(path,{'content-type':'application/json',},payload)},createRecovery:function(email,url){if(email===undefined){throw new Error('Missing required parameter: "email"')} if(url===undefined){throw new Error('Missing required parameter: "url"')} let path='/account/recovery';let payload={};if(email){payload.email=email} if(url){payload.url=url} -return http.post(path,{'content-type':'application/json',},payload)},updateAccountRecovery:function(userId,secret,passwordA,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +return http.post(path,{'content-type':'application/json',},payload)},updateRecovery:function(userId,secret,passwordA,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} if(secret===undefined){throw new Error('Missing required parameter: "secret"')} if(passwordA===undefined){throw new Error('Missing required parameter: "passwordA"')} if(passwordB===undefined){throw new Error('Missing required parameter: "passwordB"')} @@ -40,17 +40,17 @@ let path='/account/recovery';let payload={};if(userId){payload.userId=userId} if(secret){payload.secret=secret} if(passwordA){payload['password-a']=passwordA} if(passwordB){payload['password-b']=passwordB} -return http.put(path,{'content-type':'application/json',},payload)},getAccountSessions:function(){let path='/account/sessions';let payload={};return http.get(path,{'content-type':'application/json',},payload)},createAccountSession:function(email,password){if(email===undefined){throw new Error('Missing required parameter: "email"')} +return http.put(path,{'content-type':'application/json',},payload)},getSessions:function(){let path='/account/sessions';let payload={};return http.get(path,{'content-type':'application/json',},payload)},createSession:function(email,password){if(email===undefined){throw new Error('Missing required parameter: "email"')} if(password===undefined){throw new Error('Missing required parameter: "password"')} let path='/account/sessions';let payload={};if(email){payload.email=email} if(password){payload.password=password} -return http.post(path,{'content-type':'application/json',},payload)},deleteAccountSessions:function(){let path='/account/sessions';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},deleteAccountCurrentSession:function(){let path='/account/sessions/current';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createAccountSessionOAuth:function(provider,success,failure){if(provider===undefined){throw new Error('Missing required parameter: "provider"')} +return http.post(path,{'content-type':'application/json',},payload)},deleteSessions:function(){let path='/account/sessions';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},deleteCurrentSession:function(){let path='/account/sessions/current';let payload={};return http.delete(path,{'content-type':'application/json',},payload)},createOAuthSession:function(provider,success,failure){if(provider===undefined){throw new Error('Missing required parameter: "provider"')} if(success===undefined){throw new Error('Missing required parameter: "success"')} if(failure===undefined){throw new Error('Missing required parameter: "failure"')} let path='/account/sessions/oauth/{provider}'.replace(new RegExp('{provider}','g'),provider);let payload={};if(success){payload.success=success} if(failure){payload.failure=failure} -return http.get(path,{'content-type':'application/json',},payload)},deleteAccountSession:function(id){if(id===undefined){throw new Error('Missing required parameter: "id"')} -let path='/account/sessions/{id}'.replace(new RegExp('{id}','g'),id);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateAccountVerification:function(userId,secret,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} +return http.get(path,{'content-type':'application/json',},payload)},deleteSession:function(id){if(id===undefined){throw new Error('Missing required parameter: "id"')} +let path='/account/sessions/{id}'.replace(new RegExp('{id}','g'),id);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateVerification:function(userId,secret,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"')} if(secret===undefined){throw new Error('Missing required parameter: "secret"')} if(passwordB===undefined){throw new Error('Missing required parameter: "passwordB"')} let path='/account/verification';let payload={};if(userId){payload.userId=userId} @@ -79,7 +79,7 @@ let path='/avatars/qr';let payload={};if(text){payload.text=text} if(size){payload.size=size} if(margin){payload.margin=margin} if(download){payload.download=download} -return http.get(path,{'content-type':'application/json',},payload)}};let database={listCollections:function(search='',limit=25,offset=0,orderType='ASC'){let path='/database';let payload={};if(search){payload.search=search} +return http.get(path,{'content-type':'application/json',},payload)}};let database={listCollections:function(search='',limit=25,offset=0,orderType='ASC'){let path='/database/collections';let payload={};if(search){payload.search=search} if(limit){payload.limit=limit} if(offset){payload.offset=offset} if(orderType){payload.orderType=orderType} @@ -87,22 +87,22 @@ return http.get(path,{'content-type':'application/json',},payload)},createCollec if(read===undefined){throw new Error('Missing required parameter: "read"')} if(write===undefined){throw new Error('Missing required parameter: "write"')} if(rules===undefined){throw new Error('Missing required parameter: "rules"')} -let path='/database';let payload={};if(name){payload.name=name} +let path='/database/collections';let payload={};if(name){payload.name=name} if(read){payload.read=read} if(write){payload.write=write} if(rules){payload.rules=rules} return http.post(path,{'content-type':'application/json',},payload)},getCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateCollection:function(collectionId,name,read,write,rules=[]){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +let path='/database/collections/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateCollection:function(collectionId,name,read,write,rules=[]){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} if(name===undefined){throw new Error('Missing required parameter: "name"')} if(read===undefined){throw new Error('Missing required parameter: "read"')} if(write===undefined){throw new Error('Missing required parameter: "write"')} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(name){payload.name=name} +let path='/database/collections/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(name){payload.name=name} if(read){payload.read=read} if(write){payload.write=write} if(rules){payload.rules=rules} return http.put(path,{'content-type':'application/json',},payload)},deleteCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listDocuments:function(collectionId,filters=[],offset=0,limit=50,orderField='$uid',orderType='ASC',orderCast='string',search='',first=0,last=0){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} -let path='/database/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(filters){payload.filters=filters} +let path='/database/collections/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},listDocuments:function(collectionId,filters=[],offset=0,limit=50,orderField='$uid',orderType='ASC',orderCast='string',search='',first=0,last=0){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +let path='/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(filters){payload.filters=filters} if(offset){payload.offset=offset} if(limit){payload.limit=limit} if(orderField){payload['order-field']=orderField} @@ -115,7 +115,7 @@ return http.get(path,{'content-type':'application/json',},payload)},createDocume if(data===undefined){throw new Error('Missing required parameter: "data"')} if(read===undefined){throw new Error('Missing required parameter: "read"')} if(write===undefined){throw new Error('Missing required parameter: "write"')} -let path='/database/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(data){payload.data=data} +let path='/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(data){payload.data=data} if(read){payload.read=read} if(write){payload.write=write} if(parentDocument){payload.parentDocument=parentDocument} @@ -123,56 +123,56 @@ if(parentProperty){payload.parentProperty=parentProperty} if(parentPropertyType){payload.parentPropertyType=parentPropertyType} return http.post(path,{'content-type':'application/json',},payload)},getDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateDocument:function(collectionId,documentId,data,read,write){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} +let path='/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateDocument:function(collectionId,documentId,data,read,write){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} if(data===undefined){throw new Error('Missing required parameter: "data"')} if(read===undefined){throw new Error('Missing required parameter: "read"')} if(write===undefined){throw new Error('Missing required parameter: "write"')} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};if(data){payload.data=data} +let path='/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};if(data){payload.data=data} if(read){payload.read=read} if(write){payload.write=write} return http.patch(path,{'content-type':'application/json',},payload)},deleteDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"')} if(documentId===undefined){throw new Error('Missing required parameter: "documentId"')} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let locale={getLocale:function(){let path='/locale';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getContinents:function(){let path='/locale/continents';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountries:function(){let path='/locale/countries';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesEU:function(){let path='/locale/countries/eu';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesPhones:function(){let path='/locale/countries/phones';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCurrencies:function(){let path='/locale/currencies';let payload={};return http.get(path,{'content-type':'application/json',},payload)}};let storage={listFiles:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';let payload={};if(search){payload.search=search} +let path='/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)}};let locale={get:function(){let path='/locale';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getContinents:function(){let path='/locale/continents';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountries:function(){let path='/locale/countries';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesEU:function(){let path='/locale/countries/eu';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCountriesPhones:function(){let path='/locale/countries/phones';let payload={};return http.get(path,{'content-type':'application/json',},payload)},getCurrencies:function(){let path='/locale/currencies';let payload={};return http.get(path,{'content-type':'application/json',},payload)}};let storage={list:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';let payload={};if(search){payload.search=search} if(limit){payload.limit=limit} if(offset){payload.offset=offset} if(orderType){payload.orderType=orderType} -return http.get(path,{'content-type':'application/json',},payload)},createFile:function(file,read,write){if(file===undefined){throw new Error('Missing required parameter: "file"')} +return http.get(path,{'content-type':'application/json',},payload)},create:function(file,read,write){if(file===undefined){throw new Error('Missing required parameter: "file"')} if(read===undefined){throw new Error('Missing required parameter: "read"')} if(write===undefined){throw new Error('Missing required parameter: "write"')} let path='/storage/files';let payload={};if(file){payload.file=file} if(read){payload.read=read} if(write){payload.write=write} -return http.post(path,{'content-type':'multipart/form-data',},payload)},getFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateFile:function(fileId,read,write){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +return http.post(path,{'content-type':'multipart/form-data',},payload)},get:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},update:function(fileId,read,write){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} if(read===undefined){throw new Error('Missing required parameter: "read"')} if(write===undefined){throw new Error('Missing required parameter: "write"')} let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(read){payload.read=read} if(write){payload.write=write} -return http.put(path,{'content-type':'application/json',},payload)},deleteFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getFileDownload:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} -let path='/storage/files/{fileId}/download'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getFilePreview:function(fileId,width=0,height=0,quality=100,background='',output=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +return http.put(path,{'content-type':'application/json',},payload)},delete:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getDownload:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +let path='/storage/files/{fileId}/download'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},getPreview:function(fileId,width=0,height=0,quality=100,background='',output=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} let path='/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(width){payload.width=width} if(height){payload.height=height} if(quality){payload.quality=quality} if(background){payload.background=background} if(output){payload.output=output} -return http.get(path,{'content-type':'application/json',},payload)},getFileView:function(fileId,as=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} +return http.get(path,{'content-type':'application/json',},payload)},getView:function(fileId,as=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"')} let path='/storage/files/{fileId}/view'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(as){payload.as=as} -return http.get(path,{'content-type':'application/json',},payload)}};let teams={listTeams:function(search='',limit=25,offset=0,orderType='ASC'){let path='/teams';let payload={};if(search){payload.search=search} +return http.get(path,{'content-type':'application/json',},payload)}};let teams={list:function(search='',limit=25,offset=0,orderType='ASC'){let path='/teams';let payload={};if(search){payload.search=search} if(limit){payload.limit=limit} if(offset){payload.offset=offset} if(orderType){payload.orderType=orderType} -return http.get(path,{'content-type':'application/json',},payload)},createTeam:function(name,roles=["owner"]){if(name===undefined){throw new Error('Missing required parameter: "name"')} +return http.get(path,{'content-type':'application/json',},payload)},create:function(name,roles=["owner"]){if(name===undefined){throw new Error('Missing required parameter: "name"')} let path='/teams';let payload={};if(name){payload.name=name} if(roles){payload.roles=roles} -return http.post(path,{'content-type':'application/json',},payload)},getTeam:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},updateTeam:function(teamId,name){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +return http.post(path,{'content-type':'application/json',},payload)},get:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},update:function(teamId,name){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} if(name===undefined){throw new Error('Missing required parameter: "name"')} let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};if(name){payload.name=name} -return http.put(path,{'content-type':'application/json',},payload)},deleteTeam:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getTeamMemberships:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} -let path='/teams/{teamId}/memberships'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createTeamMembership:function(teamId,email,roles,url,name=''){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +return http.put(path,{'content-type':'application/json',},payload)},delete:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},getMemberships:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +let path='/teams/{teamId}/memberships'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload)},createMembership:function(teamId,email,roles,url,name=''){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} if(email===undefined){throw new Error('Missing required parameter: "email"')} if(roles===undefined){throw new Error('Missing required parameter: "roles"')} if(url===undefined){throw new Error('Missing required parameter: "url"')} @@ -180,9 +180,9 @@ let path='/teams/{teamId}/memberships'.replace(new RegExp('{teamId}','g'),teamId if(name){payload.name=name} if(roles){payload.roles=roles} if(url){payload.url=url} -return http.post(path,{'content-type':'application/json',},payload)},deleteTeamMembership:function(teamId,inviteId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +return http.post(path,{'content-type':'application/json',},payload)},deleteMembership:function(teamId,inviteId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"')} -let path='/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateTeamMembershipStatus:function(teamId,inviteId,userId,secret){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} +let path='/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};return http.delete(path,{'content-type':'application/json',},payload)},updateMembershipStatus:function(teamId,inviteId,userId,secret){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"')} if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"')} if(userId===undefined){throw new Error('Missing required parameter: "userId"')} if(secret===undefined){throw new Error('Missing required parameter: "secret"')} diff --git a/app/sdks/nodejs/docs/examples/locale/get-locale.md b/app/sdks/nodejs/docs/examples/locale/get.md similarity index 89% rename from app/sdks/nodejs/docs/examples/locale/get-locale.md rename to app/sdks/nodejs/docs/examples/locale/get.md index 57e5d69e78..08c18792f6 100644 --- a/app/sdks/nodejs/docs/examples/locale/get-locale.md +++ b/app/sdks/nodejs/docs/examples/locale/get.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = locale.getLocale(); +let promise = locale.get(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/storage/create-file.md b/app/sdks/nodejs/docs/examples/storage/create-file.md deleted file mode 100644 index f0c9d4c5a8..0000000000 --- a/app/sdks/nodejs/docs/examples/storage/create-file.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.createFile(document.getElementById('uploader').files[0], [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-download.md b/app/sdks/nodejs/docs/examples/storage/create.md similarity index 76% rename from app/sdks/nodejs/docs/examples/storage/get-file-download.md rename to app/sdks/nodejs/docs/examples/storage/create.md index 2967170695..cdb7fe2c6f 100644 --- a/app/sdks/nodejs/docs/examples/storage/get-file-download.md +++ b/app/sdks/nodejs/docs/examples/storage/create.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = storage.getFileDownload('[FILE_ID]'); +let promise = storage.create(document.getElementById('uploader').files[0], [], []); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/storage/get-file.md b/app/sdks/nodejs/docs/examples/storage/delete.md similarity index 86% rename from app/sdks/nodejs/docs/examples/storage/get-file.md rename to app/sdks/nodejs/docs/examples/storage/delete.md index a1a3baf009..593b55ed34 100644 --- a/app/sdks/nodejs/docs/examples/storage/get-file.md +++ b/app/sdks/nodejs/docs/examples/storage/delete.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = storage.getFile('[FILE_ID]'); +let promise = storage.delete('[FILE_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-view.md b/app/sdks/nodejs/docs/examples/storage/get-download.md similarity index 85% rename from app/sdks/nodejs/docs/examples/storage/get-file-view.md rename to app/sdks/nodejs/docs/examples/storage/get-download.md index a3074fbed1..38883b83aa 100644 --- a/app/sdks/nodejs/docs/examples/storage/get-file-view.md +++ b/app/sdks/nodejs/docs/examples/storage/get-download.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = storage.getFileView('[FILE_ID]'); +let promise = storage.getDownload('[FILE_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/storage/delete-file.md b/app/sdks/nodejs/docs/examples/storage/get-preview.md similarity index 85% rename from app/sdks/nodejs/docs/examples/storage/delete-file.md rename to app/sdks/nodejs/docs/examples/storage/get-preview.md index 9e8d13880f..8cea246614 100644 --- a/app/sdks/nodejs/docs/examples/storage/delete-file.md +++ b/app/sdks/nodejs/docs/examples/storage/get-preview.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = storage.deleteFile('[FILE_ID]'); +let promise = storage.getPreview('[FILE_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/storage/get-view.md b/app/sdks/nodejs/docs/examples/storage/get-view.md new file mode 100644 index 0000000000..ce10394fda --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/get-view.md @@ -0,0 +1,19 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') + .setKey('') +; + +let promise = storage.getView('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/get.md b/app/sdks/nodejs/docs/examples/storage/get.md new file mode 100644 index 0000000000..0014cfa389 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/storage/get.md @@ -0,0 +1,19 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let storage = new sdk.Storage(client); + +client + .setProject('') + .setKey('') +; + +let promise = storage.get('[FILE_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/list-files.md b/app/sdks/nodejs/docs/examples/storage/list.md similarity index 88% rename from app/sdks/nodejs/docs/examples/storage/list-files.md rename to app/sdks/nodejs/docs/examples/storage/list.md index 59a331a2b5..acaf8194e9 100644 --- a/app/sdks/nodejs/docs/examples/storage/list-files.md +++ b/app/sdks/nodejs/docs/examples/storage/list.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = storage.listFiles(); +let promise = storage.list(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/storage/update-file.md b/app/sdks/nodejs/docs/examples/storage/update-file.md deleted file mode 100644 index 3741785996..0000000000 --- a/app/sdks/nodejs/docs/examples/storage/update-file.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let storage = new sdk.Storage(client); - -client - .setProject('') - .setKey('') -; - -let promise = storage.updateFile('[FILE_ID]', [], []); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/storage/get-file-preview.md b/app/sdks/nodejs/docs/examples/storage/update.md similarity index 84% rename from app/sdks/nodejs/docs/examples/storage/get-file-preview.md rename to app/sdks/nodejs/docs/examples/storage/update.md index 0c09e8ca8d..055c1d0b90 100644 --- a/app/sdks/nodejs/docs/examples/storage/get-file-preview.md +++ b/app/sdks/nodejs/docs/examples/storage/update.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = storage.getFilePreview('[FILE_ID]'); +let promise = storage.update('[FILE_ID]', [], []); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md b/app/sdks/nodejs/docs/examples/teams/create-membership.md similarity index 73% rename from app/sdks/nodejs/docs/examples/teams/delete-team-membership.md rename to app/sdks/nodejs/docs/examples/teams/create-membership.md index 435a65026f..c949448fb3 100644 --- a/app/sdks/nodejs/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/nodejs/docs/examples/teams/create-membership.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = teams.deleteTeamMembership('[TEAM_ID]', '[INVITE_ID]'); +let promise = teams.createMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/teams/create-team-membership.md b/app/sdks/nodejs/docs/examples/teams/create-team-membership.md deleted file mode 100644 index 7a2c9be298..0000000000 --- a/app/sdks/nodejs/docs/examples/teams/create-team-membership.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.createTeamMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/get-team.md b/app/sdks/nodejs/docs/examples/teams/create.md similarity index 86% rename from app/sdks/nodejs/docs/examples/teams/get-team.md rename to app/sdks/nodejs/docs/examples/teams/create.md index b716b7ea01..2bee16c282 100644 --- a/app/sdks/nodejs/docs/examples/teams/get-team.md +++ b/app/sdks/nodejs/docs/examples/teams/create.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = teams.getTeam('[TEAM_ID]'); +let promise = teams.create('[NAME]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md b/app/sdks/nodejs/docs/examples/teams/delete-membership.md similarity index 80% rename from app/sdks/nodejs/docs/examples/teams/get-team-memberships.md rename to app/sdks/nodejs/docs/examples/teams/delete-membership.md index 038fd4e2a0..c5867ac15c 100644 --- a/app/sdks/nodejs/docs/examples/teams/get-team-memberships.md +++ b/app/sdks/nodejs/docs/examples/teams/delete-membership.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = teams.getTeamMemberships('[TEAM_ID]'); +let promise = teams.deleteMembership('[TEAM_ID]', '[INVITE_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/teams/create-team.md b/app/sdks/nodejs/docs/examples/teams/delete.md similarity index 86% rename from app/sdks/nodejs/docs/examples/teams/create-team.md rename to app/sdks/nodejs/docs/examples/teams/delete.md index 73dd77ecc5..5d322e9a14 100644 --- a/app/sdks/nodejs/docs/examples/teams/create-team.md +++ b/app/sdks/nodejs/docs/examples/teams/delete.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = teams.createTeam('[NAME]'); +let promise = teams.delete('[TEAM_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/teams/get-memberships.md b/app/sdks/nodejs/docs/examples/teams/get-memberships.md new file mode 100644 index 0000000000..332a3d3e68 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/get-memberships.md @@ -0,0 +1,19 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') + .setKey('') +; + +let promise = teams.getMemberships('[TEAM_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/delete-team.md b/app/sdks/nodejs/docs/examples/teams/get.md similarity index 86% rename from app/sdks/nodejs/docs/examples/teams/delete-team.md rename to app/sdks/nodejs/docs/examples/teams/get.md index 0204d40c98..026a9993eb 100644 --- a/app/sdks/nodejs/docs/examples/teams/delete-team.md +++ b/app/sdks/nodejs/docs/examples/teams/get.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = teams.deleteTeam('[TEAM_ID]'); +let promise = teams.get('[TEAM_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/teams/list-teams.md b/app/sdks/nodejs/docs/examples/teams/list.md similarity index 89% rename from app/sdks/nodejs/docs/examples/teams/list-teams.md rename to app/sdks/nodejs/docs/examples/teams/list.md index 609c708753..71209d0d8f 100644 --- a/app/sdks/nodejs/docs/examples/teams/list-teams.md +++ b/app/sdks/nodejs/docs/examples/teams/list.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = teams.listTeams(); +let promise = teams.list(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/teams/update-team.md b/app/sdks/nodejs/docs/examples/teams/update-team.md deleted file mode 100644 index 6afb377091..0000000000 --- a/app/sdks/nodejs/docs/examples/teams/update-team.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let teams = new sdk.Teams(client); - -client - .setProject('') - .setKey('') -; - -let promise = teams.updateTeam('[TEAM_ID]', '[NAME]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/teams/update.md b/app/sdks/nodejs/docs/examples/teams/update.md new file mode 100644 index 0000000000..ccc1002501 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/teams/update.md @@ -0,0 +1,19 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let teams = new sdk.Teams(client); + +client + .setProject('') + .setKey('') +; + +let promise = teams.update('[TEAM_ID]', '[NAME]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/create-user.md b/app/sdks/nodejs/docs/examples/users/create-user.md deleted file mode 100644 index d07ab1eabf..0000000000 --- a/app/sdks/nodejs/docs/examples/users/create-user.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.createUser('email@example.com', 'password'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md b/app/sdks/nodejs/docs/examples/users/create.md similarity index 81% rename from app/sdks/nodejs/docs/examples/users/delete-user-sessions.md rename to app/sdks/nodejs/docs/examples/users/create.md index 33f803298d..ba4c7976f3 100644 --- a/app/sdks/nodejs/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/nodejs/docs/examples/users/create.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = users.deleteUserSessions('[USER_ID]'); +let promise = users.create('email@example.com', 'password'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/users/delete-session.md b/app/sdks/nodejs/docs/examples/users/delete-session.md new file mode 100644 index 0000000000..8fe3fbc082 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/delete-session.md @@ -0,0 +1,19 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') + .setKey('') +; + +let promise = users.deleteSession('[USER_ID]', '[SESSION_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/delete-sessions.md b/app/sdks/nodejs/docs/examples/users/delete-sessions.md new file mode 100644 index 0000000000..25a4e073e9 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/delete-sessions.md @@ -0,0 +1,19 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') + .setKey('') +; + +let promise = users.deleteSessions('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/delete-user-session.md b/app/sdks/nodejs/docs/examples/users/delete-user-session.md deleted file mode 100644 index dab704e2d4..0000000000 --- a/app/sdks/nodejs/docs/examples/users/delete-user-session.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.deleteUserSession('[USER_ID]', '[SESSION_ID]'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/get-user.md b/app/sdks/nodejs/docs/examples/users/get-logs.md similarity index 86% rename from app/sdks/nodejs/docs/examples/users/get-user.md rename to app/sdks/nodejs/docs/examples/users/get-logs.md index 96676c0196..a6edd2c0c5 100644 --- a/app/sdks/nodejs/docs/examples/users/get-user.md +++ b/app/sdks/nodejs/docs/examples/users/get-logs.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = users.getUser('[USER_ID]'); +let promise = users.getLogs('[USER_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/users/get-user-logs.md b/app/sdks/nodejs/docs/examples/users/get-prefs.md similarity index 85% rename from app/sdks/nodejs/docs/examples/users/get-user-logs.md rename to app/sdks/nodejs/docs/examples/users/get-prefs.md index 85d0a125a0..9842e37726 100644 --- a/app/sdks/nodejs/docs/examples/users/get-user-logs.md +++ b/app/sdks/nodejs/docs/examples/users/get-prefs.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = users.getUserLogs('[USER_ID]'); +let promise = users.getPrefs('[USER_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/users/get-user-prefs.md b/app/sdks/nodejs/docs/examples/users/get-sessions.md similarity index 85% rename from app/sdks/nodejs/docs/examples/users/get-user-prefs.md rename to app/sdks/nodejs/docs/examples/users/get-sessions.md index 46d959e1cb..cb174f7154 100644 --- a/app/sdks/nodejs/docs/examples/users/get-user-prefs.md +++ b/app/sdks/nodejs/docs/examples/users/get-sessions.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = users.getUserPrefs('[USER_ID]'); +let promise = users.getSessions('[USER_ID]'); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/users/get.md b/app/sdks/nodejs/docs/examples/users/get.md new file mode 100644 index 0000000000..075a4433a6 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/get.md @@ -0,0 +1,19 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') + .setKey('') +; + +let promise = users.get('[USER_ID]'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/list-users.md b/app/sdks/nodejs/docs/examples/users/list.md similarity index 89% rename from app/sdks/nodejs/docs/examples/users/list-users.md rename to app/sdks/nodejs/docs/examples/users/list.md index 455e42db4d..b506fa3ff5 100644 --- a/app/sdks/nodejs/docs/examples/users/list-users.md +++ b/app/sdks/nodejs/docs/examples/users/list.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = users.listUsers(); +let promise = users.list(); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/users/get-user-sessions.md b/app/sdks/nodejs/docs/examples/users/update-prefs.md similarity index 84% rename from app/sdks/nodejs/docs/examples/users/get-user-sessions.md rename to app/sdks/nodejs/docs/examples/users/update-prefs.md index b3dfe28405..f2bfb26bb2 100644 --- a/app/sdks/nodejs/docs/examples/users/get-user-sessions.md +++ b/app/sdks/nodejs/docs/examples/users/update-prefs.md @@ -10,7 +10,7 @@ client .setKey('') ; -let promise = users.getUserSessions('[USER_ID]'); +let promise = users.updatePrefs('[USER_ID]', ''); promise.then(function (response) { console.log(response); diff --git a/app/sdks/nodejs/docs/examples/users/update-status.md b/app/sdks/nodejs/docs/examples/users/update-status.md new file mode 100644 index 0000000000..45a23690d8 --- /dev/null +++ b/app/sdks/nodejs/docs/examples/users/update-status.md @@ -0,0 +1,19 @@ +const sdk = require('node-appwrite'); + +// Init SDK +let client = new sdk.Client(); + +let users = new sdk.Users(client); + +client + .setProject('') + .setKey('') +; + +let promise = users.updateStatus('[USER_ID]', '1'); + +promise.then(function (response) { + console.log(response); +}, function (error) { + console.log(error); +}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/update-user-prefs.md b/app/sdks/nodejs/docs/examples/users/update-user-prefs.md deleted file mode 100644 index 8788ac7dba..0000000000 --- a/app/sdks/nodejs/docs/examples/users/update-user-prefs.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.updateUserPrefs('[USER_ID]', ''); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/docs/examples/users/update-user-status.md b/app/sdks/nodejs/docs/examples/users/update-user-status.md deleted file mode 100644 index 858833a50c..0000000000 --- a/app/sdks/nodejs/docs/examples/users/update-user-status.md +++ /dev/null @@ -1,19 +0,0 @@ -const sdk = require('node-appwrite'); - -// Init SDK -let client = new sdk.Client(); - -let users = new sdk.Users(client); - -client - .setProject('') - .setKey('') -; - -let promise = users.updateUserStatus('[USER_ID]', '1'); - -promise.then(function (response) { - console.log(response); -}, function (error) { - console.log(error); -}); \ No newline at end of file diff --git a/app/sdks/nodejs/lib/services/database.js b/app/sdks/nodejs/lib/services/database.js index 4287484038..78c5e78f4b 100644 --- a/app/sdks/nodejs/lib/services/database.js +++ b/app/sdks/nodejs/lib/services/database.js @@ -18,7 +18,7 @@ class Database extends Service { * @return {} */ async listCollections(search = '', limit = 25, offset = 0, orderType = 'ASC') { - let path = '/database'; + let path = '/database/collections'; return await this.client.call('get', path, { 'content-type': 'application/json', @@ -44,7 +44,7 @@ class Database extends Service { * @return {} */ async createCollection(name, read, write, rules) { - let path = '/database'; + let path = '/database/collections'; return await this.client.call('post', path, { 'content-type': 'application/json', @@ -68,7 +68,7 @@ class Database extends Service { * @return {} */ async getCollection(collectionId) { - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); return await this.client.call('get', path, { 'content-type': 'application/json', @@ -91,7 +91,7 @@ class Database extends Service { * @return {} */ async updateCollection(collectionId, name, read, write, rules = []) { - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); return await this.client.call('put', path, { 'content-type': 'application/json', @@ -115,7 +115,7 @@ class Database extends Service { * @return {} */ async deleteCollection(collectionId) { - let path = '/database/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); return await this.client.call('delete', path, { 'content-type': 'application/json', @@ -146,7 +146,7 @@ class Database extends Service { * @return {} */ async listDocuments(collectionId, filters = [], offset = 0, limit = 50, orderField = '$uid', orderType = 'ASC', orderCast = 'string', search = '', first = 0, last = 0) { - let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); return await this.client.call('get', path, { 'content-type': 'application/json', @@ -180,7 +180,7 @@ class Database extends Service { * @return {} */ async createDocument(collectionId, data, read, write, parentDocument = '', parentProperty = '', parentPropertyType = 'assign') { - let path = '/database/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + let path = '/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); return await this.client.call('post', path, { 'content-type': 'application/json', @@ -207,7 +207,7 @@ class Database extends Service { * @return {} */ async getDocument(collectionId, documentId) { - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); return await this.client.call('get', path, { 'content-type': 'application/json', @@ -228,7 +228,7 @@ class Database extends Service { * @return {} */ async updateDocument(collectionId, documentId, data, read, write) { - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); return await this.client.call('patch', path, { 'content-type': 'application/json', @@ -253,7 +253,7 @@ class Database extends Service { * @return {} */ async deleteDocument(collectionId, documentId) { - let path = '/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); return await this.client.call('delete', path, { 'content-type': 'application/json', diff --git a/app/sdks/nodejs/lib/services/locale.js b/app/sdks/nodejs/lib/services/locale.js index 2b5f3f2b2f..1a89ba7dd9 100644 --- a/app/sdks/nodejs/lib/services/locale.js +++ b/app/sdks/nodejs/lib/services/locale.js @@ -15,7 +15,7 @@ class Locale extends Service { * @throws Exception * @return {} */ - async getLocale() { + async get() { let path = '/locale'; return await this.client.call('get', path, { diff --git a/app/sdks/nodejs/lib/services/storage.js b/app/sdks/nodejs/lib/services/storage.js index 7237ccfc6f..7db394d783 100644 --- a/app/sdks/nodejs/lib/services/storage.js +++ b/app/sdks/nodejs/lib/services/storage.js @@ -16,7 +16,7 @@ class Storage extends Service { * @throws Exception * @return {} */ - async listFiles(search = '', limit = 25, offset = 0, orderType = 'ASC') { + async list(search = '', limit = 25, offset = 0, orderType = 'ASC') { let path = '/storage/files'; return await this.client.call('get', path, { @@ -43,7 +43,7 @@ class Storage extends Service { * @throws Exception * @return {} */ - async createFile(file, read, write) { + async create(file, read, write) { let path = '/storage/files'; return await this.client.call('post', path, { @@ -66,7 +66,7 @@ class Storage extends Service { * @throws Exception * @return {} */ - async getFile(fileId) { + async get(fileId) { let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); return await this.client.call('get', path, { @@ -88,7 +88,7 @@ class Storage extends Service { * @throws Exception * @return {} */ - async updateFile(fileId, read, write) { + async update(fileId, read, write) { let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); return await this.client.call('put', path, { @@ -110,7 +110,7 @@ class Storage extends Service { * @throws Exception * @return {} */ - async deleteFile(fileId) { + async delete(fileId) { let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); return await this.client.call('delete', path, { @@ -131,7 +131,7 @@ class Storage extends Service { * @throws Exception * @return {} */ - async getFileDownload(fileId) { + async getDownload(fileId) { let path = '/storage/files/{fileId}/download'.replace(new RegExp('{fileId}', 'g'), fileId); return await this.client.call('get', path, { @@ -158,7 +158,7 @@ class Storage extends Service { * @throws Exception * @return {} */ - async getFilePreview(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { + async getPreview(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { let path = '/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}', 'g'), fileId); return await this.client.call('get', path, { @@ -184,7 +184,7 @@ class Storage extends Service { * @throws Exception * @return {} */ - async getFileView(fileId, as = '') { + async getView(fileId, as = '') { let path = '/storage/files/{fileId}/view'.replace(new RegExp('{fileId}', 'g'), fileId); return await this.client.call('get', path, { diff --git a/app/sdks/nodejs/lib/services/teams.js b/app/sdks/nodejs/lib/services/teams.js index b54ca076db..7d6657fa5e 100644 --- a/app/sdks/nodejs/lib/services/teams.js +++ b/app/sdks/nodejs/lib/services/teams.js @@ -16,7 +16,7 @@ class Teams extends Service { * @throws Exception * @return {} */ - async listTeams(search = '', limit = 25, offset = 0, orderType = 'ASC') { + async list(search = '', limit = 25, offset = 0, orderType = 'ASC') { let path = '/teams'; return await this.client.call('get', path, { @@ -43,7 +43,7 @@ class Teams extends Service { * @throws Exception * @return {} */ - async createTeam(name, roles = ["owner"]) { + async create(name, roles = ["owner"]) { let path = '/teams'; return await this.client.call('post', path, { @@ -65,7 +65,7 @@ class Teams extends Service { * @throws Exception * @return {} */ - async getTeam(teamId) { + async get(teamId) { let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); return await this.client.call('get', path, { @@ -86,7 +86,7 @@ class Teams extends Service { * @throws Exception * @return {} */ - async updateTeam(teamId, name) { + async update(teamId, name) { let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); return await this.client.call('put', path, { @@ -107,7 +107,7 @@ class Teams extends Service { * @throws Exception * @return {} */ - async deleteTeam(teamId) { + async delete(teamId) { let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); return await this.client.call('delete', path, { @@ -127,7 +127,7 @@ class Teams extends Service { * @throws Exception * @return {} */ - async getTeamMemberships(teamId) { + async getMemberships(teamId) { let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); return await this.client.call('get', path, { @@ -162,7 +162,7 @@ class Teams extends Service { * @throws Exception * @return {} */ - async createTeamMembership(teamId, email, roles, url, name = '') { + async createMembership(teamId, email, roles, url, name = '') { let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); return await this.client.call('post', path, { @@ -188,7 +188,7 @@ class Teams extends Service { * @throws Exception * @return {} */ - async deleteTeamMembership(teamId, inviteId) { + async deleteMembership(teamId, inviteId) { let path = '/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); return await this.client.call('delete', path, { diff --git a/app/sdks/nodejs/lib/services/users.js b/app/sdks/nodejs/lib/services/users.js index 5fe21c7350..5bb638a43e 100644 --- a/app/sdks/nodejs/lib/services/users.js +++ b/app/sdks/nodejs/lib/services/users.js @@ -15,7 +15,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async listUsers(search = '', limit = 25, offset = 0, orderType = 'ASC') { + async list(search = '', limit = 25, offset = 0, orderType = 'ASC') { let path = '/users'; return await this.client.call('get', path, { @@ -40,7 +40,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async createUser(email, password, name = '') { + async create(email, password, name = '') { let path = '/users'; return await this.client.call('post', path, { @@ -62,7 +62,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async getUser(userId) { + async get(userId) { let path = '/users/{userId}'.replace(new RegExp('{userId}', 'g'), userId); return await this.client.call('get', path, { @@ -81,7 +81,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async getUserLogs(userId) { + async getLogs(userId) { let path = '/users/{userId}/logs'.replace(new RegExp('{userId}', 'g'), userId); return await this.client.call('get', path, { @@ -100,7 +100,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async getUserPrefs(userId) { + async getPrefs(userId) { let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); return await this.client.call('get', path, { @@ -121,7 +121,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async updateUserPrefs(userId, prefs) { + async updatePrefs(userId, prefs) { let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); return await this.client.call('patch', path, { @@ -141,7 +141,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async getUserSessions(userId) { + async getSessions(userId) { let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); return await this.client.call('get', path, { @@ -160,7 +160,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async deleteUserSessions(userId) { + async deleteSessions(userId) { let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); return await this.client.call('delete', path, { @@ -180,7 +180,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async deleteUserSession(userId, sessionId) { + async deleteSession(userId, sessionId) { let path = '/users/{userId}/sessions/:session'.replace(new RegExp('{userId}', 'g'), userId); return await this.client.call('delete', path, { @@ -201,7 +201,7 @@ class Users extends Service { * @throws Exception * @return {} */ - async updateUserStatus(userId, status) { + async updateStatus(userId, status) { let path = '/users/{userId}/status'.replace(new RegExp('{userId}', 'g'), userId); return await this.client.call('patch', path, { diff --git a/app/sdks/php/docs/database.md b/app/sdks/php/docs/database.md index 86a8b20933..9bf9cf14e0 100644 --- a/app/sdks/php/docs/database.md +++ b/app/sdks/php/docs/database.md @@ -3,7 +3,7 @@ ## List Collections ```http request -GET https://appwrite.io/v1/database +GET https://appwrite.io/v1/database/collections ``` ** Get a list of all the user collections. You can use the query params to filter your results. On admin mode, this endpoint will return a list of all of the project collections. [Learn more about different API modes](/docs/admin). ** @@ -20,7 +20,7 @@ GET https://appwrite.io/v1/database ## Create Collection ```http request -POST https://appwrite.io/v1/database +POST https://appwrite.io/v1/database/collections ``` ** Create a new Collection. ** @@ -37,7 +37,7 @@ POST https://appwrite.io/v1/database ## Get Collection ```http request -GET https://appwrite.io/v1/database/{collectionId} +GET https://appwrite.io/v1/database/collections/{collectionId} ``` ** Get collection by its unique ID. This endpoint response returns a JSON object with the collection metadata. ** @@ -51,7 +51,7 @@ GET https://appwrite.io/v1/database/{collectionId} ## Update Collection ```http request -PUT https://appwrite.io/v1/database/{collectionId} +PUT https://appwrite.io/v1/database/collections/{collectionId} ``` ** Update collection by its unique ID. ** @@ -69,7 +69,7 @@ PUT https://appwrite.io/v1/database/{collectionId} ## Delete Collection ```http request -DELETE https://appwrite.io/v1/database/{collectionId} +DELETE https://appwrite.io/v1/database/collections/{collectionId} ``` ** Delete a collection by its unique ID. Only users with write permissions have access to delete this resource. ** @@ -83,7 +83,7 @@ DELETE https://appwrite.io/v1/database/{collectionId} ## List Documents ```http request -GET https://appwrite.io/v1/database/{collectionId}/documents +GET https://appwrite.io/v1/database/collections/{collectionId}/documents ``` ** Get a list of all the user documents. You can use the query params to filter your results. On admin mode, this endpoint will return a list of all of the project documents. [Learn more about different API modes](/docs/admin). ** @@ -106,7 +106,7 @@ GET https://appwrite.io/v1/database/{collectionId}/documents ## Create Document ```http request -POST https://appwrite.io/v1/database/{collectionId}/documents +POST https://appwrite.io/v1/database/collections/{collectionId}/documents ``` ** Create a new Document. ** @@ -126,7 +126,7 @@ POST https://appwrite.io/v1/database/{collectionId}/documents ## Get Document ```http request -GET https://appwrite.io/v1/database/{collectionId}/documents/{documentId} +GET https://appwrite.io/v1/database/collections/{collectionId}/documents/{documentId} ``` ** Get document by its unique ID. This endpoint response returns a JSON object with the document data. ** @@ -141,7 +141,7 @@ GET https://appwrite.io/v1/database/{collectionId}/documents/{documentId} ## Update Document ```http request -PATCH https://appwrite.io/v1/database/{collectionId}/documents/{documentId} +PATCH https://appwrite.io/v1/database/collections/{collectionId}/documents/{documentId} ``` ### Parameters @@ -157,7 +157,7 @@ PATCH https://appwrite.io/v1/database/{collectionId}/documents/{documentId} ## Delete Document ```http request -DELETE https://appwrite.io/v1/database/{collectionId}/documents/{documentId} +DELETE https://appwrite.io/v1/database/collections/{collectionId}/documents/{documentId} ``` ** Delete document by its unique ID. This endpoint deletes only the parent documents, his attributes and relations to other documents. Child documents **will not** be deleted. ** diff --git a/app/sdks/php/docs/examples/locale/get-locale.md b/app/sdks/php/docs/examples/locale/get.md similarity index 84% rename from app/sdks/php/docs/examples/locale/get-locale.md rename to app/sdks/php/docs/examples/locale/get.md index ac56f068de..6db5289e48 100644 --- a/app/sdks/php/docs/examples/locale/get-locale.md +++ b/app/sdks/php/docs/examples/locale/get.md @@ -12,4 +12,4 @@ $client $locale = new Locale($client); -$result = $locale->getLocale(); \ No newline at end of file +$result = $locale->get(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/create-file.md b/app/sdks/php/docs/examples/storage/create-file.md deleted file mode 100644 index 225b9e2bec..0000000000 --- a/app/sdks/php/docs/examples/storage/create-file.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$storage = new Storage($client); - -$result = $storage->createFile(new \CURLFile('/path/to/file.png', 'image/png', 'file.png'), [], []); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/get-file-download.md b/app/sdks/php/docs/examples/storage/create.md similarity index 63% rename from app/sdks/php/docs/examples/storage/get-file-download.md rename to app/sdks/php/docs/examples/storage/create.md index 3a6db00081..789e163dd2 100644 --- a/app/sdks/php/docs/examples/storage/get-file-download.md +++ b/app/sdks/php/docs/examples/storage/create.md @@ -12,4 +12,4 @@ $client $storage = new Storage($client); -$result = $storage->getFileDownload('[FILE_ID]'); \ No newline at end of file +$result = $storage->create(new \CURLFile('/path/to/file.png', 'image/png', 'file.png'), [], []); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/get-file.md b/app/sdks/php/docs/examples/storage/delete.md similarity index 80% rename from app/sdks/php/docs/examples/storage/get-file.md rename to app/sdks/php/docs/examples/storage/delete.md index 63fa59b40a..c1cf02b71d 100644 --- a/app/sdks/php/docs/examples/storage/get-file.md +++ b/app/sdks/php/docs/examples/storage/delete.md @@ -12,4 +12,4 @@ $client $storage = new Storage($client); -$result = $storage->getFile('[FILE_ID]'); \ No newline at end of file +$result = $storage->delete('[FILE_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/get-file-view.md b/app/sdks/php/docs/examples/storage/get-download.md similarity index 78% rename from app/sdks/php/docs/examples/storage/get-file-view.md rename to app/sdks/php/docs/examples/storage/get-download.md index 59cc25bc74..4d871c2956 100644 --- a/app/sdks/php/docs/examples/storage/get-file-view.md +++ b/app/sdks/php/docs/examples/storage/get-download.md @@ -12,4 +12,4 @@ $client $storage = new Storage($client); -$result = $storage->getFileView('[FILE_ID]'); \ No newline at end of file +$result = $storage->getDownload('[FILE_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/delete-file.md b/app/sdks/php/docs/examples/storage/get-preview.md similarity index 79% rename from app/sdks/php/docs/examples/storage/delete-file.md rename to app/sdks/php/docs/examples/storage/get-preview.md index 74448e5a7c..f3bf8cf2c0 100644 --- a/app/sdks/php/docs/examples/storage/delete-file.md +++ b/app/sdks/php/docs/examples/storage/get-preview.md @@ -12,4 +12,4 @@ $client $storage = new Storage($client); -$result = $storage->deleteFile('[FILE_ID]'); \ No newline at end of file +$result = $storage->getPreview('[FILE_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/get-view.md b/app/sdks/php/docs/examples/storage/get-view.md new file mode 100644 index 0000000000..62979c4e91 --- /dev/null +++ b/app/sdks/php/docs/examples/storage/get-view.md @@ -0,0 +1,15 @@ +setProject('') + ->setKey('') +; + +$storage = new Storage($client); + +$result = $storage->getView('[FILE_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/get.md b/app/sdks/php/docs/examples/storage/get.md new file mode 100644 index 0000000000..47f1534483 --- /dev/null +++ b/app/sdks/php/docs/examples/storage/get.md @@ -0,0 +1,15 @@ +setProject('') + ->setKey('') +; + +$storage = new Storage($client); + +$result = $storage->get('[FILE_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/list-files.md b/app/sdks/php/docs/examples/storage/list.md similarity index 84% rename from app/sdks/php/docs/examples/storage/list-files.md rename to app/sdks/php/docs/examples/storage/list.md index 434e1fe70d..d5fc5b6691 100644 --- a/app/sdks/php/docs/examples/storage/list-files.md +++ b/app/sdks/php/docs/examples/storage/list.md @@ -12,4 +12,4 @@ $client $storage = new Storage($client); -$result = $storage->listFiles(); \ No newline at end of file +$result = $storage->list(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/update-file.md b/app/sdks/php/docs/examples/storage/update-file.md deleted file mode 100644 index 637870a7a6..0000000000 --- a/app/sdks/php/docs/examples/storage/update-file.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$storage = new Storage($client); - -$result = $storage->updateFile('[FILE_ID]', [], []); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/storage/get-file-preview.md b/app/sdks/php/docs/examples/storage/update.md similarity index 77% rename from app/sdks/php/docs/examples/storage/get-file-preview.md rename to app/sdks/php/docs/examples/storage/update.md index 8b02bdd2a9..a2967d94d6 100644 --- a/app/sdks/php/docs/examples/storage/get-file-preview.md +++ b/app/sdks/php/docs/examples/storage/update.md @@ -12,4 +12,4 @@ $client $storage = new Storage($client); -$result = $storage->getFilePreview('[FILE_ID]'); \ No newline at end of file +$result = $storage->update('[FILE_ID]', [], []); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/delete-team-membership.md b/app/sdks/php/docs/examples/teams/create-membership.md similarity index 62% rename from app/sdks/php/docs/examples/teams/delete-team-membership.md rename to app/sdks/php/docs/examples/teams/create-membership.md index d53e1ed7ce..9929963648 100644 --- a/app/sdks/php/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/php/docs/examples/teams/create-membership.md @@ -12,4 +12,4 @@ $client $teams = new Teams($client); -$result = $teams->deleteTeamMembership('[TEAM_ID]', '[INVITE_ID]'); \ No newline at end of file +$result = $teams->createMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/create-team-membership.md b/app/sdks/php/docs/examples/teams/create-team-membership.md deleted file mode 100644 index 12a47b6f15..0000000000 --- a/app/sdks/php/docs/examples/teams/create-team-membership.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$teams = new Teams($client); - -$result = $teams->createTeamMembership('[TEAM_ID]', 'email@example.com', [], 'https://example.com'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/get-team.md b/app/sdks/php/docs/examples/teams/create.md similarity index 80% rename from app/sdks/php/docs/examples/teams/get-team.md rename to app/sdks/php/docs/examples/teams/create.md index e58a9d0dc2..048c0bce2c 100644 --- a/app/sdks/php/docs/examples/teams/get-team.md +++ b/app/sdks/php/docs/examples/teams/create.md @@ -12,4 +12,4 @@ $client $teams = new Teams($client); -$result = $teams->getTeam('[TEAM_ID]'); \ No newline at end of file +$result = $teams->create('[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/get-team-memberships.md b/app/sdks/php/docs/examples/teams/delete-membership.md similarity index 72% rename from app/sdks/php/docs/examples/teams/get-team-memberships.md rename to app/sdks/php/docs/examples/teams/delete-membership.md index e7868f6a8c..d6e66abe39 100644 --- a/app/sdks/php/docs/examples/teams/get-team-memberships.md +++ b/app/sdks/php/docs/examples/teams/delete-membership.md @@ -12,4 +12,4 @@ $client $teams = new Teams($client); -$result = $teams->getTeamMemberships('[TEAM_ID]'); \ No newline at end of file +$result = $teams->deleteMembership('[TEAM_ID]', '[INVITE_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/create-team.md b/app/sdks/php/docs/examples/teams/delete.md similarity index 80% rename from app/sdks/php/docs/examples/teams/create-team.md rename to app/sdks/php/docs/examples/teams/delete.md index 11928b37cc..46a610da1b 100644 --- a/app/sdks/php/docs/examples/teams/create-team.md +++ b/app/sdks/php/docs/examples/teams/delete.md @@ -12,4 +12,4 @@ $client $teams = new Teams($client); -$result = $teams->createTeam('[NAME]'); \ No newline at end of file +$result = $teams->delete('[TEAM_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/get-memberships.md b/app/sdks/php/docs/examples/teams/get-memberships.md new file mode 100644 index 0000000000..af39577657 --- /dev/null +++ b/app/sdks/php/docs/examples/teams/get-memberships.md @@ -0,0 +1,15 @@ +setProject('') + ->setKey('') +; + +$teams = new Teams($client); + +$result = $teams->getMemberships('[TEAM_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/delete-team.md b/app/sdks/php/docs/examples/teams/get.md similarity index 79% rename from app/sdks/php/docs/examples/teams/delete-team.md rename to app/sdks/php/docs/examples/teams/get.md index 7fb04015be..59ea1b5313 100644 --- a/app/sdks/php/docs/examples/teams/delete-team.md +++ b/app/sdks/php/docs/examples/teams/get.md @@ -12,4 +12,4 @@ $client $teams = new Teams($client); -$result = $teams->deleteTeam('[TEAM_ID]'); \ No newline at end of file +$result = $teams->get('[TEAM_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/list-teams.md b/app/sdks/php/docs/examples/teams/list.md similarity index 84% rename from app/sdks/php/docs/examples/teams/list-teams.md rename to app/sdks/php/docs/examples/teams/list.md index 9b753c6d16..fcccf13917 100644 --- a/app/sdks/php/docs/examples/teams/list-teams.md +++ b/app/sdks/php/docs/examples/teams/list.md @@ -12,4 +12,4 @@ $client $teams = new Teams($client); -$result = $teams->listTeams(); \ No newline at end of file +$result = $teams->list(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/update-team.md b/app/sdks/php/docs/examples/teams/update-team.md deleted file mode 100644 index a76fce3a83..0000000000 --- a/app/sdks/php/docs/examples/teams/update-team.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$teams = new Teams($client); - -$result = $teams->updateTeam('[TEAM_ID]', '[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/teams/update.md b/app/sdks/php/docs/examples/teams/update.md new file mode 100644 index 0000000000..ea2b214da6 --- /dev/null +++ b/app/sdks/php/docs/examples/teams/update.md @@ -0,0 +1,15 @@ +setProject('') + ->setKey('') +; + +$teams = new Teams($client); + +$result = $teams->update('[TEAM_ID]', '[NAME]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/create-user.md b/app/sdks/php/docs/examples/users/create-user.md deleted file mode 100644 index b25a479c89..0000000000 --- a/app/sdks/php/docs/examples/users/create-user.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$users = new Users($client); - -$result = $users->createUser('email@example.com', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/delete-user-sessions.md b/app/sdks/php/docs/examples/users/create.md similarity index 73% rename from app/sdks/php/docs/examples/users/delete-user-sessions.md rename to app/sdks/php/docs/examples/users/create.md index a83c648f69..2f88c4a19f 100644 --- a/app/sdks/php/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/php/docs/examples/users/create.md @@ -12,4 +12,4 @@ $client $users = new Users($client); -$result = $users->deleteUserSessions('[USER_ID]'); \ No newline at end of file +$result = $users->create('email@example.com', 'password'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/delete-session.md b/app/sdks/php/docs/examples/users/delete-session.md new file mode 100644 index 0000000000..301d309a3e --- /dev/null +++ b/app/sdks/php/docs/examples/users/delete-session.md @@ -0,0 +1,15 @@ +setProject('') + ->setKey('') +; + +$users = new Users($client); + +$result = $users->deleteSession('[USER_ID]', '[SESSION_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/delete-sessions.md b/app/sdks/php/docs/examples/users/delete-sessions.md new file mode 100644 index 0000000000..3494eb2d59 --- /dev/null +++ b/app/sdks/php/docs/examples/users/delete-sessions.md @@ -0,0 +1,15 @@ +setProject('') + ->setKey('') +; + +$users = new Users($client); + +$result = $users->deleteSessions('[USER_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/delete-user-session.md b/app/sdks/php/docs/examples/users/delete-user-session.md deleted file mode 100644 index 28ad6dd165..0000000000 --- a/app/sdks/php/docs/examples/users/delete-user-session.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$users = new Users($client); - -$result = $users->deleteUserSession('[USER_ID]', '[SESSION_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/get-user.md b/app/sdks/php/docs/examples/users/get-logs.md similarity index 80% rename from app/sdks/php/docs/examples/users/get-user.md rename to app/sdks/php/docs/examples/users/get-logs.md index bc776d4313..9d64c015ca 100644 --- a/app/sdks/php/docs/examples/users/get-user.md +++ b/app/sdks/php/docs/examples/users/get-logs.md @@ -12,4 +12,4 @@ $client $users = new Users($client); -$result = $users->getUser('[USER_ID]'); \ No newline at end of file +$result = $users->getLogs('[USER_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/get-user-logs.md b/app/sdks/php/docs/examples/users/get-prefs.md similarity index 79% rename from app/sdks/php/docs/examples/users/get-user-logs.md rename to app/sdks/php/docs/examples/users/get-prefs.md index bb9a70e975..932db5a632 100644 --- a/app/sdks/php/docs/examples/users/get-user-logs.md +++ b/app/sdks/php/docs/examples/users/get-prefs.md @@ -12,4 +12,4 @@ $client $users = new Users($client); -$result = $users->getUserLogs('[USER_ID]'); \ No newline at end of file +$result = $users->getPrefs('[USER_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/get-user-prefs.md b/app/sdks/php/docs/examples/users/get-sessions.md similarity index 78% rename from app/sdks/php/docs/examples/users/get-user-prefs.md rename to app/sdks/php/docs/examples/users/get-sessions.md index 949d206065..ff75cd230f 100644 --- a/app/sdks/php/docs/examples/users/get-user-prefs.md +++ b/app/sdks/php/docs/examples/users/get-sessions.md @@ -12,4 +12,4 @@ $client $users = new Users($client); -$result = $users->getUserPrefs('[USER_ID]'); \ No newline at end of file +$result = $users->getSessions('[USER_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/get.md b/app/sdks/php/docs/examples/users/get.md new file mode 100644 index 0000000000..b0eaa73c54 --- /dev/null +++ b/app/sdks/php/docs/examples/users/get.md @@ -0,0 +1,15 @@ +setProject('') + ->setKey('') +; + +$users = new Users($client); + +$result = $users->get('[USER_ID]'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/list-users.md b/app/sdks/php/docs/examples/users/list.md similarity index 84% rename from app/sdks/php/docs/examples/users/list-users.md rename to app/sdks/php/docs/examples/users/list.md index d3824540fc..745d83e40d 100644 --- a/app/sdks/php/docs/examples/users/list-users.md +++ b/app/sdks/php/docs/examples/users/list.md @@ -12,4 +12,4 @@ $client $users = new Users($client); -$result = $users->listUsers(); \ No newline at end of file +$result = $users->list(); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/get-user-sessions.md b/app/sdks/php/docs/examples/users/update-prefs.md similarity index 77% rename from app/sdks/php/docs/examples/users/get-user-sessions.md rename to app/sdks/php/docs/examples/users/update-prefs.md index 9f29697960..d6854bb54d 100644 --- a/app/sdks/php/docs/examples/users/get-user-sessions.md +++ b/app/sdks/php/docs/examples/users/update-prefs.md @@ -12,4 +12,4 @@ $client $users = new Users($client); -$result = $users->getUserSessions('[USER_ID]'); \ No newline at end of file +$result = $users->updatePrefs('[USER_ID]', ''); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/update-status.md b/app/sdks/php/docs/examples/users/update-status.md new file mode 100644 index 0000000000..149d5bfd91 --- /dev/null +++ b/app/sdks/php/docs/examples/users/update-status.md @@ -0,0 +1,15 @@ +setProject('') + ->setKey('') +; + +$users = new Users($client); + +$result = $users->updateStatus('[USER_ID]', '1'); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/update-user-prefs.md b/app/sdks/php/docs/examples/users/update-user-prefs.md deleted file mode 100644 index 873bbc2912..0000000000 --- a/app/sdks/php/docs/examples/users/update-user-prefs.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$users = new Users($client); - -$result = $users->updateUserPrefs('[USER_ID]', ''); \ No newline at end of file diff --git a/app/sdks/php/docs/examples/users/update-user-status.md b/app/sdks/php/docs/examples/users/update-user-status.md deleted file mode 100644 index 918d827962..0000000000 --- a/app/sdks/php/docs/examples/users/update-user-status.md +++ /dev/null @@ -1,15 +0,0 @@ -setProject('') - ->setKey('') -; - -$users = new Users($client); - -$result = $users->updateUserStatus('[USER_ID]', '1'); \ No newline at end of file diff --git a/app/sdks/php/src/Appwrite/Services/Database.php b/app/sdks/php/src/Appwrite/Services/Database.php index 3621a5c4b2..cf9135d4a2 100644 --- a/app/sdks/php/src/Appwrite/Services/Database.php +++ b/app/sdks/php/src/Appwrite/Services/Database.php @@ -25,7 +25,7 @@ class Database extends Service */ public function listCollections(string $search = '', int $limit = 25, int $offset = 0, string $orderType = 'ASC'):array { - $path = str_replace([], [], '/database'); + $path = str_replace([], [], '/database/collections'); $params = []; $params['search'] = $search; @@ -52,7 +52,7 @@ class Database extends Service */ public function createCollection(string $name, array $read, array $write, array $rules):array { - $path = str_replace([], [], '/database'); + $path = str_replace([], [], '/database/collections'); $params = []; $params['name'] = $name; @@ -77,7 +77,7 @@ class Database extends Service */ public function getCollection(string $collectionId):array { - $path = str_replace(['{collectionId}'], [$collectionId], '/database/{collectionId}'); + $path = str_replace(['{collectionId}'], [$collectionId], '/database/collections/{collectionId}'); $params = []; @@ -101,7 +101,7 @@ class Database extends Service */ public function updateCollection(string $collectionId, string $name, array $read, array $write, array $rules = []):array { - $path = str_replace(['{collectionId}'], [$collectionId], '/database/{collectionId}'); + $path = str_replace(['{collectionId}'], [$collectionId], '/database/collections/{collectionId}'); $params = []; $params['name'] = $name; @@ -126,7 +126,7 @@ class Database extends Service */ public function deleteCollection(string $collectionId):array { - $path = str_replace(['{collectionId}'], [$collectionId], '/database/{collectionId}'); + $path = str_replace(['{collectionId}'], [$collectionId], '/database/collections/{collectionId}'); $params = []; @@ -158,7 +158,7 @@ class Database extends Service */ public function listDocuments(string $collectionId, array $filters = [], int $offset = 0, int $limit = 50, string $orderField = '$uid', string $orderType = 'ASC', string $orderCast = 'string', string $search = '', int $first = 0, int $last = 0):array { - $path = str_replace(['{collectionId}'], [$collectionId], '/database/{collectionId}/documents'); + $path = str_replace(['{collectionId}'], [$collectionId], '/database/collections/{collectionId}/documents'); $params = []; $params['filters'] = $filters; @@ -193,7 +193,7 @@ class Database extends Service */ public function createDocument(string $collectionId, string $data, array $read, array $write, string $parentDocument = '', string $parentProperty = '', string $parentPropertyType = 'assign'):array { - $path = str_replace(['{collectionId}'], [$collectionId], '/database/{collectionId}/documents'); + $path = str_replace(['{collectionId}'], [$collectionId], '/database/collections/{collectionId}/documents'); $params = []; $params['data'] = $data; @@ -221,7 +221,7 @@ class Database extends Service */ public function getDocument(string $collectionId, string $documentId):array { - $path = str_replace(['{collectionId}', '{documentId}'], [$collectionId, $documentId], '/database/{collectionId}/documents/{documentId}'); + $path = str_replace(['{collectionId}', '{documentId}'], [$collectionId, $documentId], '/database/collections/{collectionId}/documents/{documentId}'); $params = []; @@ -243,7 +243,7 @@ class Database extends Service */ public function updateDocument(string $collectionId, string $documentId, string $data, array $read, array $write):array { - $path = str_replace(['{collectionId}', '{documentId}'], [$collectionId, $documentId], '/database/{collectionId}/documents/{documentId}'); + $path = str_replace(['{collectionId}', '{documentId}'], [$collectionId, $documentId], '/database/collections/{collectionId}/documents/{documentId}'); $params = []; $params['data'] = $data; @@ -269,7 +269,7 @@ class Database extends Service */ public function deleteDocument(string $collectionId, string $documentId):array { - $path = str_replace(['{collectionId}', '{documentId}'], [$collectionId, $documentId], '/database/{collectionId}/documents/{documentId}'); + $path = str_replace(['{collectionId}', '{documentId}'], [$collectionId, $documentId], '/database/collections/{collectionId}/documents/{documentId}'); $params = []; diff --git a/app/sdks/php/src/Appwrite/Services/Locale.php b/app/sdks/php/src/Appwrite/Services/Locale.php index 5304f91924..4cb95fa97a 100644 --- a/app/sdks/php/src/Appwrite/Services/Locale.php +++ b/app/sdks/php/src/Appwrite/Services/Locale.php @@ -21,7 +21,7 @@ class Locale extends Service * @throws Exception * @return array */ - public function getLocale():array + public function get():array { $path = str_replace([], [], '/locale'); $params = []; diff --git a/app/sdks/php/src/Appwrite/Services/Storage.php b/app/sdks/php/src/Appwrite/Services/Storage.php index 09b74fbf8f..c4931f9227 100644 --- a/app/sdks/php/src/Appwrite/Services/Storage.php +++ b/app/sdks/php/src/Appwrite/Services/Storage.php @@ -22,7 +22,7 @@ class Storage extends Service * @throws Exception * @return array */ - public function listFiles(string $search = '', int $limit = 25, int $offset = 0, string $orderType = 'ASC'):array + public function list(string $search = '', int $limit = 25, int $offset = 0, string $orderType = 'ASC'):array { $path = str_replace([], [], '/storage/files'); $params = []; @@ -50,7 +50,7 @@ class Storage extends Service * @throws Exception * @return array */ - public function createFile(\CurlFile $file, array $read, array $write):array + public function create(\CurlFile $file, array $read, array $write):array { $path = str_replace([], [], '/storage/files'); $params = []; @@ -74,7 +74,7 @@ class Storage extends Service * @throws Exception * @return array */ - public function getFile(string $fileId):array + public function get(string $fileId):array { $path = str_replace(['{fileId}'], [$fileId], '/storage/files/{fileId}'); $params = []; @@ -97,7 +97,7 @@ class Storage extends Service * @throws Exception * @return array */ - public function updateFile(string $fileId, array $read, array $write):array + public function update(string $fileId, array $read, array $write):array { $path = str_replace(['{fileId}'], [$fileId], '/storage/files/{fileId}'); $params = []; @@ -120,7 +120,7 @@ class Storage extends Service * @throws Exception * @return array */ - public function deleteFile(string $fileId):array + public function delete(string $fileId):array { $path = str_replace(['{fileId}'], [$fileId], '/storage/files/{fileId}'); $params = []; @@ -142,7 +142,7 @@ class Storage extends Service * @throws Exception * @return array */ - public function getFileDownload(string $fileId):array + public function getDownload(string $fileId):array { $path = str_replace(['{fileId}'], [$fileId], '/storage/files/{fileId}/download'); $params = []; @@ -170,7 +170,7 @@ class Storage extends Service * @throws Exception * @return array */ - public function getFilePreview(string $fileId, int $width = 0, int $height = 0, int $quality = 100, string $background = '', string $output = ''):array + public function getPreview(string $fileId, int $width = 0, int $height = 0, int $quality = 100, string $background = '', string $output = ''):array { $path = str_replace(['{fileId}'], [$fileId], '/storage/files/{fileId}/preview'); $params = []; @@ -197,7 +197,7 @@ class Storage extends Service * @throws Exception * @return array */ - public function getFileView(string $fileId, string $as = ''):array + public function getView(string $fileId, string $as = ''):array { $path = str_replace(['{fileId}'], [$fileId], '/storage/files/{fileId}/view'); $params = []; diff --git a/app/sdks/php/src/Appwrite/Services/Teams.php b/app/sdks/php/src/Appwrite/Services/Teams.php index 4b305bf9e9..60b73231e5 100644 --- a/app/sdks/php/src/Appwrite/Services/Teams.php +++ b/app/sdks/php/src/Appwrite/Services/Teams.php @@ -22,7 +22,7 @@ class Teams extends Service * @throws Exception * @return array */ - public function listTeams(string $search = '', int $limit = 25, int $offset = 0, string $orderType = 'ASC'):array + public function list(string $search = '', int $limit = 25, int $offset = 0, string $orderType = 'ASC'):array { $path = str_replace([], [], '/teams'); $params = []; @@ -50,7 +50,7 @@ class Teams extends Service * @throws Exception * @return array */ - public function createTeam(string $name, array $roles = ["owner"]):array + public function create(string $name, array $roles = ["owner"]):array { $path = str_replace([], [], '/teams'); $params = []; @@ -73,7 +73,7 @@ class Teams extends Service * @throws Exception * @return array */ - public function getTeam(string $teamId):array + public function get(string $teamId):array { $path = str_replace(['{teamId}'], [$teamId], '/teams/{teamId}'); $params = []; @@ -95,7 +95,7 @@ class Teams extends Service * @throws Exception * @return array */ - public function updateTeam(string $teamId, string $name):array + public function update(string $teamId, string $name):array { $path = str_replace(['{teamId}'], [$teamId], '/teams/{teamId}'); $params = []; @@ -117,7 +117,7 @@ class Teams extends Service * @throws Exception * @return array */ - public function deleteTeam(string $teamId):array + public function delete(string $teamId):array { $path = str_replace(['{teamId}'], [$teamId], '/teams/{teamId}'); $params = []; @@ -138,7 +138,7 @@ class Teams extends Service * @throws Exception * @return array */ - public function getTeamMemberships(string $teamId):array + public function getMemberships(string $teamId):array { $path = str_replace(['{teamId}'], [$teamId], '/teams/{teamId}/memberships'); $params = []; @@ -174,7 +174,7 @@ class Teams extends Service * @throws Exception * @return array */ - public function createTeamMembership(string $teamId, string $email, array $roles, string $url, string $name = ''):array + public function createMembership(string $teamId, string $email, array $roles, string $url, string $name = ''):array { $path = str_replace(['{teamId}'], [$teamId], '/teams/{teamId}/memberships'); $params = []; @@ -201,7 +201,7 @@ class Teams extends Service * @throws Exception * @return array */ - public function deleteTeamMembership(string $teamId, string $inviteId):array + public function deleteMembership(string $teamId, string $inviteId):array { $path = str_replace(['{teamId}', '{inviteId}'], [$teamId, $inviteId], '/teams/{teamId}/memberships/{inviteId}'); $params = []; diff --git a/app/sdks/php/src/Appwrite/Services/Users.php b/app/sdks/php/src/Appwrite/Services/Users.php index 3d59006f57..aa3b2ecaa4 100644 --- a/app/sdks/php/src/Appwrite/Services/Users.php +++ b/app/sdks/php/src/Appwrite/Services/Users.php @@ -21,7 +21,7 @@ class Users extends Service * @throws Exception * @return array */ - public function listUsers(string $search = '', int $limit = 25, int $offset = 0, string $orderType = 'ASC'):array + public function list(string $search = '', int $limit = 25, int $offset = 0, string $orderType = 'ASC'):array { $path = str_replace([], [], '/users'); $params = []; @@ -47,7 +47,7 @@ class Users extends Service * @throws Exception * @return array */ - public function createUser(string $email, string $password, string $name = ''):array + public function create(string $email, string $password, string $name = ''):array { $path = str_replace([], [], '/users'); $params = []; @@ -70,7 +70,7 @@ class Users extends Service * @throws Exception * @return array */ - public function getUser(string $userId):array + public function get(string $userId):array { $path = str_replace(['{userId}'], [$userId], '/users/{userId}'); $params = []; @@ -90,7 +90,7 @@ class Users extends Service * @throws Exception * @return array */ - public function getUserLogs(string $userId):array + public function getLogs(string $userId):array { $path = str_replace(['{userId}'], [$userId], '/users/{userId}/logs'); $params = []; @@ -110,7 +110,7 @@ class Users extends Service * @throws Exception * @return array */ - public function getUserPrefs(string $userId):array + public function getPrefs(string $userId):array { $path = str_replace(['{userId}'], [$userId], '/users/{userId}/prefs'); $params = []; @@ -132,7 +132,7 @@ class Users extends Service * @throws Exception * @return array */ - public function updateUserPrefs(string $userId, string $prefs):array + public function updatePrefs(string $userId, string $prefs):array { $path = str_replace(['{userId}'], [$userId], '/users/{userId}/prefs'); $params = []; @@ -153,7 +153,7 @@ class Users extends Service * @throws Exception * @return array */ - public function getUserSessions(string $userId):array + public function getSessions(string $userId):array { $path = str_replace(['{userId}'], [$userId], '/users/{userId}/sessions'); $params = []; @@ -173,7 +173,7 @@ class Users extends Service * @throws Exception * @return array */ - public function deleteUserSessions(string $userId):array + public function deleteSessions(string $userId):array { $path = str_replace(['{userId}'], [$userId], '/users/{userId}/sessions'); $params = []; @@ -194,7 +194,7 @@ class Users extends Service * @throws Exception * @return array */ - public function deleteUserSession(string $userId, string $sessionId):array + public function deleteSession(string $userId, string $sessionId):array { $path = str_replace(['{userId}'], [$userId], '/users/{userId}/sessions/:session'); $params = []; @@ -216,7 +216,7 @@ class Users extends Service * @throws Exception * @return array */ - public function updateUserStatus(string $userId, string $status):array + public function updateStatus(string $userId, string $status):array { $path = str_replace(['{userId}'], [$userId], '/users/{userId}/status'); $params = []; diff --git a/app/sdks/python/appwrite/services/database.py b/app/sdks/python/appwrite/services/database.py index 486f5c3299..36d3b68111 100644 --- a/app/sdks/python/appwrite/services/database.py +++ b/app/sdks/python/appwrite/services/database.py @@ -10,7 +10,7 @@ class Database(Service): """List Collections""" params = {} - path = '/database' + path = '/database/collections' params['search'] = search params['limit'] = limit params['offset'] = offset @@ -24,7 +24,7 @@ class Database(Service): """Create Collection""" params = {} - path = '/database' + path = '/database/collections' params['name'] = name params['read'] = read params['write'] = write @@ -38,7 +38,7 @@ class Database(Service): """Get Collection""" params = {} - path = '/database/{collectionId}' + path = '/database/collections/{collectionId}' path = path.replace('{collectionId}', collection_id) return self.client.call('get', path, { @@ -49,7 +49,7 @@ class Database(Service): """Update Collection""" params = {} - path = '/database/{collectionId}' + path = '/database/collections/{collectionId}' path = path.replace('{collectionId}', collection_id) params['name'] = name params['read'] = read @@ -64,7 +64,7 @@ class Database(Service): """Delete Collection""" params = {} - path = '/database/{collectionId}' + path = '/database/collections/{collectionId}' path = path.replace('{collectionId}', collection_id) return self.client.call('delete', path, { @@ -75,7 +75,7 @@ class Database(Service): """List Documents""" params = {} - path = '/database/{collectionId}/documents' + path = '/database/collections/{collectionId}/documents' path = path.replace('{collectionId}', collection_id) params['filters'] = filters params['offset'] = offset @@ -95,7 +95,7 @@ class Database(Service): """Create Document""" params = {} - path = '/database/{collectionId}/documents' + path = '/database/collections/{collectionId}/documents' path = path.replace('{collectionId}', collection_id) params['data'] = data params['read'] = read @@ -112,7 +112,7 @@ class Database(Service): """Get Document""" params = {} - path = '/database/{collectionId}/documents/{documentId}' + path = '/database/collections/{collectionId}/documents/{documentId}' path = path.replace('{collectionId}', collection_id) path = path.replace('{documentId}', document_id) @@ -124,7 +124,7 @@ class Database(Service): """Update Document""" params = {} - path = '/database/{collectionId}/documents/{documentId}' + path = '/database/collections/{collectionId}/documents/{documentId}' path = path.replace('{collectionId}', collection_id) path = path.replace('{documentId}', document_id) params['data'] = data @@ -139,7 +139,7 @@ class Database(Service): """Delete Document""" params = {} - path = '/database/{collectionId}/documents/{documentId}' + path = '/database/collections/{collectionId}/documents/{documentId}' path = path.replace('{collectionId}', collection_id) path = path.replace('{documentId}', document_id) diff --git a/app/sdks/python/appwrite/services/locale.py b/app/sdks/python/appwrite/services/locale.py index 4982618c9b..1c5ad69832 100644 --- a/app/sdks/python/appwrite/services/locale.py +++ b/app/sdks/python/appwrite/services/locale.py @@ -6,7 +6,7 @@ class Locale(Service): def __init__(self, client): super(Locale, self).__init__(client) - def get_locale(self): + def get(self): """Get User Locale""" params = {} diff --git a/app/sdks/python/appwrite/services/storage.py b/app/sdks/python/appwrite/services/storage.py index 7e2a986f6e..8423be06e0 100644 --- a/app/sdks/python/appwrite/services/storage.py +++ b/app/sdks/python/appwrite/services/storage.py @@ -6,7 +6,7 @@ class Storage(Service): def __init__(self, client): super(Storage, self).__init__(client) - def list_files(self, search='', limit=25, offset=0, order_type='ASC'): + def list(self, search='', limit=25, offset=0, order_type='ASC'): """List Files""" params = {} @@ -20,7 +20,7 @@ class Storage(Service): 'content-type': 'application/json', }, params) - def create_file(self, file, read, write): + def create(self, file, read, write): """Create File""" params = {} @@ -33,7 +33,7 @@ class Storage(Service): 'content-type': 'multipart/form-data', }, params) - def get_file(self, file_id): + def get(self, file_id): """Get File""" params = {} @@ -44,7 +44,7 @@ class Storage(Service): 'content-type': 'application/json', }, params) - def update_file(self, file_id, read, write): + def update(self, file_id, read, write): """Update File""" params = {} @@ -57,7 +57,7 @@ class Storage(Service): 'content-type': 'application/json', }, params) - def delete_file(self, file_id): + def delete(self, file_id): """Delete File""" params = {} @@ -68,7 +68,7 @@ class Storage(Service): 'content-type': 'application/json', }, params) - def get_file_download(self, file_id): + def get_download(self, file_id): """Get File for Download""" params = {} @@ -79,7 +79,7 @@ class Storage(Service): 'content-type': 'application/json', }, params) - def get_file_preview(self, file_id, width=0, height=0, quality=100, background='', output=''): + def get_preview(self, file_id, width=0, height=0, quality=100, background='', output=''): """Get File Preview""" params = {} @@ -95,7 +95,7 @@ class Storage(Service): 'content-type': 'application/json', }, params) - def get_file_view(self, file_id, xas=''): + def get_view(self, file_id, xas=''): """Get File for View""" params = {} diff --git a/app/sdks/python/appwrite/services/teams.py b/app/sdks/python/appwrite/services/teams.py index bcf995929f..cdc3780ad9 100644 --- a/app/sdks/python/appwrite/services/teams.py +++ b/app/sdks/python/appwrite/services/teams.py @@ -6,7 +6,7 @@ class Teams(Service): def __init__(self, client): super(Teams, self).__init__(client) - def list_teams(self, search='', limit=25, offset=0, order_type='ASC'): + def list(self, search='', limit=25, offset=0, order_type='ASC'): """List Teams""" params = {} @@ -20,7 +20,7 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def create_team(self, name, roles=[]): + def create(self, name, roles=[]): """Create Team""" params = {} @@ -32,7 +32,7 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def get_team(self, team_id): + def get(self, team_id): """Get Team""" params = {} @@ -43,7 +43,7 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def update_team(self, team_id, name): + def update(self, team_id, name): """Update Team""" params = {} @@ -55,7 +55,7 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def delete_team(self, team_id): + def delete(self, team_id): """Delete Team""" params = {} @@ -66,7 +66,7 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def get_team_memberships(self, team_id): + def get_memberships(self, team_id): """Get Team Memberships""" params = {} @@ -77,7 +77,7 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def create_team_membership(self, team_id, email, roles, url, name=''): + def create_membership(self, team_id, email, roles, url, name=''): """Create Team Membership""" params = {} @@ -92,7 +92,7 @@ class Teams(Service): 'content-type': 'application/json', }, params) - def delete_team_membership(self, team_id, invite_id): + def delete_membership(self, team_id, invite_id): """Delete Team Membership""" params = {} diff --git a/app/sdks/python/appwrite/services/users.py b/app/sdks/python/appwrite/services/users.py index 1fbe5c7518..be9b2da8de 100644 --- a/app/sdks/python/appwrite/services/users.py +++ b/app/sdks/python/appwrite/services/users.py @@ -6,7 +6,7 @@ class Users(Service): def __init__(self, client): super(Users, self).__init__(client) - def list_users(self, search='', limit=25, offset=0, order_type='ASC'): + def list(self, search='', limit=25, offset=0, order_type='ASC'): """List Users""" params = {} @@ -20,7 +20,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def create_user(self, email, password, name=''): + def create(self, email, password, name=''): """Create User""" params = {} @@ -33,7 +33,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def get_user(self, user_id): + def get(self, user_id): """Get User""" params = {} @@ -44,7 +44,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def get_user_logs(self, user_id): + def get_logs(self, user_id): """Get User Logs""" params = {} @@ -55,7 +55,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def get_user_prefs(self, user_id): + def get_prefs(self, user_id): """Get User Preferences""" params = {} @@ -66,7 +66,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def update_user_prefs(self, user_id, prefs): + def update_prefs(self, user_id, prefs): """Update User Preferences""" params = {} @@ -78,7 +78,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def get_user_sessions(self, user_id): + def get_sessions(self, user_id): """Get User Sessions""" params = {} @@ -89,7 +89,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def delete_user_sessions(self, user_id): + def delete_sessions(self, user_id): """Delete User Sessions""" params = {} @@ -100,7 +100,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def delete_user_session(self, user_id, session_id): + def delete_session(self, user_id, session_id): """Delete User Session""" params = {} @@ -112,7 +112,7 @@ class Users(Service): 'content-type': 'application/json', }, params) - def update_user_status(self, user_id, status): + def update_status(self, user_id, status): """Update User Status""" params = {} diff --git a/app/sdks/python/docs/examples/locale/get-locale.md b/app/sdks/python/docs/examples/locale/get.md similarity index 85% rename from app/sdks/python/docs/examples/locale/get-locale.md rename to app/sdks/python/docs/examples/locale/get.md index 552e690e4b..52d027c5a7 100644 --- a/app/sdks/python/docs/examples/locale/get-locale.md +++ b/app/sdks/python/docs/examples/locale/get.md @@ -10,4 +10,4 @@ client = Client() locale = Locale(client) -result = locale.get_locale() +result = locale.get() diff --git a/app/sdks/python/docs/examples/storage/create-file.md b/app/sdks/python/docs/examples/storage/create-file.md deleted file mode 100644 index 9ef2aacd18..0000000000 --- a/app/sdks/python/docs/examples/storage/create-file.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.storage import Storage - -client = Client() - -(client - .set_project('') - .set_key('') -) - -storage = Storage(client) - -result = storage.create_file(document.getElementById('uploader').files[0], {}, {}) diff --git a/app/sdks/python/docs/examples/storage/get-file-download.md b/app/sdks/python/docs/examples/storage/create.md similarity index 68% rename from app/sdks/python/docs/examples/storage/get-file-download.md rename to app/sdks/python/docs/examples/storage/create.md index cbe8f97b41..39bb42e671 100644 --- a/app/sdks/python/docs/examples/storage/get-file-download.md +++ b/app/sdks/python/docs/examples/storage/create.md @@ -10,4 +10,4 @@ client = Client() storage = Storage(client) -result = storage.get_file_download('[FILE_ID]') +result = storage.create(document.getElementById('uploader').files[0], {}, {}) diff --git a/app/sdks/python/docs/examples/storage/get-file.md b/app/sdks/python/docs/examples/storage/delete.md similarity index 81% rename from app/sdks/python/docs/examples/storage/get-file.md rename to app/sdks/python/docs/examples/storage/delete.md index 7146cbdb94..dde1f574f9 100644 --- a/app/sdks/python/docs/examples/storage/get-file.md +++ b/app/sdks/python/docs/examples/storage/delete.md @@ -10,4 +10,4 @@ client = Client() storage = Storage(client) -result = storage.get_file('[FILE_ID]') +result = storage.delete('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/get-file-view.md b/app/sdks/python/docs/examples/storage/get-download.md similarity index 79% rename from app/sdks/python/docs/examples/storage/get-file-view.md rename to app/sdks/python/docs/examples/storage/get-download.md index 72f0ec5731..1f0893590e 100644 --- a/app/sdks/python/docs/examples/storage/get-file-view.md +++ b/app/sdks/python/docs/examples/storage/get-download.md @@ -10,4 +10,4 @@ client = Client() storage = Storage(client) -result = storage.get_file_view('[FILE_ID]') +result = storage.get_download('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/get-file-preview.md b/app/sdks/python/docs/examples/storage/get-file-preview.md deleted file mode 100644 index 7d8ffc854e..0000000000 --- a/app/sdks/python/docs/examples/storage/get-file-preview.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.storage import Storage - -client = Client() - -(client - .set_project('') - .set_key('') -) - -storage = Storage(client) - -result = storage.get_file_preview('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/delete-file.md b/app/sdks/python/docs/examples/storage/get-preview.md similarity index 80% rename from app/sdks/python/docs/examples/storage/delete-file.md rename to app/sdks/python/docs/examples/storage/get-preview.md index 7dbf229d28..96badbe625 100644 --- a/app/sdks/python/docs/examples/storage/delete-file.md +++ b/app/sdks/python/docs/examples/storage/get-preview.md @@ -10,4 +10,4 @@ client = Client() storage = Storage(client) -result = storage.delete_file('[FILE_ID]') +result = storage.get_preview('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/get-view.md b/app/sdks/python/docs/examples/storage/get-view.md new file mode 100644 index 0000000000..bb5bdebb7f --- /dev/null +++ b/app/sdks/python/docs/examples/storage/get-view.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.get_view('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/get.md b/app/sdks/python/docs/examples/storage/get.md new file mode 100644 index 0000000000..8962ea4160 --- /dev/null +++ b/app/sdks/python/docs/examples/storage/get.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.get('[FILE_ID]') diff --git a/app/sdks/python/docs/examples/storage/list-files.md b/app/sdks/python/docs/examples/storage/list.md similarity index 85% rename from app/sdks/python/docs/examples/storage/list-files.md rename to app/sdks/python/docs/examples/storage/list.md index 175b3c3a5f..e7f7924bdb 100644 --- a/app/sdks/python/docs/examples/storage/list-files.md +++ b/app/sdks/python/docs/examples/storage/list.md @@ -10,4 +10,4 @@ client = Client() storage = Storage(client) -result = storage.list_files() +result = storage.list() diff --git a/app/sdks/python/docs/examples/storage/update-file.md b/app/sdks/python/docs/examples/storage/update-file.md deleted file mode 100644 index b32f8e7ad0..0000000000 --- a/app/sdks/python/docs/examples/storage/update-file.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.storage import Storage - -client = Client() - -(client - .set_project('') - .set_key('') -) - -storage = Storage(client) - -result = storage.update_file('[FILE_ID]', {}, {}) diff --git a/app/sdks/python/docs/examples/storage/update.md b/app/sdks/python/docs/examples/storage/update.md new file mode 100644 index 0000000000..c07dcb5b8b --- /dev/null +++ b/app/sdks/python/docs/examples/storage/update.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.storage import Storage + +client = Client() + +(client + .set_project('') + .set_key('') +) + +storage = Storage(client) + +result = storage.update('[FILE_ID]', {}, {}) diff --git a/app/sdks/python/docs/examples/teams/delete-team-membership.md b/app/sdks/python/docs/examples/teams/create-membership.md similarity index 63% rename from app/sdks/python/docs/examples/teams/delete-team-membership.md rename to app/sdks/python/docs/examples/teams/create-membership.md index f8360744df..b28e4d71d1 100644 --- a/app/sdks/python/docs/examples/teams/delete-team-membership.md +++ b/app/sdks/python/docs/examples/teams/create-membership.md @@ -10,4 +10,4 @@ client = Client() teams = Teams(client) -result = teams.delete_team_membership('[TEAM_ID]', '[INVITE_ID]') +result = teams.create_membership('[TEAM_ID]', 'email@example.com', {}, 'https://example.com') diff --git a/app/sdks/python/docs/examples/teams/create-team-membership.md b/app/sdks/python/docs/examples/teams/create-team-membership.md deleted file mode 100644 index 6c3f6abf7b..0000000000 --- a/app/sdks/python/docs/examples/teams/create-team-membership.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.teams import Teams - -client = Client() - -(client - .set_project('') - .set_key('') -) - -teams = Teams(client) - -result = teams.create_team_membership('[TEAM_ID]', 'email@example.com', {}, 'https://example.com') diff --git a/app/sdks/python/docs/examples/teams/create-team.md b/app/sdks/python/docs/examples/teams/create.md similarity index 81% rename from app/sdks/python/docs/examples/teams/create-team.md rename to app/sdks/python/docs/examples/teams/create.md index 2429ba9899..f54083626e 100644 --- a/app/sdks/python/docs/examples/teams/create-team.md +++ b/app/sdks/python/docs/examples/teams/create.md @@ -10,4 +10,4 @@ client = Client() teams = Teams(client) -result = teams.create_team('[NAME]') +result = teams.create('[NAME]') diff --git a/app/sdks/python/docs/examples/teams/get-team-memberships.md b/app/sdks/python/docs/examples/teams/delete-membership.md similarity index 73% rename from app/sdks/python/docs/examples/teams/get-team-memberships.md rename to app/sdks/python/docs/examples/teams/delete-membership.md index 0b150d02c8..26ada291ec 100644 --- a/app/sdks/python/docs/examples/teams/get-team-memberships.md +++ b/app/sdks/python/docs/examples/teams/delete-membership.md @@ -10,4 +10,4 @@ client = Client() teams = Teams(client) -result = teams.get_team_memberships('[TEAM_ID]') +result = teams.delete_membership('[TEAM_ID]', '[INVITE_ID]') diff --git a/app/sdks/python/docs/examples/teams/get-team.md b/app/sdks/python/docs/examples/teams/delete.md similarity index 81% rename from app/sdks/python/docs/examples/teams/get-team.md rename to app/sdks/python/docs/examples/teams/delete.md index 3a36051ac7..02bf96686f 100644 --- a/app/sdks/python/docs/examples/teams/get-team.md +++ b/app/sdks/python/docs/examples/teams/delete.md @@ -10,4 +10,4 @@ client = Client() teams = Teams(client) -result = teams.get_team('[TEAM_ID]') +result = teams.delete('[TEAM_ID]') diff --git a/app/sdks/python/docs/examples/teams/get-memberships.md b/app/sdks/python/docs/examples/teams/get-memberships.md new file mode 100644 index 0000000000..193ed976ca --- /dev/null +++ b/app/sdks/python/docs/examples/teams/get-memberships.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.get_memberships('[TEAM_ID]') diff --git a/app/sdks/python/docs/examples/teams/delete-team.md b/app/sdks/python/docs/examples/teams/get.md similarity index 80% rename from app/sdks/python/docs/examples/teams/delete-team.md rename to app/sdks/python/docs/examples/teams/get.md index f442ca8850..f8e6bc869a 100644 --- a/app/sdks/python/docs/examples/teams/delete-team.md +++ b/app/sdks/python/docs/examples/teams/get.md @@ -10,4 +10,4 @@ client = Client() teams = Teams(client) -result = teams.delete_team('[TEAM_ID]') +result = teams.get('[TEAM_ID]') diff --git a/app/sdks/python/docs/examples/teams/list-teams.md b/app/sdks/python/docs/examples/teams/list.md similarity index 85% rename from app/sdks/python/docs/examples/teams/list-teams.md rename to app/sdks/python/docs/examples/teams/list.md index 0022359833..3f6bca905e 100644 --- a/app/sdks/python/docs/examples/teams/list-teams.md +++ b/app/sdks/python/docs/examples/teams/list.md @@ -10,4 +10,4 @@ client = Client() teams = Teams(client) -result = teams.list_teams() +result = teams.list() diff --git a/app/sdks/python/docs/examples/teams/update-team.md b/app/sdks/python/docs/examples/teams/update-team.md deleted file mode 100644 index 0b74316a98..0000000000 --- a/app/sdks/python/docs/examples/teams/update-team.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.teams import Teams - -client = Client() - -(client - .set_project('') - .set_key('') -) - -teams = Teams(client) - -result = teams.update_team('[TEAM_ID]', '[NAME]') diff --git a/app/sdks/python/docs/examples/teams/update.md b/app/sdks/python/docs/examples/teams/update.md new file mode 100644 index 0000000000..996447f7f1 --- /dev/null +++ b/app/sdks/python/docs/examples/teams/update.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.teams import Teams + +client = Client() + +(client + .set_project('') + .set_key('') +) + +teams = Teams(client) + +result = teams.update('[TEAM_ID]', '[NAME]') diff --git a/app/sdks/python/docs/examples/users/create-user.md b/app/sdks/python/docs/examples/users/create-user.md deleted file mode 100644 index 0b83f46274..0000000000 --- a/app/sdks/python/docs/examples/users/create-user.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.users import Users - -client = Client() - -(client - .set_project('') - .set_key('') -) - -users = Users(client) - -result = users.create_user('email@example.com', 'password') diff --git a/app/sdks/python/docs/examples/users/delete-user-sessions.md b/app/sdks/python/docs/examples/users/create.md similarity index 75% rename from app/sdks/python/docs/examples/users/delete-user-sessions.md rename to app/sdks/python/docs/examples/users/create.md index 64a450d8df..14546109ce 100644 --- a/app/sdks/python/docs/examples/users/delete-user-sessions.md +++ b/app/sdks/python/docs/examples/users/create.md @@ -10,4 +10,4 @@ client = Client() users = Users(client) -result = users.delete_user_sessions('[USER_ID]') +result = users.create('email@example.com', 'password') diff --git a/app/sdks/python/docs/examples/users/delete-session.md b/app/sdks/python/docs/examples/users/delete-session.md new file mode 100644 index 0000000000..f1b7ec6c3b --- /dev/null +++ b/app/sdks/python/docs/examples/users/delete-session.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.delete_session('[USER_ID]', '[SESSION_ID]') diff --git a/app/sdks/python/docs/examples/users/delete-sessions.md b/app/sdks/python/docs/examples/users/delete-sessions.md new file mode 100644 index 0000000000..922a4ebeed --- /dev/null +++ b/app/sdks/python/docs/examples/users/delete-sessions.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.delete_sessions('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/delete-user-session.md b/app/sdks/python/docs/examples/users/delete-user-session.md deleted file mode 100644 index c731fca3d5..0000000000 --- a/app/sdks/python/docs/examples/users/delete-user-session.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.users import Users - -client = Client() - -(client - .set_project('') - .set_key('') -) - -users = Users(client) - -result = users.delete_user_session('[USER_ID]', '[SESSION_ID]') diff --git a/app/sdks/python/docs/examples/users/get-user.md b/app/sdks/python/docs/examples/users/get-logs.md similarity index 81% rename from app/sdks/python/docs/examples/users/get-user.md rename to app/sdks/python/docs/examples/users/get-logs.md index 1a9bc3a023..e97073137e 100644 --- a/app/sdks/python/docs/examples/users/get-user.md +++ b/app/sdks/python/docs/examples/users/get-logs.md @@ -10,4 +10,4 @@ client = Client() users = Users(client) -result = users.get_user('[USER_ID]') +result = users.get_logs('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/get-user-logs.md b/app/sdks/python/docs/examples/users/get-prefs.md similarity index 79% rename from app/sdks/python/docs/examples/users/get-user-logs.md rename to app/sdks/python/docs/examples/users/get-prefs.md index 83b06d2a2d..90c9cfac96 100644 --- a/app/sdks/python/docs/examples/users/get-user-logs.md +++ b/app/sdks/python/docs/examples/users/get-prefs.md @@ -10,4 +10,4 @@ client = Client() users = Users(client) -result = users.get_user_logs('[USER_ID]') +result = users.get_prefs('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/get-user-prefs.md b/app/sdks/python/docs/examples/users/get-sessions.md similarity index 79% rename from app/sdks/python/docs/examples/users/get-user-prefs.md rename to app/sdks/python/docs/examples/users/get-sessions.md index 1b14b86c86..19b9bc3722 100644 --- a/app/sdks/python/docs/examples/users/get-user-prefs.md +++ b/app/sdks/python/docs/examples/users/get-sessions.md @@ -10,4 +10,4 @@ client = Client() users = Users(client) -result = users.get_user_prefs('[USER_ID]') +result = users.get_sessions('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/get.md b/app/sdks/python/docs/examples/users/get.md new file mode 100644 index 0000000000..b0206edfb3 --- /dev/null +++ b/app/sdks/python/docs/examples/users/get.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.get('[USER_ID]') diff --git a/app/sdks/python/docs/examples/users/list-users.md b/app/sdks/python/docs/examples/users/list.md similarity index 85% rename from app/sdks/python/docs/examples/users/list-users.md rename to app/sdks/python/docs/examples/users/list.md index fe2082d306..0538e4251a 100644 --- a/app/sdks/python/docs/examples/users/list-users.md +++ b/app/sdks/python/docs/examples/users/list.md @@ -10,4 +10,4 @@ client = Client() users = Users(client) -result = users.list_users() +result = users.list() diff --git a/app/sdks/python/docs/examples/users/update-prefs.md b/app/sdks/python/docs/examples/users/update-prefs.md new file mode 100644 index 0000000000..f7ae308d5e --- /dev/null +++ b/app/sdks/python/docs/examples/users/update-prefs.md @@ -0,0 +1,13 @@ +from appwrite.client import Client +from appwrite.services.users import Users + +client = Client() + +(client + .set_project('') + .set_key('') +) + +users = Users(client) + +result = users.update_prefs('[USER_ID]', '') diff --git a/app/sdks/python/docs/examples/users/get-user-sessions.md b/app/sdks/python/docs/examples/users/update-status.md similarity index 77% rename from app/sdks/python/docs/examples/users/get-user-sessions.md rename to app/sdks/python/docs/examples/users/update-status.md index d91583fbe5..bdc1127427 100644 --- a/app/sdks/python/docs/examples/users/get-user-sessions.md +++ b/app/sdks/python/docs/examples/users/update-status.md @@ -10,4 +10,4 @@ client = Client() users = Users(client) -result = users.get_user_sessions('[USER_ID]') +result = users.update_status('[USER_ID]', '1') diff --git a/app/sdks/python/docs/examples/users/update-user-prefs.md b/app/sdks/python/docs/examples/users/update-user-prefs.md deleted file mode 100644 index ff310f654b..0000000000 --- a/app/sdks/python/docs/examples/users/update-user-prefs.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.users import Users - -client = Client() - -(client - .set_project('') - .set_key('') -) - -users = Users(client) - -result = users.update_user_prefs('[USER_ID]', '') diff --git a/app/sdks/python/docs/examples/users/update-user-status.md b/app/sdks/python/docs/examples/users/update-user-status.md deleted file mode 100644 index 0639c9e5f7..0000000000 --- a/app/sdks/python/docs/examples/users/update-user-status.md +++ /dev/null @@ -1,13 +0,0 @@ -from appwrite.client import Client -from appwrite.services.users import Users - -client = Client() - -(client - .set_project('') - .set_key('') -) - -users = Users(client) - -result = users.update_user_status('[USER_ID]', '1') diff --git a/app/sdks/ruby/lib/appwrite/services/database.rb b/app/sdks/ruby/lib/appwrite/services/database.rb index cf1171248d..52404c3b56 100644 --- a/app/sdks/ruby/lib/appwrite/services/database.rb +++ b/app/sdks/ruby/lib/appwrite/services/database.rb @@ -2,7 +2,7 @@ module Appwrite class Database < Service def list_collections(search: '', limit: 25, offset: 0, order_type: 'ASC') - path = '/database' + path = '/database/collections' params = { 'search': search, @@ -17,7 +17,7 @@ module Appwrite end def create_collection(name:, read:, write:, rules:) - path = '/database' + path = '/database/collections' params = { 'name': name, @@ -32,7 +32,7 @@ module Appwrite end def get_collection(collection_id:) - path = '/database/{collectionId}' + path = '/database/collections/{collectionId}' .gsub('{collection_id}', collection_id) params = { @@ -44,7 +44,7 @@ module Appwrite end def update_collection(collection_id:, name:, read:, write:, rules: []) - path = '/database/{collectionId}' + path = '/database/collections/{collectionId}' .gsub('{collection_id}', collection_id) params = { @@ -60,7 +60,7 @@ module Appwrite end def delete_collection(collection_id:) - path = '/database/{collectionId}' + path = '/database/collections/{collectionId}' .gsub('{collection_id}', collection_id) params = { @@ -72,7 +72,7 @@ module Appwrite end def list_documents(collection_id:, filters: [], offset: 0, limit: 50, order_field: '$uid', order_type: 'ASC', order_cast: 'string', search: '', first: 0, last: 0) - path = '/database/{collectionId}/documents' + path = '/database/collections/{collectionId}/documents' .gsub('{collection_id}', collection_id) params = { @@ -93,7 +93,7 @@ module Appwrite end def create_document(collection_id:, data:, read:, write:, parent_document: '', parent_property: '', parent_property_type: 'assign') - path = '/database/{collectionId}/documents' + path = '/database/collections/{collectionId}/documents' .gsub('{collection_id}', collection_id) params = { @@ -111,7 +111,7 @@ module Appwrite end def get_document(collection_id:, document_id:) - path = '/database/{collectionId}/documents/{documentId}' + path = '/database/collections/{collectionId}/documents/{documentId}' .gsub('{collection_id}', collection_id) .gsub('{document_id}', document_id) @@ -124,7 +124,7 @@ module Appwrite end def update_document(collection_id:, document_id:, data:, read:, write:) - path = '/database/{collectionId}/documents/{documentId}' + path = '/database/collections/{collectionId}/documents/{documentId}' .gsub('{collection_id}', collection_id) .gsub('{document_id}', document_id) @@ -140,7 +140,7 @@ module Appwrite end def delete_document(collection_id:, document_id:) - path = '/database/{collectionId}/documents/{documentId}' + path = '/database/collections/{collectionId}/documents/{documentId}' .gsub('{collection_id}', collection_id) .gsub('{document_id}', document_id) diff --git a/app/sdks/ruby/lib/appwrite/services/locale.rb b/app/sdks/ruby/lib/appwrite/services/locale.rb index a5c708c764..707c8b2f4a 100644 --- a/app/sdks/ruby/lib/appwrite/services/locale.rb +++ b/app/sdks/ruby/lib/appwrite/services/locale.rb @@ -1,7 +1,7 @@ module Appwrite class Locale < Service - def get_locale() + def get() path = '/locale' params = { diff --git a/app/sdks/ruby/lib/appwrite/services/storage.rb b/app/sdks/ruby/lib/appwrite/services/storage.rb index 2fe1a5762f..ea56e484d8 100644 --- a/app/sdks/ruby/lib/appwrite/services/storage.rb +++ b/app/sdks/ruby/lib/appwrite/services/storage.rb @@ -1,7 +1,7 @@ module Appwrite class Storage < Service - def list_files(search: '', limit: 25, offset: 0, order_type: 'ASC') + def list(search: '', limit: 25, offset: 0, order_type: 'ASC') path = '/storage/files' params = { @@ -16,7 +16,7 @@ module Appwrite }, params); end - def create_file(file:, read:, write:) + def create(file:, read:, write:) path = '/storage/files' params = { @@ -30,7 +30,7 @@ module Appwrite }, params); end - def get_file(file_id:) + def get(file_id:) path = '/storage/files/{fileId}' .gsub('{file_id}', file_id) @@ -42,7 +42,7 @@ module Appwrite }, params); end - def update_file(file_id:, read:, write:) + def update(file_id:, read:, write:) path = '/storage/files/{fileId}' .gsub('{file_id}', file_id) @@ -56,7 +56,7 @@ module Appwrite }, params); end - def delete_file(file_id:) + def delete(file_id:) path = '/storage/files/{fileId}' .gsub('{file_id}', file_id) @@ -68,7 +68,7 @@ module Appwrite }, params); end - def get_file_download(file_id:) + def get_download(file_id:) path = '/storage/files/{fileId}/download' .gsub('{file_id}', file_id) @@ -80,7 +80,7 @@ module Appwrite }, params); end - def get_file_preview(file_id:, width: 0, height: 0, quality: 100, background: '', output: '') + def get_preview(file_id:, width: 0, height: 0, quality: 100, background: '', output: '') path = '/storage/files/{fileId}/preview' .gsub('{file_id}', file_id) @@ -97,7 +97,7 @@ module Appwrite }, params); end - def get_file_view(file_id:, as: '') + def get_view(file_id:, as: '') path = '/storage/files/{fileId}/view' .gsub('{file_id}', file_id) diff --git a/app/sdks/ruby/lib/appwrite/services/teams.rb b/app/sdks/ruby/lib/appwrite/services/teams.rb index 16ae20e676..de6079b6f8 100644 --- a/app/sdks/ruby/lib/appwrite/services/teams.rb +++ b/app/sdks/ruby/lib/appwrite/services/teams.rb @@ -1,7 +1,7 @@ module Appwrite class Teams < Service - def list_teams(search: '', limit: 25, offset: 0, order_type: 'ASC') + def list(search: '', limit: 25, offset: 0, order_type: 'ASC') path = '/teams' params = { @@ -16,7 +16,7 @@ module Appwrite }, params); end - def create_team(name:, roles: ["owner"]) + def create(name:, roles: ["owner"]) path = '/teams' params = { @@ -29,7 +29,7 @@ module Appwrite }, params); end - def get_team(team_id:) + def get(team_id:) path = '/teams/{teamId}' .gsub('{team_id}', team_id) @@ -41,7 +41,7 @@ module Appwrite }, params); end - def update_team(team_id:, name:) + def update(team_id:, name:) path = '/teams/{teamId}' .gsub('{team_id}', team_id) @@ -54,7 +54,7 @@ module Appwrite }, params); end - def delete_team(team_id:) + def delete(team_id:) path = '/teams/{teamId}' .gsub('{team_id}', team_id) @@ -66,7 +66,7 @@ module Appwrite }, params); end - def get_team_memberships(team_id:) + def get_memberships(team_id:) path = '/teams/{teamId}/memberships' .gsub('{team_id}', team_id) @@ -78,7 +78,7 @@ module Appwrite }, params); end - def create_team_membership(team_id:, email:, roles:, url:, name: '') + def create_membership(team_id:, email:, roles:, url:, name: '') path = '/teams/{teamId}/memberships' .gsub('{team_id}', team_id) @@ -94,7 +94,7 @@ module Appwrite }, params); end - def delete_team_membership(team_id:, invite_id:) + def delete_membership(team_id:, invite_id:) path = '/teams/{teamId}/memberships/{inviteId}' .gsub('{team_id}', team_id) .gsub('{invite_id}', invite_id) diff --git a/app/sdks/ruby/lib/appwrite/services/users.rb b/app/sdks/ruby/lib/appwrite/services/users.rb index 99927523f0..75b1701f2d 100644 --- a/app/sdks/ruby/lib/appwrite/services/users.rb +++ b/app/sdks/ruby/lib/appwrite/services/users.rb @@ -1,7 +1,7 @@ module Appwrite class Users < Service - def list_users(search: '', limit: 25, offset: 0, order_type: 'ASC') + def list(search: '', limit: 25, offset: 0, order_type: 'ASC') path = '/users' params = { @@ -16,7 +16,7 @@ module Appwrite }, params); end - def create_user(email:, password:, name: '') + def create(email:, password:, name: '') path = '/users' params = { @@ -30,7 +30,7 @@ module Appwrite }, params); end - def get_user(user_id:) + def get(user_id:) path = '/users/{userId}' .gsub('{user_id}', user_id) @@ -42,7 +42,7 @@ module Appwrite }, params); end - def get_user_logs(user_id:) + def get_logs(user_id:) path = '/users/{userId}/logs' .gsub('{user_id}', user_id) @@ -54,7 +54,7 @@ module Appwrite }, params); end - def get_user_prefs(user_id:) + def get_prefs(user_id:) path = '/users/{userId}/prefs' .gsub('{user_id}', user_id) @@ -66,7 +66,7 @@ module Appwrite }, params); end - def update_user_prefs(user_id:, prefs:) + def update_prefs(user_id:, prefs:) path = '/users/{userId}/prefs' .gsub('{user_id}', user_id) @@ -79,7 +79,7 @@ module Appwrite }, params); end - def get_user_sessions(user_id:) + def get_sessions(user_id:) path = '/users/{userId}/sessions' .gsub('{user_id}', user_id) @@ -91,7 +91,7 @@ module Appwrite }, params); end - def delete_user_sessions(user_id:) + def delete_sessions(user_id:) path = '/users/{userId}/sessions' .gsub('{user_id}', user_id) @@ -103,7 +103,7 @@ module Appwrite }, params); end - def delete_user_session(user_id:, session_id:) + def delete_session(user_id:, session_id:) path = '/users/{userId}/sessions/:session' .gsub('{user_id}', user_id) @@ -116,7 +116,7 @@ module Appwrite }, params); end - def update_user_status(user_id:, status:) + def update_status(user_id:, status:) path = '/users/{userId}/status' .gsub('{user_id}', user_id) diff --git a/gulpfile.js b/gulpfile.js index d839bde5e8..a3b43be5a9 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -73,7 +73,8 @@ const configApp = { const configDep = { mainFile: 'app-dep.js', src: [ - 'node_modules/appwrite/src/sdk.js', + //'node_modules/appwrite/src/sdk.js', + 'public/scripts/dependencies/appwrite.js', 'public/scripts/dependencies/chart.js', 'public/scripts/dependencies/markdown-it.js', 'public/scripts/dependencies/pell.js', diff --git a/package.json b/package.json index 29308a8b41..e84ed569b8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "license": "BSD-3-Clause", "repository": "public", "devDependencies": { - "appwrite": "^1.0.23", "gulp": "^4.0.0", "gulp-clean-css": "^4.0.0", "gulp-concat": "2.5.2", diff --git a/public/dist/scripts/app-dep.js b/public/dist/scripts/app-dep.js index a01a015516..683bc54dd7 100644 --- a/public/dist/scripts/app-dep.js +++ b/public/dist/scripts/app-dep.js @@ -5,7 +5,7 @@ {http.addGlobalHeader('X-Appwrite-Locale',value);config.locale=value;return this;};let setMode=function(value) {http.addGlobalHeader('X-Appwrite-Mode',value);config.mode=value;return this;};let http=function(document){let globalParams=[],globalHeaders=[];let addParam=function(url,param,value){let a=document.createElement('a'),regex=/(?:\?|&|&)+([^=]+)(?:=([^&]*))*/g;let match,str=[];a.href=url;param=encodeURIComponent(param);while(match=regex.exec(a.search))if(param!==match[1])str.push(match[1]+(match[2]?"="+match[2]:""));str.push(param+(value?"="+encodeURIComponent(value):""));a.search=str.join("&");return a.href;};let buildQuery=function(params){let str=[];for(let p in params){if(Array.isArray(params[p])){for(let index=0;index=request.status){let data=request.response;let contentType=this.getResponseHeader('content-type')||'';contentType=contentType.substring(0,contentType.indexOf(';'));switch(contentType){case'application/json':data=JSON.parse(data);break;} resolve(data);}else{reject(new Error(request.statusText));}};if(progress){request.addEventListener('progress',progress);request.upload.addEventListener('progress',progress,false);} request.onerror=function(){reject(new Error("Network Error"));};request.send(params);})};return{'get':function(path,headers={},params={}){return call('GET',path+((Object.keys(params).length>0)?'?'+buildQuery(params):''),headers,{});},'post':function(path,headers={},params={},progress=null){return call('POST',path,headers,params,progress);},'put':function(path,headers={},params={},progress=null){return call('PUT',path,headers,params,progress);},'patch':function(path,headers={},params={},progress=null){return call('PATCH',path,headers,params,progress);},'delete':function(path,headers={},params={},progress=null){return call('DELETE',path,headers,params,progress);},'addGlobalParam':addGlobalParam,'addGlobalHeader':addGlobalHeader}}(window.document);let iframe=function(method,url,params){let form=document.createElement('form');form.setAttribute('method',method);form.setAttribute('action',config.endpoint+url);for(let key in params){if(params.hasOwnProperty(key)){let hiddenField=document.createElement("input");hiddenField.setAttribute("type","hidden");hiddenField.setAttribute("name",key);hiddenField.setAttribute("value",params[key]);form.appendChild(hiddenField);}} -document.body.appendChild(form);return form.submit();};let account={get:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json'},payload);},delete:function(){let path='/account';let payload={};return http.delete(path,{'content-type':'application/json'},payload);},updateEmail:function(email,password){if(email===undefined){throw new Error('Missing required parameter: "email"');} +document.body.appendChild(form);return form.submit();};let account={get:function(){let path='/account';let payload={};return http.get(path,{'content-type':'application/json',},payload);},create:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"');} +if(password===undefined){throw new Error('Missing required parameter: "password"');} +let path='/account';let payload={};if(email){payload['email']=email;} +if(password){payload['password']=password;} +if(name){payload['name']=name;} +return http.post(path,{'content-type':'application/json',},payload);},delete:function(){let path='/account';let payload={};return http.delete(path,{'content-type':'application/json',},payload);},updateEmail:function(email,password){if(email===undefined){throw new Error('Missing required parameter: "email"');} if(password===undefined){throw new Error('Missing required parameter: "password"');} let path='/account/email';let payload={};if(email){payload['email']=email;} if(password){payload['password']=password;} -return http.patch(path,{'content-type':'application/json'},payload);},updateName:function(name){if(name===undefined){throw new Error('Missing required parameter: "name"');} +return http.patch(path,{'content-type':'application/json',},payload);},getLogs:function(){let path='/account/logs';let payload={};return http.get(path,{'content-type':'application/json',},payload);},updateName:function(name){if(name===undefined){throw new Error('Missing required parameter: "name"');} let path='/account/name';let payload={};if(name){payload['name']=name;} -return http.patch(path,{'content-type':'application/json'},payload);},updatePassword:function(password,oldPassword){if(password===undefined){throw new Error('Missing required parameter: "password"');} +return http.patch(path,{'content-type':'application/json',},payload);},updatePassword:function(password,oldPassword){if(password===undefined){throw new Error('Missing required parameter: "password"');} if(oldPassword===undefined){throw new Error('Missing required parameter: "oldPassword"');} let path='/account/password';let payload={};if(password){payload['password']=password;} if(oldPassword){payload['old-password']=oldPassword;} -return http.patch(path,{'content-type':'application/json'},payload);},getPrefs:function(){let path='/account/prefs';let payload={};return http.get(path,{'content-type':'application/json'},payload);},updatePrefs:function(prefs){if(prefs===undefined){throw new Error('Missing required parameter: "prefs"');} +return http.patch(path,{'content-type':'application/json',},payload);},getPrefs:function(){let path='/account/prefs';let payload={};return http.get(path,{'content-type':'application/json',},payload);},updatePrefs:function(prefs){if(prefs===undefined){throw new Error('Missing required parameter: "prefs"');} let path='/account/prefs';let payload={};if(prefs){payload['prefs']=prefs;} -return http.patch(path,{'content-type':'application/json'},payload);},getSecurity:function(){let path='/account/security';let payload={};return http.get(path,{'content-type':'application/json'},payload);},getSessions:function(){let path='/account/sessions';let payload={};return http.get(path,{'content-type':'application/json'},payload);}};let auth={login:function(email,password,success,failure){if(email===undefined){throw new Error('Missing required parameter: "email"');} -if(password===undefined){throw new Error('Missing required parameter: "password"');} -if(success===undefined){throw new Error('Missing required parameter: "success"');} -if(failure===undefined){throw new Error('Missing required parameter: "failure"');} -let path='/auth/login';let payload={};if(email){payload['email']=email;} -if(password){payload['password']=password;} -if(success){payload['success']=success;} -if(failure){payload['failure']=failure;} -payload['project']=config.project;return iframe('post',path,payload);},logout:function(){let path='/auth/logout';let payload={};return http.delete(path,{'content-type':'application/json'},payload);},logoutBySession:function(id){if(id===undefined){throw new Error('Missing required parameter: "id"');} -let path='/auth/logout/{id}'.replace(new RegExp('{id}','g'),id);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},oauth:function(provider,success='',failure=''){if(provider===undefined){throw new Error('Missing required parameter: "provider"');} -let path='/auth/oauth/{provider}'.replace(new RegExp('{provider}','g'),provider);let payload={};if(success){payload['success']=success;} -if(failure){payload['failure']=failure;} -return http.get(path,{'content-type':'application/json'},payload);},recovery:function(email,reset){if(email===undefined){throw new Error('Missing required parameter: "email"');} -if(reset===undefined){throw new Error('Missing required parameter: "reset"');} -let path='/auth/recovery';let payload={};if(email){payload['email']=email;} -if(reset){payload['reset']=reset;} -return http.post(path,{'content-type':'application/json'},payload);},recoveryReset:function(userId,token,passwordA,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} -if(token===undefined){throw new Error('Missing required parameter: "token"');} +return http.patch(path,{'content-type':'application/json',},payload);},createRecovery:function(email,url){if(email===undefined){throw new Error('Missing required parameter: "email"');} +if(url===undefined){throw new Error('Missing required parameter: "url"');} +let path='/account/recovery';let payload={};if(email){payload['email']=email;} +if(url){payload['url']=url;} +return http.post(path,{'content-type':'application/json',},payload);},updateRecovery:function(userId,secret,passwordA,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +if(secret===undefined){throw new Error('Missing required parameter: "secret"');} if(passwordA===undefined){throw new Error('Missing required parameter: "passwordA"');} if(passwordB===undefined){throw new Error('Missing required parameter: "passwordB"');} -let path='/auth/recovery/reset';let payload={};if(userId){payload['userId']=userId;} -if(token){payload['token']=token;} +let path='/account/recovery';let payload={};if(userId){payload['userId']=userId;} +if(secret){payload['secret']=secret;} if(passwordA){payload['password-a']=passwordA;} if(passwordB){payload['password-b']=passwordB;} -return http.put(path,{'content-type':'application/json'},payload);},register:function(email,password,confirm,success='',failure='',name=''){if(email===undefined){throw new Error('Missing required parameter: "email"');} +return http.put(path,{'content-type':'application/json',},payload);},getSessions:function(){let path='/account/sessions';let payload={};return http.get(path,{'content-type':'application/json',},payload);},createSession:function(email,password){if(email===undefined){throw new Error('Missing required parameter: "email"');} if(password===undefined){throw new Error('Missing required parameter: "password"');} -if(confirm===undefined){throw new Error('Missing required parameter: "confirm"');} -let path='/auth/register';let payload={};if(email){payload['email']=email;} +let path='/account/sessions';let payload={};if(email){payload['email']=email;} if(password){payload['password']=password;} -if(confirm){payload['confirm']=confirm;} -if(success){payload['success']=success;} +return http.post(path,{'content-type':'application/json',},payload);},deleteSessions:function(){let path='/account/sessions';let payload={};return http.delete(path,{'content-type':'application/json',},payload);},deleteCurrentSession:function(){let path='/account/sessions/current';let payload={};return http.delete(path,{'content-type':'application/json',},payload);},createOAuthSession:function(provider,success,failure){if(provider===undefined){throw new Error('Missing required parameter: "provider"');} +if(success===undefined){throw new Error('Missing required parameter: "success"');} +if(failure===undefined){throw new Error('Missing required parameter: "failure"');} +let path='/account/sessions/oauth/{provider}'.replace(new RegExp('{provider}','g'),provider);let payload={};if(success){payload['success']=success;} if(failure){payload['failure']=failure;} -if(name){payload['name']=name;} -payload['project']=config.project;return iframe('post',path,payload);},confirm:function(userId,token){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} -if(token===undefined){throw new Error('Missing required parameter: "token"');} -let path='/auth/register/confirm';let payload={};if(userId){payload['userId']=userId;} -if(token){payload['token']=token;} -return http.post(path,{'content-type':'application/json'},payload);},confirmResend:function(confirm){if(confirm===undefined){throw new Error('Missing required parameter: "confirm"');} -let path='/auth/register/confirm/resend';let payload={};if(confirm){payload['confirm']=confirm;} -return http.post(path,{'content-type':'application/json'},payload);}};let avatars={getBrowser:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"');} +return http.get(path,{'content-type':'application/json',},payload);},deleteSession:function(id){if(id===undefined){throw new Error('Missing required parameter: "id"');} +let path='/account/sessions/{id}'.replace(new RegExp('{id}','g'),id);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},createVerification:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"');} +let path='/account/verification';let payload={};if(url){payload['url']=url;} +return http.post(path,{'content-type':'application/json',},payload);},updateVerification:function(userId,secret,passwordB){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +if(secret===undefined){throw new Error('Missing required parameter: "secret"');} +if(passwordB===undefined){throw new Error('Missing required parameter: "passwordB"');} +let path='/account/verification';let payload={};if(userId){payload['userId']=userId;} +if(secret){payload['secret']=secret;} +if(passwordB){payload['password-b']=passwordB;} +return http.put(path,{'content-type':'application/json',},payload);}};let avatars={getBrowser:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"');} let path='/avatars/browsers/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload['width']=width;} if(height){payload['height']=height;} if(quality){payload['quality']=quality;} -return http.get(path,{'content-type':'application/json'},payload);},getCreditCard:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"');} +return http.get(path,{'content-type':'application/json',},payload);},getCreditCard:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"');} let path='/avatars/credit-cards/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload['width']=width;} if(height){payload['height']=height;} if(quality){payload['quality']=quality;} -return http.get(path,{'content-type':'application/json'},payload);},getFavicon:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"');} +return http.get(path,{'content-type':'application/json',},payload);},getFavicon:function(url){if(url===undefined){throw new Error('Missing required parameter: "url"');} let path='/avatars/favicon';let payload={};if(url){payload['url']=url;} -return http.get(path,{'content-type':'application/json'},payload);},getFlag:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"');} +return http.get(path,{'content-type':'application/json',},payload);},getFlag:function(code,width=100,height=100,quality=100){if(code===undefined){throw new Error('Missing required parameter: "code"');} let path='/avatars/flags/{code}'.replace(new RegExp('{code}','g'),code);let payload={};if(width){payload['width']=width;} if(height){payload['height']=height;} if(quality){payload['quality']=quality;} -return http.get(path,{'content-type':'application/json'},payload);},getImage:function(url,width=400,height=400){if(url===undefined){throw new Error('Missing required parameter: "url"');} +return http.get(path,{'content-type':'application/json',},payload);},getImage:function(url,width=400,height=400){if(url===undefined){throw new Error('Missing required parameter: "url"');} let path='/avatars/image';let payload={};if(url){payload['url']=url;} if(width){payload['width']=width;} if(height){payload['height']=height;} -return http.get(path,{'content-type':'application/json'},payload);},getQR:function(text,size=400,margin=1,download=0){if(text===undefined){throw new Error('Missing required parameter: "text"');} +return http.get(path,{'content-type':'application/json',},payload);},getQR:function(text,size=400,margin=1,download=0){if(text===undefined){throw new Error('Missing required parameter: "text"');} let path='/avatars/qr';let payload={};if(text){payload['text']=text;} if(size){payload['size']=size;} if(margin){payload['margin']=margin;} if(download){payload['download']=download;} -return http.get(path,{'content-type':'application/json'},payload);}};let database={listCollections:function(search='',limit=25,offset=0,orderType='ASC'){let path='/database';let payload={};if(search){payload['search']=search;} +return http.get(path,{'content-type':'application/json',},payload);}};let database={listCollections:function(search='',limit=25,offset=0,orderType='ASC'){let path='/database/collections';let payload={};if(search){payload['search']=search;} if(limit){payload['limit']=limit;} if(offset){payload['offset']=offset;} if(orderType){payload['orderType']=orderType;} -return http.get(path,{'content-type':'application/json'},payload);},createCollection:function(name,read=[],write=[],rules=[]){if(name===undefined){throw new Error('Missing required parameter: "name"');} -let path='/database';let payload={};if(name){payload['name']=name;} +return http.get(path,{'content-type':'application/json',},payload);},createCollection:function(name,read,write,rules){if(name===undefined){throw new Error('Missing required parameter: "name"');} +if(read===undefined){throw new Error('Missing required parameter: "read"');} +if(write===undefined){throw new Error('Missing required parameter: "write"');} +if(rules===undefined){throw new Error('Missing required parameter: "rules"');} +let path='/database/collections';let payload={};if(name){payload['name']=name;} if(read){payload['read']=read;} if(write){payload['write']=write;} if(rules){payload['rules']=rules;} -return http.post(path,{'content-type':'application/json'},payload);},getCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateCollection:function(collectionId,name,read=[],write=[],rules=[]){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} +return http.post(path,{'content-type':'application/json',},payload);},getCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} +let path='/database/collections/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},updateCollection:function(collectionId,name,read,write,rules=[]){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(name){payload['name']=name;} +if(read===undefined){throw new Error('Missing required parameter: "read"');} +if(write===undefined){throw new Error('Missing required parameter: "write"');} +let path='/database/collections/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(name){payload['name']=name;} if(read){payload['read']=read;} if(write){payload['write']=write;} if(rules){payload['rules']=rules;} -return http.put(path,{'content-type':'application/json'},payload);},deleteCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} -let path='/database/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},listDocuments:function(collectionId,filters=[],offset=0,limit=50,orderField='$uid',orderType='ASC',orderCast='string',search='',first=0,last=0){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} -let path='/database/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(filters){payload['filters']=filters;} +return http.put(path,{'content-type':'application/json',},payload);},deleteCollection:function(collectionId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} +let path='/database/collections/{collectionId}'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},listDocuments:function(collectionId,filters=[],offset=0,limit=50,orderField='$uid',orderType='ASC',orderCast='string',search='',first=0,last=0){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} +let path='/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(filters){payload['filters']=filters;} if(offset){payload['offset']=offset;} if(limit){payload['limit']=limit;} if(orderField){payload['order-field']=orderField;} @@ -118,25 +119,29 @@ if(orderCast){payload['order-cast']=orderCast;} if(search){payload['search']=search;} if(first){payload['first']=first;} if(last){payload['last']=last;} -return http.get(path,{'content-type':'application/json'},payload);},createDocument:function(collectionId,data,read=[],write=[],parentDocument='',parentProperty='',parentPropertyType='assign'){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} +return http.get(path,{'content-type':'application/json',},payload);},createDocument:function(collectionId,data,read,write,parentDocument='',parentProperty='',parentPropertyType='assign'){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} if(data===undefined){throw new Error('Missing required parameter: "data"');} -let path='/database/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(data){payload['data']=data;} +if(read===undefined){throw new Error('Missing required parameter: "read"');} +if(write===undefined){throw new Error('Missing required parameter: "write"');} +let path='/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}','g'),collectionId);let payload={};if(data){payload['data']=data;} if(read){payload['read']=read;} if(write){payload['write']=write;} if(parentDocument){payload['parentDocument']=parentDocument;} if(parentProperty){payload['parentProperty']=parentProperty;} if(parentPropertyType){payload['parentPropertyType']=parentPropertyType;} -return http.post(path,{'content-type':'application/json'},payload);},getDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} +return http.post(path,{'content-type':'application/json',},payload);},getDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} if(documentId===undefined){throw new Error('Missing required parameter: "documentId"');} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateDocument:function(collectionId,documentId,data,read=[],write=[]){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} +let path='/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},updateDocument:function(collectionId,documentId,data,read,write){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} if(documentId===undefined){throw new Error('Missing required parameter: "documentId"');} if(data===undefined){throw new Error('Missing required parameter: "data"');} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};if(data){payload['data']=data;} +if(read===undefined){throw new Error('Missing required parameter: "read"');} +if(write===undefined){throw new Error('Missing required parameter: "write"');} +let path='/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};if(data){payload['data']=data;} if(read){payload['read']=read;} if(write){payload['write']=write;} -return http.patch(path,{'content-type':'application/json'},payload);},deleteDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} +return http.patch(path,{'content-type':'application/json',},payload);},deleteDocument:function(collectionId,documentId){if(collectionId===undefined){throw new Error('Missing required parameter: "collectionId"');} if(documentId===undefined){throw new Error('Missing required parameter: "documentId"');} -let path='/database/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);}};let locale={getLocale:function(){let path='/locale';let payload={};return http.get(path,{'content-type':'application/json'},payload);},getCountries:function(){let path='/locale/countries';let payload={};return http.get(path,{'content-type':'application/json'},payload);},getCountriesEU:function(){let path='/locale/countries/eu';let payload={};return http.get(path,{'content-type':'application/json'},payload);},getCountriesPhones:function(){let path='/locale/countries/phones';let payload={};return http.get(path,{'content-type':'application/json'},payload);},getCurrencies:function(){let path='/locale/currencies';let payload={};return http.get(path,{'content-type':'application/json'},payload);}};let projects={listProjects:function(){let path='/projects';let payload={};return http.get(path,{'content-type':'application/json'},payload);},createProject:function(name,teamId,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(name===undefined){throw new Error('Missing required parameter: "name"');} +let path='/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}','g'),collectionId).replace(new RegExp('{documentId}','g'),documentId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);}};let locale={get:function(){let path='/locale';let payload={};return http.get(path,{'content-type':'application/json',},payload);},getContinents:function(){let path='/locale/continents';let payload={};return http.get(path,{'content-type':'application/json',},payload);},getCountries:function(){let path='/locale/countries';let payload={};return http.get(path,{'content-type':'application/json',},payload);},getCountriesEU:function(){let path='/locale/countries/eu';let payload={};return http.get(path,{'content-type':'application/json',},payload);},getCountriesPhones:function(){let path='/locale/countries/phones';let payload={};return http.get(path,{'content-type':'application/json',},payload);},getCurrencies:function(){let path='/locale/currencies';let payload={};return http.get(path,{'content-type':'application/json',},payload);}};let projects={list:function(){let path='/projects';let payload={};return http.get(path,{'content-type':'application/json',},payload);},create:function(name,teamId,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(name===undefined){throw new Error('Missing required parameter: "name"');} if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} let path='/projects';let payload={};if(name){payload['name']=name;} if(teamId){payload['teamId']=teamId;} @@ -149,8 +154,8 @@ if(legalState){payload['legalState']=legalState;} if(legalCity){payload['legalCity']=legalCity;} if(legalAddress){payload['legalAddress']=legalAddress;} if(legalTaxId){payload['legalTaxId']=legalTaxId;} -return http.post(path,{'content-type':'application/json'},payload);},getProject:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} -let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateProject:function(projectId,name,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.post(path,{'content-type':'application/json',},payload);},get:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},update:function(projectId,name,description='',logo='',url='',legalName='',legalCountry='',legalState='',legalCity='',legalAddress='',legalTaxId=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload['name']=name;} if(description){payload['description']=description;} @@ -162,30 +167,30 @@ if(legalState){payload['legalState']=legalState;} if(legalCity){payload['legalCity']=legalCity;} if(legalAddress){payload['legalAddress']=legalAddress;} if(legalTaxId){payload['legalTaxId']=legalTaxId;} -return http.patch(path,{'content-type':'application/json'},payload);},deleteProject:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} -let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},listKeys:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},createKey:function(projectId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.patch(path,{'content-type':'application/json',},payload);},delete:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},listKeys:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},createKey:function(projectId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} if(scopes===undefined){throw new Error('Missing required parameter: "scopes"');} let path='/projects/{projectId}/keys'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(name){payload['name']=name;} if(scopes){payload['scopes']=scopes;} -return http.post(path,{'content-type':'application/json'},payload);},getKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.post(path,{'content-type':'application/json',},payload);},getKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(keyId===undefined){throw new Error('Missing required parameter: "keyId"');} -let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateKey:function(projectId,keyId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},updateKey:function(projectId,keyId,name,scopes){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(keyId===undefined){throw new Error('Missing required parameter: "keyId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} if(scopes===undefined){throw new Error('Missing required parameter: "scopes"');} let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};if(name){payload['name']=name;} if(scopes){payload['scopes']=scopes;} -return http.put(path,{'content-type':'application/json'},payload);},deleteKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.put(path,{'content-type':'application/json',},payload);},deleteKey:function(projectId,keyId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(keyId===undefined){throw new Error('Missing required parameter: "keyId"');} -let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},updateProjectOAuth:function(projectId,provider,appId='',secret=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{keyId}','g'),keyId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},updateOAuth:function(projectId,provider,appId='',secret=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(provider===undefined){throw new Error('Missing required parameter: "provider"');} let path='/projects/{projectId}/oauth'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(provider){payload['provider']=provider;} if(appId){payload['appId']=appId;} if(secret){payload['secret']=secret;} -return http.patch(path,{'content-type':'application/json'},payload);},listPlatforms:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},createPlatform:function(projectId,type,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.patch(path,{'content-type':'application/json',},payload);},listPlatforms:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},createPlatform:function(projectId,type,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(type===undefined){throw new Error('Missing required parameter: "type"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} let path='/projects/{projectId}/platforms'.replace(new RegExp('{projectId}','g'),projectId);let payload={};if(type){payload['type']=type;} @@ -193,19 +198,19 @@ if(name){payload['name']=name;} if(key){payload['key']=key;} if(store){payload['store']=store;} if(url){payload['url']=url;} -return http.post(path,{'content-type':'application/json'},payload);},getPlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.post(path,{'content-type':'application/json',},payload);},getPlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(platformId===undefined){throw new Error('Missing required parameter: "platformId"');} -let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updatePlatform:function(projectId,platformId,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},updatePlatform:function(projectId,platformId,name,key='',store='',url=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(platformId===undefined){throw new Error('Missing required parameter: "platformId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};if(name){payload['name']=name;} if(key){payload['key']=key;} if(store){payload['store']=store;} if(url){payload['url']=url;} -return http.put(path,{'content-type':'application/json'},payload);},deletePlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.put(path,{'content-type':'application/json',},payload);},deletePlatform:function(projectId,platformId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(platformId===undefined){throw new Error('Missing required parameter: "platformId"');} -let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},listTasks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/tasks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},createTask:function(projectId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{platformId}','g'),platformId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},listTasks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/tasks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},createTask:function(projectId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} if(status===undefined){throw new Error('Missing required parameter: "status"');} if(schedule===undefined){throw new Error('Missing required parameter: "schedule"');} @@ -221,9 +226,9 @@ if(httpUrl){payload['httpUrl']=httpUrl;} if(httpHeaders){payload['httpHeaders']=httpHeaders;} if(httpUser){payload['httpUser']=httpUser;} if(httpPass){payload['httpPass']=httpPass;} -return http.post(path,{'content-type':'application/json'},payload);},getTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.post(path,{'content-type':'application/json',},payload);},getTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(taskId===undefined){throw new Error('Missing required parameter: "taskId"');} -let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateTask:function(projectId,taskId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},updateTask:function(projectId,taskId,name,status,schedule,security,httpMethod,httpUrl,httpHeaders=[],httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(taskId===undefined){throw new Error('Missing required parameter: "taskId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} if(status===undefined){throw new Error('Missing required parameter: "status"');} @@ -240,11 +245,11 @@ if(httpUrl){payload['httpUrl']=httpUrl;} if(httpHeaders){payload['httpHeaders']=httpHeaders;} if(httpUser){payload['httpUser']=httpUser;} if(httpPass){payload['httpPass']=httpPass;} -return http.put(path,{'content-type':'application/json'},payload);},deleteTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.put(path,{'content-type':'application/json',},payload);},deleteTask:function(projectId,taskId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(taskId===undefined){throw new Error('Missing required parameter: "taskId"');} -let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},getProjectUsage:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/usage'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},listWebhooks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} -let path='/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},createWebhook:function(projectId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{taskId}','g'),taskId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},getUsage:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/usage'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},listWebhooks:function(projectId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}','g'),projectId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},createWebhook:function(projectId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} if(events===undefined){throw new Error('Missing required parameter: "events"');} if(url===undefined){throw new Error('Missing required parameter: "url"');} @@ -255,9 +260,9 @@ if(url){payload['url']=url;} if(security){payload['security']=security;} if(httpUser){payload['httpUser']=httpUser;} if(httpPass){payload['httpPass']=httpPass;} -return http.post(path,{'content-type':'application/json'},payload);},getWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.post(path,{'content-type':'application/json',},payload);},getWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"');} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateWebhook:function(projectId,webhookId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},updateWebhook:function(projectId,webhookId,name,events,url,security,httpUser='',httpPass=''){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} if(events===undefined){throw new Error('Missing required parameter: "events"');} @@ -269,91 +274,87 @@ if(url){payload['url']=url;} if(security){payload['security']=security;} if(httpUser){payload['httpUser']=httpUser;} if(httpPass){payload['httpPass']=httpPass;} -return http.put(path,{'content-type':'application/json'},payload);},deleteWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} +return http.put(path,{'content-type':'application/json',},payload);},deleteWebhook:function(projectId,webhookId){if(projectId===undefined){throw new Error('Missing required parameter: "projectId"');} if(webhookId===undefined){throw new Error('Missing required parameter: "webhookId"');} -let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);}};let storage={listFiles:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';let payload={};if(search){payload['search']=search;} +let path='/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}','g'),projectId).replace(new RegExp('{webhookId}','g'),webhookId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);}};let storage={list:function(search='',limit=25,offset=0,orderType='ASC'){let path='/storage/files';let payload={};if(search){payload['search']=search;} if(limit){payload['limit']=limit;} if(offset){payload['offset']=offset;} if(orderType){payload['orderType']=orderType;} -return http.get(path,{'content-type':'application/json'},payload);},createFile:function(files,read=[],write=[],folderId=''){if(files===undefined){throw new Error('Missing required parameter: "files"');} -let path='/storage/files';let payload={};if(files){payload['files']=files;} +return http.get(path,{'content-type':'application/json',},payload);},create:function(file,read,write){if(file===undefined){throw new Error('Missing required parameter: "file"');} +if(read===undefined){throw new Error('Missing required parameter: "read"');} +if(write===undefined){throw new Error('Missing required parameter: "write"');} +let path='/storage/files';let payload={};if(file){payload['file']=file;} if(read){payload['read']=read;} if(write){payload['write']=write;} -if(folderId){payload['folderId']=folderId;} -return http.post(path,{'content-type':'multipart/form-data'},payload);},getFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} -let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateFile:function(fileId,read=[],write=[],folderId=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} +return http.post(path,{'content-type':'multipart/form-data',},payload);},get:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} +let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},update:function(fileId,read,write){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} +if(read===undefined){throw new Error('Missing required parameter: "read"');} +if(write===undefined){throw new Error('Missing required parameter: "write"');} let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(read){payload['read']=read;} if(write){payload['write']=write;} -if(folderId){payload['folderId']=folderId;} -return http.put(path,{'content-type':'application/json'},payload);},deleteFile:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} -let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},getFileDownload:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} -let path='/storage/files/{fileId}/download'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},getFilePreview:function(fileId,width=0,height=0,quality=100,background='',output=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} +return http.put(path,{'content-type':'application/json',},payload);},delete:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} +let path='/storage/files/{fileId}'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},getDownload:function(fileId){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} +let path='/storage/files/{fileId}/download'.replace(new RegExp('{fileId}','g'),fileId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},getPreview:function(fileId,width=0,height=0,quality=100,background='',output=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} let path='/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(width){payload['width']=width;} if(height){payload['height']=height;} if(quality){payload['quality']=quality;} if(background){payload['background']=background;} if(output){payload['output']=output;} -return http.get(path,{'content-type':'application/json'},payload);},getFileView:function(fileId,as=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} +return http.get(path,{'content-type':'application/json',},payload);},getView:function(fileId,as=''){if(fileId===undefined){throw new Error('Missing required parameter: "fileId"');} let path='/storage/files/{fileId}/view'.replace(new RegExp('{fileId}','g'),fileId);let payload={};if(as){payload['as']=as;} -return http.get(path,{'content-type':'application/json'},payload);}};let teams={listTeams:function(search='',limit=25,offset=0,orderType='ASC'){let path='/teams';let payload={};if(search){payload['search']=search;} +return http.get(path,{'content-type':'application/json',},payload);}};let teams={list:function(search='',limit=25,offset=0,orderType='ASC'){let path='/teams';let payload={};if(search){payload['search']=search;} if(limit){payload['limit']=limit;} if(offset){payload['offset']=offset;} if(orderType){payload['orderType']=orderType;} -return http.get(path,{'content-type':'application/json'},payload);},createTeam:function(name,roles=["owner"]){if(name===undefined){throw new Error('Missing required parameter: "name"');} +return http.get(path,{'content-type':'application/json',},payload);},create:function(name,roles=["owner"]){if(name===undefined){throw new Error('Missing required parameter: "name"');} let path='/teams';let payload={};if(name){payload['name']=name;} if(roles){payload['roles']=roles;} -return http.post(path,{'content-type':'application/json'},payload);},getTeam:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} -let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateTeam:function(teamId,name){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} +return http.post(path,{'content-type':'application/json',},payload);},get:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} +let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},update:function(teamId,name){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} if(name===undefined){throw new Error('Missing required parameter: "name"');} let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};if(name){payload['name']=name;} -return http.put(path,{'content-type':'application/json'},payload);},deleteTeam:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} -let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},getTeamMembers:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} -let path='/teams/{teamId}/members'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},createTeamMembership:function(teamId,email,roles,redirect,name=''){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} +return http.put(path,{'content-type':'application/json',},payload);},delete:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} +let path='/teams/{teamId}'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},getMemberships:function(teamId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} +let path='/teams/{teamId}/memberships'.replace(new RegExp('{teamId}','g'),teamId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},createMembership:function(teamId,email,roles,url,name=''){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} if(email===undefined){throw new Error('Missing required parameter: "email"');} if(roles===undefined){throw new Error('Missing required parameter: "roles"');} -if(redirect===undefined){throw new Error('Missing required parameter: "redirect"');} +if(url===undefined){throw new Error('Missing required parameter: "url"');} let path='/teams/{teamId}/memberships'.replace(new RegExp('{teamId}','g'),teamId);let payload={};if(email){payload['email']=email;} if(name){payload['name']=name;} if(roles){payload['roles']=roles;} -if(redirect){payload['redirect']=redirect;} -return http.post(path,{'content-type':'application/json'},payload);},deleteTeamMembership:function(teamId,inviteId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} +if(url){payload['url']=url;} +return http.post(path,{'content-type':'application/json',},payload);},deleteMembership:function(teamId,inviteId){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"');} -let path='/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},createTeamMembershipResend:function(teamId,inviteId,redirect){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} -if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"');} -if(redirect===undefined){throw new Error('Missing required parameter: "redirect"');} -let path='/teams/{teamId}/memberships/{inviteId}/resend'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};if(redirect){payload['redirect']=redirect;} -return http.post(path,{'content-type':'application/json'},payload);},updateTeamMembershipStatus:function(teamId,inviteId,userId,secret,success='',failure=''){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} +let path='/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},updateMembershipStatus:function(teamId,inviteId,userId,secret){if(teamId===undefined){throw new Error('Missing required parameter: "teamId"');} if(inviteId===undefined){throw new Error('Missing required parameter: "inviteId"');} if(userId===undefined){throw new Error('Missing required parameter: "userId"');} if(secret===undefined){throw new Error('Missing required parameter: "secret"');} let path='/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}','g'),teamId).replace(new RegExp('{inviteId}','g'),inviteId);let payload={};if(userId){payload['userId']=userId;} if(secret){payload['secret']=secret;} -if(success){payload['success']=success;} -if(failure){payload['failure']=failure;} -payload['project']=config.project;return iframe('patch',path,payload);}};let users={listUsers:function(search='',limit=25,offset=0,orderType='ASC'){let path='/users';let payload={};if(search){payload['search']=search;} +payload['project']=config.project;return iframe('patch',path,payload);}};let users={list:function(search='',limit=25,offset=0,orderType='ASC'){let path='/users';let payload={};if(search){payload['search']=search;} if(limit){payload['limit']=limit;} if(offset){payload['offset']=offset;} if(orderType){payload['orderType']=orderType;} -return http.get(path,{'content-type':'application/json'},payload);},createUser:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"');} +return http.get(path,{'content-type':'application/json',},payload);},create:function(email,password,name=''){if(email===undefined){throw new Error('Missing required parameter: "email"');} if(password===undefined){throw new Error('Missing required parameter: "password"');} let path='/users';let payload={};if(email){payload['email']=email;} if(password){payload['password']=password;} if(name){payload['name']=name;} -return http.post(path,{'content-type':'application/json'},payload);},getUser:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} -let path='/users/{userId}'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},getUserLogs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} -let path='/users/{userId}/logs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},getUserPrefs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} -let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},updateUserPrefs:function(userId,prefs){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +return http.post(path,{'content-type':'application/json',},payload);},get:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +let path='/users/{userId}'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},getLogs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +let path='/users/{userId}/logs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},getPrefs:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},updatePrefs:function(userId,prefs){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} if(prefs===undefined){throw new Error('Missing required parameter: "prefs"');} let path='/users/{userId}/prefs'.replace(new RegExp('{userId}','g'),userId);let payload={};if(prefs){payload['prefs']=prefs;} -return http.patch(path,{'content-type':'application/json'},payload);},getUserSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} -let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json'},payload);},deleteUserSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} -let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.delete(path,{'content-type':'application/json'},payload);},deleteUserSession:function(userId,sessionId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +return http.patch(path,{'content-type':'application/json',},payload);},getSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.get(path,{'content-type':'application/json',},payload);},deleteSessions:function(userId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +let path='/users/{userId}/sessions'.replace(new RegExp('{userId}','g'),userId);let payload={};return http.delete(path,{'content-type':'application/json',},payload);},deleteSession:function(userId,sessionId){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} if(sessionId===undefined){throw new Error('Missing required parameter: "sessionId"');} let path='/users/{userId}/sessions/:session'.replace(new RegExp('{userId}','g'),userId);let payload={};if(sessionId){payload['sessionId']=sessionId;} -return http.delete(path,{'content-type':'application/json'},payload);},updateUserStatus:function(userId,status){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} +return http.delete(path,{'content-type':'application/json',},payload);},updateStatus:function(userId,status){if(userId===undefined){throw new Error('Missing required parameter: "userId"');} if(status===undefined){throw new Error('Missing required parameter: "status"');} let path='/users/{userId}/status'.replace(new RegExp('{userId}','g'),userId);let payload={};if(status){payload['status']=status;} -return http.patch(path,{'content-type':'application/json'},payload);}};return{setEndpoint:setEndpoint,setProject:setProject,setKey:setKey,setLocale:setLocale,setMode:setMode,account:account,auth:auth,avatars:avatars,database:database,locale:locale,projects:projects,storage:storage,teams:teams,users:users};};if(typeof module!=="undefined"){module.exports=window.Appwrite;}})((typeof window!=="undefined")?window:{});(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart=f()}})(function(){var define,module,exports;return(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= request.status) { + let data = request.response; + let contentType = this.getResponseHeader('content-type') || ''; + contentType = contentType.substring(0, contentType.indexOf(';')); + + switch (contentType) { + case 'application/json': + data = JSON.parse(data); + break; + } + + resolve(data); + + } else { + reject(new Error(request.statusText)); + } + }; + + if (progress) { + request.addEventListener('progress', progress); + request.upload.addEventListener('progress', progress, false); + } + + // Handle network errors + request.onerror = function () { + reject(new Error("Network Error")); + }; + + request.send(params); + }) + }; + + return { + 'get': function(path, headers = {}, params = {}) { + return call('GET', path + ((Object.keys(params).length > 0) ? '?' + buildQuery(params) : ''), headers, {}); + }, + 'post': function(path, headers = {}, params = {}, progress = null) { + return call('POST', path, headers, params, progress); + }, + 'put': function(path, headers = {}, params = {}, progress = null) { + return call('PUT', path, headers, params, progress); + }, + 'patch': function(path, headers = {}, params = {}, progress = null) { + return call('PATCH', path, headers, params, progress); + }, + 'delete': function(path, headers = {}, params = {}, progress = null) { + return call('DELETE', path, headers, params, progress); + }, + 'addGlobalParam': addGlobalParam, + 'addGlobalHeader': addGlobalHeader + } + }(window.document); + + let iframe = function(method, url, params) { + let form = document.createElement('form'); + + form.setAttribute('method', method); + form.setAttribute('action', config.endpoint + url); + + for(let key in params) { + if(params.hasOwnProperty(key)) { + let hiddenField = document.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", key); + hiddenField.setAttribute("value", params[key]); + + form.appendChild(hiddenField); + } + } + + document.body.appendChild(form); + + return form.submit(); + }; + + let account = { + + /** + * Get Account + * + * Get currently logged in user data as JSON object. + * + * @throws {Error} + * @return {Promise} + */ + get: function() { + let path = '/account'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Account + * + * Use this endpoint to allow a new user to register an account in your + * project. Use the success and failure URLs to redirect users back to your + * application after signup completes. + * + * If registration completes successfully user will be sent with a + * confirmation email in order to confirm he is the owner of the account email + * address. Use the confirmation parameter to redirect the user from the + * confirmation email back to your app. When the user is redirected, use the + * /auth/confirm endpoint to complete the account confirmation. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * When accessing this route using Javascript from the browser, success and + * failure parameter URLs are required. Appwrite server will respond with a + * 301 redirect status code and will set the user session cookie. This + * behavior is enforced because modern browsers are limiting 3rd party cookies + * in XHR of fetch requests to protect user privacy. + * + * @param {string} email + * @param {string} password + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + create: function(email, password, name = '') { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + let path = '/account'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(password) { + payload['password'] = password; + } + + if(name) { + payload['name'] = name; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Account + * + * Delete a currently logged in user account. Behind the scene, the user + * record is not deleted but permanently blocked from any access. This is done + * to avoid deleted accounts being overtaken by new users with the same email + * address. Any user-related resources like documents or storage files should + * be deleted separately. + * + * @throws {Error} + * @return {Promise} + */ + delete: function() { + let path = '/account'; + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Account Email + * + * Update currently logged in user account email address. After changing user + * address, user confirmation status is being reset and a new confirmation + * mail is sent. For security measures, user password is required to complete + * this request. + * + * @param {string} email + * @param {string} password + * @throws {Error} + * @return {Promise} + */ + updateEmail: function(email, password) { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + let path = '/account/email'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(password) { + payload['password'] = password; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Account Logs + * + * Get currently logged in user list of latest security activity logs. Each + * log returns user IP address, location and date and time of log. + * + * @throws {Error} + * @return {Promise} + */ + getLogs: function() { + let path = '/account/logs'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Account Name + * + * Update currently logged in user account name. + * + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + updateName: function(name) { + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/account/name'; + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Account Password + * + * Update currently logged in user password. For validation, user is required + * to pass the password twice. + * + * @param {string} password + * @param {string} oldPassword + * @throws {Error} + * @return {Promise} + */ + updatePassword: function(password, oldPassword) { + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + if(oldPassword === undefined) { + throw new Error('Missing required parameter: "oldPassword"'); + } + + let path = '/account/password'; + + let payload = {}; + + if(password) { + payload['password'] = password; + } + + if(oldPassword) { + payload['old-password'] = oldPassword; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Account Preferences + * + * Get currently logged in user preferences key-value object. + * + * @throws {Error} + * @return {Promise} + */ + getPrefs: function() { + let path = '/account/prefs'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Account Preferences + * + * Update currently logged in user account preferences. You can pass only the + * specific settings you wish to update. + * + * @param {string} prefs + * @throws {Error} + * @return {Promise} + */ + updatePrefs: function(prefs) { + if(prefs === undefined) { + throw new Error('Missing required parameter: "prefs"'); + } + + let path = '/account/prefs'; + + let payload = {}; + + if(prefs) { + payload['prefs'] = prefs; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Password Recovery + * + * Sends the user an email with a temporary secret key for password reset. + * When the user clicks the confirmation link he is redirected back to your + * app password reset URL with the secret key and email address values + * attached to the URL query string. Use the query string params to submit a + * request to the /auth/password/reset endpoint to complete the process. + * + * @param {string} email + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + createRecovery: function(email, url) { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/account/recovery'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(url) { + payload['url'] = url; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Password Reset + * + * Use this endpoint to complete the user account password reset. Both the + * **userId** and **secret** arguments will be passed as query parameters to + * the redirect URL you have provided when sending your request to the + * /auth/recovery endpoint. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * @param {string} userId + * @param {string} secret + * @param {string} passwordA + * @param {string} passwordB + * @throws {Error} + * @return {Promise} + */ + updateRecovery: function(userId, secret, passwordA, passwordB) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(secret === undefined) { + throw new Error('Missing required parameter: "secret"'); + } + + if(passwordA === undefined) { + throw new Error('Missing required parameter: "passwordA"'); + } + + if(passwordB === undefined) { + throw new Error('Missing required parameter: "passwordB"'); + } + + let path = '/account/recovery'; + + let payload = {}; + + if(userId) { + payload['userId'] = userId; + } + + if(secret) { + payload['secret'] = secret; + } + + if(passwordA) { + payload['password-a'] = passwordA; + } + + if(passwordB) { + payload['password-b'] = passwordB; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Account Sessions + * + * Get currently logged in user list of active sessions across different + * devices. + * + * @throws {Error} + * @return {Promise} + */ + getSessions: function() { + let path = '/account/sessions'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Account Session + * + * Allow the user to login into his account by providing a valid email and + * password combination. Use the success and failure arguments to provide a + * redirect URL's back to your app when login is completed. + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * When accessing this route using Javascript from the browser, success and + * failure parameter URLs are required. Appwrite server will respond with a + * 301 redirect status code and will set the user session cookie. This + * behavior is enforced because modern browsers are limiting 3rd party cookies + * in XHR of fetch requests to protect user privacy. + * + * @param {string} email + * @param {string} password + * @throws {Error} + * @return {Promise} + */ + createSession: function(email, password) { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + let path = '/account/sessions'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(password) { + payload['password'] = password; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete All Account Sessions + * + * Delete all sessions from the user account and remove any sessions cookies + * from the end client. + * + * @throws {Error} + * @return {Promise} + */ + deleteSessions: function() { + let path = '/account/sessions'; + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Current Account Session + * + * Use this endpoint to log out the currently logged in user from his account. + * When successful this endpoint will delete the user session and remove the + * session secret cookie from the user client. + * + * @throws {Error} + * @return {Promise} + */ + deleteCurrentSession: function() { + let path = '/account/sessions/current'; + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Account Session with OAuth + * + * Allow the user to login to his account using the OAuth provider of his + * choice. Each OAuth provider should be enabled from the Appwrite console + * first. Use the success and failure arguments to provide a redirect URL's + * back to your app when login is completed. + * + * @param {string} provider + * @param {string} success + * @param {string} failure + * @throws {Error} + * @return {Promise} + */ + createOAuthSession: function(provider, success, failure) { + if(provider === undefined) { + throw new Error('Missing required parameter: "provider"'); + } + + if(success === undefined) { + throw new Error('Missing required parameter: "success"'); + } + + if(failure === undefined) { + throw new Error('Missing required parameter: "failure"'); + } + + let path = '/account/sessions/oauth/{provider}'.replace(new RegExp('{provider}', 'g'), provider); + + let payload = {}; + + if(success) { + payload['success'] = success; + } + + if(failure) { + payload['failure'] = failure; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Account Session + * + * Use this endpoint to log out the currently logged in user from all his + * account sessions across all his different devices. When using the option id + * argument, only the session unique ID provider will be deleted. + * + * @param {string} id + * @throws {Error} + * @return {Promise} + */ + deleteSession: function(id) { + if(id === undefined) { + throw new Error('Missing required parameter: "id"'); + } + + let path = '/account/sessions/{id}'.replace(new RegExp('{id}', 'g'), id); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Verification + * + * Use this endpoint to send a verification message to your user email address + * to confirm they are the valid owners of that address. Both the **userId** + * and **secret** arguments will be passed as query parameters to the URL you + * have provider to be attached to the verification email. The provided URL + * should redirect the user back for your app and allow you to complete the + * verification process by verifying both the **userId** and **secret** + * parameters. Learn more about how to [complete the verification + * process](/docs/account#updateAccountVerification). + * + * Please note that in order to avoid a [Redirect + * Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URLs are the ones from domains you have set when + * adding your platforms in the console interface. + * + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + createVerification: function(url) { + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/account/verification'; + + let payload = {}; + + if(url) { + payload['url'] = url; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Updated Verification + * + * Use this endpoint to complete the user email verification process. Use both + * the **userId** and **secret** parameters that were attached to your app URL + * to verify the user email ownership. If confirmed this route will return a + * 200 status code. + * + * @param {string} userId + * @param {string} secret + * @param {string} passwordB + * @throws {Error} + * @return {Promise} + */ + updateVerification: function(userId, secret, passwordB) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(secret === undefined) { + throw new Error('Missing required parameter: "secret"'); + } + + if(passwordB === undefined) { + throw new Error('Missing required parameter: "passwordB"'); + } + + let path = '/account/verification'; + + let payload = {}; + + if(userId) { + payload['userId'] = userId; + } + + if(secret) { + payload['secret'] = secret; + } + + if(passwordB) { + payload['password-b'] = passwordB; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let avatars = { + + /** + * Get Browser Icon + * + * You can use this endpoint to show different browser icons to your users. + * The code argument receives the browser code as it appears in your user + * /account/sessions endpoint. Use width, height and quality arguments to + * change the output settings. + * + * @param {string} code + * @param {number} width + * @param {number} height + * @param {number} quality + * @throws {Error} + * @return {Promise} + */ + getBrowser: function(code, width = 100, height = 100, quality = 100) { + if(code === undefined) { + throw new Error('Missing required parameter: "code"'); + } + + let path = '/avatars/browsers/{code}'.replace(new RegExp('{code}', 'g'), code); + + let payload = {}; + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + if(quality) { + payload['quality'] = quality; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Credit Card Icon + * + * Need to display your users with your billing method or their payment + * methods? The credit card endpoint will return you the icon of the credit + * card provider you need. Use width, height and quality arguments to change + * the output settings. + * + * @param {string} code + * @param {number} width + * @param {number} height + * @param {number} quality + * @throws {Error} + * @return {Promise} + */ + getCreditCard: function(code, width = 100, height = 100, quality = 100) { + if(code === undefined) { + throw new Error('Missing required parameter: "code"'); + } + + let path = '/avatars/credit-cards/{code}'.replace(new RegExp('{code}', 'g'), code); + + let payload = {}; + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + if(quality) { + payload['quality'] = quality; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Favicon + * + * Use this endpoint to fetch the favorite icon (AKA favicon) of a any remote + * website URL. + * + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + getFavicon: function(url) { + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/avatars/favicon'; + + let payload = {}; + + if(url) { + payload['url'] = url; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Country Flag + * + * You can use this endpoint to show different country flags icons to your + * users. The code argument receives the 2 letter country code. Use width, + * height and quality arguments to change the output settings. + * + * @param {string} code + * @param {number} width + * @param {number} height + * @param {number} quality + * @throws {Error} + * @return {Promise} + */ + getFlag: function(code, width = 100, height = 100, quality = 100) { + if(code === undefined) { + throw new Error('Missing required parameter: "code"'); + } + + let path = '/avatars/flags/{code}'.replace(new RegExp('{code}', 'g'), code); + + let payload = {}; + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + if(quality) { + payload['quality'] = quality; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Image from URL + * + * Use this endpoint to fetch a remote image URL and crop it to any image size + * you want. This endpoint is very useful if you need to crop and display + * remote images in your app or in case you want to make sure a 3rd party + * image is properly served using a TLS protocol. + * + * @param {string} url + * @param {number} width + * @param {number} height + * @throws {Error} + * @return {Promise} + */ + getImage: function(url, width = 400, height = 400) { + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/avatars/image'; + + let payload = {}; + + if(url) { + payload['url'] = url; + } + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get QR Code + * + * Converts a given plain text to a QR code image. You can use the query + * parameters to change the size and style of the resulting image. + * + * @param {string} text + * @param {number} size + * @param {number} margin + * @param {number} download + * @throws {Error} + * @return {Promise} + */ + getQR: function(text, size = 400, margin = 1, download = 0) { + if(text === undefined) { + throw new Error('Missing required parameter: "text"'); + } + + let path = '/avatars/qr'; + + let payload = {}; + + if(text) { + payload['text'] = text; + } + + if(size) { + payload['size'] = size; + } + + if(margin) { + payload['margin'] = margin; + } + + if(download) { + payload['download'] = download; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let database = { + + /** + * List Collections + * + * Get a list of all the user collections. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project collections. [Learn more about different API + * modes](/docs/admin). + * + * @param {string} search + * @param {number} limit + * @param {number} offset + * @param {string} orderType + * @throws {Error} + * @return {Promise} + */ + listCollections: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/database/collections'; + + let payload = {}; + + if(search) { + payload['search'] = search; + } + + if(limit) { + payload['limit'] = limit; + } + + if(offset) { + payload['offset'] = offset; + } + + if(orderType) { + payload['orderType'] = orderType; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Collection + * + * Create a new Collection. + * + * @param {string} name + * @param {array} read + * @param {array} write + * @param {array} rules + * @throws {Error} + * @return {Promise} + */ + createCollection: function(name, read, write, rules) { + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + if(rules === undefined) { + throw new Error('Missing required parameter: "rules"'); + } + + let path = '/database/collections'; + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + if(rules) { + payload['rules'] = rules; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Collection + * + * Get collection by its unique ID. This endpoint response returns a JSON + * object with the collection metadata. + * + * @param {string} collectionId + * @throws {Error} + * @return {Promise} + */ + getCollection: function(collectionId) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Collection + * + * Update collection by its unique ID. + * + * @param {string} collectionId + * @param {string} name + * @param {array} read + * @param {array} write + * @param {array} rules + * @throws {Error} + * @return {Promise} + */ + updateCollection: function(collectionId, name, read, write, rules = []) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + if(rules) { + payload['rules'] = rules; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Collection + * + * Delete a collection by its unique ID. Only users with write permissions + * have access to delete this resource. + * + * @param {string} collectionId + * @throws {Error} + * @return {Promise} + */ + deleteCollection: function(collectionId) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + let path = '/database/collections/{collectionId}'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Documents + * + * Get a list of all the user documents. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project documents. [Learn more about different API + * modes](/docs/admin). + * + * @param {string} collectionId + * @param {array} filters + * @param {number} offset + * @param {number} limit + * @param {string} orderField + * @param {string} orderType + * @param {string} orderCast + * @param {string} search + * @param {number} first + * @param {number} last + * @throws {Error} + * @return {Promise} + */ + listDocuments: function(collectionId, filters = [], offset = 0, limit = 50, orderField = '$uid', orderType = 'ASC', orderCast = 'string', search = '', first = 0, last = 0) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + let path = '/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + if(filters) { + payload['filters'] = filters; + } + + if(offset) { + payload['offset'] = offset; + } + + if(limit) { + payload['limit'] = limit; + } + + if(orderField) { + payload['order-field'] = orderField; + } + + if(orderType) { + payload['order-type'] = orderType; + } + + if(orderCast) { + payload['order-cast'] = orderCast; + } + + if(search) { + payload['search'] = search; + } + + if(first) { + payload['first'] = first; + } + + if(last) { + payload['last'] = last; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Document + * + * Create a new Document. + * + * @param {string} collectionId + * @param {string} data + * @param {array} read + * @param {array} write + * @param {string} parentDocument + * @param {string} parentProperty + * @param {string} parentPropertyType + * @throws {Error} + * @return {Promise} + */ + createDocument: function(collectionId, data, read, write, parentDocument = '', parentProperty = '', parentPropertyType = 'assign') { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(data === undefined) { + throw new Error('Missing required parameter: "data"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/database/collections/{collectionId}/documents'.replace(new RegExp('{collectionId}', 'g'), collectionId); + + let payload = {}; + + if(data) { + payload['data'] = data; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + if(parentDocument) { + payload['parentDocument'] = parentDocument; + } + + if(parentProperty) { + payload['parentProperty'] = parentProperty; + } + + if(parentPropertyType) { + payload['parentPropertyType'] = parentPropertyType; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Document + * + * Get document by its unique ID. This endpoint response returns a JSON object + * with the document data. + * + * @param {string} collectionId + * @param {string} documentId + * @throws {Error} + * @return {Promise} + */ + getDocument: function(collectionId, documentId) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(documentId === undefined) { + throw new Error('Missing required parameter: "documentId"'); + } + + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Document + * + * + * @param {string} collectionId + * @param {string} documentId + * @param {string} data + * @param {array} read + * @param {array} write + * @throws {Error} + * @return {Promise} + */ + updateDocument: function(collectionId, documentId, data, read, write) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(documentId === undefined) { + throw new Error('Missing required parameter: "documentId"'); + } + + if(data === undefined) { + throw new Error('Missing required parameter: "data"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + let payload = {}; + + if(data) { + payload['data'] = data; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Document + * + * Delete document by its unique ID. This endpoint deletes only the parent + * documents, his attributes and relations to other documents. Child documents + * **will not** be deleted. + * + * @param {string} collectionId + * @param {string} documentId + * @throws {Error} + * @return {Promise} + */ + deleteDocument: function(collectionId, documentId) { + if(collectionId === undefined) { + throw new Error('Missing required parameter: "collectionId"'); + } + + if(documentId === undefined) { + throw new Error('Missing required parameter: "documentId"'); + } + + let path = '/database/collections/{collectionId}/documents/{documentId}'.replace(new RegExp('{collectionId}', 'g'), collectionId).replace(new RegExp('{documentId}', 'g'), documentId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let locale = { + + /** + * Get User Locale + * + * Get the current user location based on IP. Returns an object with user + * country code, country name, continent name, continent code, ip address and + * suggested currency. You can use the locale header to get the data in a + * supported language. + * + * ([IP Geolocation by DB-IP](https://db-ip.com)) + * + * @throws {Error} + * @return {Promise} + */ + get: function() { + let path = '/locale'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Countries + * + * List of all continents. You can use the locale header to get the data in a + * supported language. + * + * @throws {Error} + * @return {Promise} + */ + getContinents: function() { + let path = '/locale/continents'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Countries + * + * List of all countries. You can use the locale header to get the data in a + * supported language. + * + * @throws {Error} + * @return {Promise} + */ + getCountries: function() { + let path = '/locale/countries'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List EU Countries + * + * List of all countries that are currently members of the EU. You can use the + * locale header to get the data in a supported language. + * + * @throws {Error} + * @return {Promise} + */ + getCountriesEU: function() { + let path = '/locale/countries/eu'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Countries Phone Codes + * + * List of all countries phone codes. You can use the locale header to get the + * data in a supported language. + * + * @throws {Error} + * @return {Promise} + */ + getCountriesPhones: function() { + let path = '/locale/countries/phones'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Currencies + * + * List of all currencies, including currency symol, name, plural, and decimal + * digits for all major and minor currencies. You can use the locale header to + * get the data in a supported language. + * + * @throws {Error} + * @return {Promise} + */ + getCurrencies: function() { + let path = '/locale/currencies'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let projects = { + + /** + * List Projects + * + * + * @throws {Error} + * @return {Promise} + */ + list: function() { + let path = '/projects'; + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Project + * + * + * @param {string} name + * @param {string} teamId + * @param {string} description + * @param {string} logo + * @param {string} url + * @param {string} legalName + * @param {string} legalCountry + * @param {string} legalState + * @param {string} legalCity + * @param {string} legalAddress + * @param {string} legalTaxId + * @throws {Error} + * @return {Promise} + */ + create: function(name, teamId, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + let path = '/projects'; + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(teamId) { + payload['teamId'] = teamId; + } + + if(description) { + payload['description'] = description; + } + + if(logo) { + payload['logo'] = logo; + } + + if(url) { + payload['url'] = url; + } + + if(legalName) { + payload['legalName'] = legalName; + } + + if(legalCountry) { + payload['legalCountry'] = legalCountry; + } + + if(legalState) { + payload['legalState'] = legalState; + } + + if(legalCity) { + payload['legalCity'] = legalCity; + } + + if(legalAddress) { + payload['legalAddress'] = legalAddress; + } + + if(legalTaxId) { + payload['legalTaxId'] = legalTaxId; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Project + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + get: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Project + * + * + * @param {string} projectId + * @param {string} name + * @param {string} description + * @param {string} logo + * @param {string} url + * @param {string} legalName + * @param {string} legalCountry + * @param {string} legalState + * @param {string} legalCity + * @param {string} legalAddress + * @param {string} legalTaxId + * @throws {Error} + * @return {Promise} + */ + update: function(projectId, name, description = '', logo = '', url = '', legalName = '', legalCountry = '', legalState = '', legalCity = '', legalAddress = '', legalTaxId = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(description) { + payload['description'] = description; + } + + if(logo) { + payload['logo'] = logo; + } + + if(url) { + payload['url'] = url; + } + + if(legalName) { + payload['legalName'] = legalName; + } + + if(legalCountry) { + payload['legalCountry'] = legalCountry; + } + + if(legalState) { + payload['legalState'] = legalState; + } + + if(legalCity) { + payload['legalCity'] = legalCity; + } + + if(legalAddress) { + payload['legalAddress'] = legalAddress; + } + + if(legalTaxId) { + payload['legalTaxId'] = legalTaxId; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Project + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + delete: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Keys + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + listKeys: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Key + * + * + * @param {string} projectId + * @param {string} name + * @param {array} scopes + * @throws {Error} + * @return {Promise} + */ + createKey: function(projectId, name, scopes) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(scopes === undefined) { + throw new Error('Missing required parameter: "scopes"'); + } + + let path = '/projects/{projectId}/keys'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(scopes) { + payload['scopes'] = scopes; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Key + * + * + * @param {string} projectId + * @param {string} keyId + * @throws {Error} + * @return {Promise} + */ + getKey: function(projectId, keyId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(keyId === undefined) { + throw new Error('Missing required parameter: "keyId"'); + } + + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Key + * + * + * @param {string} projectId + * @param {string} keyId + * @param {string} name + * @param {array} scopes + * @throws {Error} + * @return {Promise} + */ + updateKey: function(projectId, keyId, name, scopes) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(keyId === undefined) { + throw new Error('Missing required parameter: "keyId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(scopes === undefined) { + throw new Error('Missing required parameter: "scopes"'); + } + + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(scopes) { + payload['scopes'] = scopes; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Key + * + * + * @param {string} projectId + * @param {string} keyId + * @throws {Error} + * @return {Promise} + */ + deleteKey: function(projectId, keyId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(keyId === undefined) { + throw new Error('Missing required parameter: "keyId"'); + } + + let path = '/projects/{projectId}/keys/{keyId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{keyId}', 'g'), keyId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Project OAuth + * + * + * @param {string} projectId + * @param {string} provider + * @param {string} appId + * @param {string} secret + * @throws {Error} + * @return {Promise} + */ + updateOAuth: function(projectId, provider, appId = '', secret = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(provider === undefined) { + throw new Error('Missing required parameter: "provider"'); + } + + let path = '/projects/{projectId}/oauth'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(provider) { + payload['provider'] = provider; + } + + if(appId) { + payload['appId'] = appId; + } + + if(secret) { + payload['secret'] = secret; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Platforms + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + listPlatforms: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Platform + * + * + * @param {string} projectId + * @param {string} type + * @param {string} name + * @param {string} key + * @param {string} store + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + createPlatform: function(projectId, type, name, key = '', store = '', url = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(type === undefined) { + throw new Error('Missing required parameter: "type"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/projects/{projectId}/platforms'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(type) { + payload['type'] = type; + } + + if(name) { + payload['name'] = name; + } + + if(key) { + payload['key'] = key; + } + + if(store) { + payload['store'] = store; + } + + if(url) { + payload['url'] = url; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Platform + * + * + * @param {string} projectId + * @param {string} platformId + * @throws {Error} + * @return {Promise} + */ + getPlatform: function(projectId, platformId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(platformId === undefined) { + throw new Error('Missing required parameter: "platformId"'); + } + + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Platform + * + * + * @param {string} projectId + * @param {string} platformId + * @param {string} name + * @param {string} key + * @param {string} store + * @param {string} url + * @throws {Error} + * @return {Promise} + */ + updatePlatform: function(projectId, platformId, name, key = '', store = '', url = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(platformId === undefined) { + throw new Error('Missing required parameter: "platformId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(key) { + payload['key'] = key; + } + + if(store) { + payload['store'] = store; + } + + if(url) { + payload['url'] = url; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Platform + * + * + * @param {string} projectId + * @param {string} platformId + * @throws {Error} + * @return {Promise} + */ + deletePlatform: function(projectId, platformId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(platformId === undefined) { + throw new Error('Missing required parameter: "platformId"'); + } + + let path = '/projects/{projectId}/platforms/{platformId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{platformId}', 'g'), platformId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Tasks + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + listTasks: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Task + * + * + * @param {string} projectId + * @param {string} name + * @param {string} status + * @param {string} schedule + * @param {number} security + * @param {string} httpMethod + * @param {string} httpUrl + * @param {array} httpHeaders + * @param {string} httpUser + * @param {string} httpPass + * @throws {Error} + * @return {Promise} + */ + createTask: function(projectId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(status === undefined) { + throw new Error('Missing required parameter: "status"'); + } + + if(schedule === undefined) { + throw new Error('Missing required parameter: "schedule"'); + } + + if(security === undefined) { + throw new Error('Missing required parameter: "security"'); + } + + if(httpMethod === undefined) { + throw new Error('Missing required parameter: "httpMethod"'); + } + + if(httpUrl === undefined) { + throw new Error('Missing required parameter: "httpUrl"'); + } + + let path = '/projects/{projectId}/tasks'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(status) { + payload['status'] = status; + } + + if(schedule) { + payload['schedule'] = schedule; + } + + if(security) { + payload['security'] = security; + } + + if(httpMethod) { + payload['httpMethod'] = httpMethod; + } + + if(httpUrl) { + payload['httpUrl'] = httpUrl; + } + + if(httpHeaders) { + payload['httpHeaders'] = httpHeaders; + } + + if(httpUser) { + payload['httpUser'] = httpUser; + } + + if(httpPass) { + payload['httpPass'] = httpPass; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Task + * + * + * @param {string} projectId + * @param {string} taskId + * @throws {Error} + * @return {Promise} + */ + getTask: function(projectId, taskId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(taskId === undefined) { + throw new Error('Missing required parameter: "taskId"'); + } + + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Task + * + * + * @param {string} projectId + * @param {string} taskId + * @param {string} name + * @param {string} status + * @param {string} schedule + * @param {number} security + * @param {string} httpMethod + * @param {string} httpUrl + * @param {array} httpHeaders + * @param {string} httpUser + * @param {string} httpPass + * @throws {Error} + * @return {Promise} + */ + updateTask: function(projectId, taskId, name, status, schedule, security, httpMethod, httpUrl, httpHeaders = [], httpUser = '', httpPass = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(taskId === undefined) { + throw new Error('Missing required parameter: "taskId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(status === undefined) { + throw new Error('Missing required parameter: "status"'); + } + + if(schedule === undefined) { + throw new Error('Missing required parameter: "schedule"'); + } + + if(security === undefined) { + throw new Error('Missing required parameter: "security"'); + } + + if(httpMethod === undefined) { + throw new Error('Missing required parameter: "httpMethod"'); + } + + if(httpUrl === undefined) { + throw new Error('Missing required parameter: "httpUrl"'); + } + + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(status) { + payload['status'] = status; + } + + if(schedule) { + payload['schedule'] = schedule; + } + + if(security) { + payload['security'] = security; + } + + if(httpMethod) { + payload['httpMethod'] = httpMethod; + } + + if(httpUrl) { + payload['httpUrl'] = httpUrl; + } + + if(httpHeaders) { + payload['httpHeaders'] = httpHeaders; + } + + if(httpUser) { + payload['httpUser'] = httpUser; + } + + if(httpPass) { + payload['httpPass'] = httpPass; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Task + * + * + * @param {string} projectId + * @param {string} taskId + * @throws {Error} + * @return {Promise} + */ + deleteTask: function(projectId, taskId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(taskId === undefined) { + throw new Error('Missing required parameter: "taskId"'); + } + + let path = '/projects/{projectId}/tasks/{taskId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{taskId}', 'g'), taskId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Project + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + getUsage: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/usage'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * List Webhooks + * + * + * @param {string} projectId + * @throws {Error} + * @return {Promise} + */ + listWebhooks: function(projectId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Webhook + * + * + * @param {string} projectId + * @param {string} name + * @param {array} events + * @param {string} url + * @param {number} security + * @param {string} httpUser + * @param {string} httpPass + * @throws {Error} + * @return {Promise} + */ + createWebhook: function(projectId, name, events, url, security, httpUser = '', httpPass = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(events === undefined) { + throw new Error('Missing required parameter: "events"'); + } + + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + if(security === undefined) { + throw new Error('Missing required parameter: "security"'); + } + + let path = '/projects/{projectId}/webhooks'.replace(new RegExp('{projectId}', 'g'), projectId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(events) { + payload['events'] = events; + } + + if(url) { + payload['url'] = url; + } + + if(security) { + payload['security'] = security; + } + + if(httpUser) { + payload['httpUser'] = httpUser; + } + + if(httpPass) { + payload['httpPass'] = httpPass; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Webhook + * + * + * @param {string} projectId + * @param {string} webhookId + * @throws {Error} + * @return {Promise} + */ + getWebhook: function(projectId, webhookId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(webhookId === undefined) { + throw new Error('Missing required parameter: "webhookId"'); + } + + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Webhook + * + * + * @param {string} projectId + * @param {string} webhookId + * @param {string} name + * @param {array} events + * @param {string} url + * @param {number} security + * @param {string} httpUser + * @param {string} httpPass + * @throws {Error} + * @return {Promise} + */ + updateWebhook: function(projectId, webhookId, name, events, url, security, httpUser = '', httpPass = '') { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(webhookId === undefined) { + throw new Error('Missing required parameter: "webhookId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + if(events === undefined) { + throw new Error('Missing required parameter: "events"'); + } + + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + if(security === undefined) { + throw new Error('Missing required parameter: "security"'); + } + + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(events) { + payload['events'] = events; + } + + if(url) { + payload['url'] = url; + } + + if(security) { + payload['security'] = security; + } + + if(httpUser) { + payload['httpUser'] = httpUser; + } + + if(httpPass) { + payload['httpPass'] = httpPass; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Webhook + * + * + * @param {string} projectId + * @param {string} webhookId + * @throws {Error} + * @return {Promise} + */ + deleteWebhook: function(projectId, webhookId) { + if(projectId === undefined) { + throw new Error('Missing required parameter: "projectId"'); + } + + if(webhookId === undefined) { + throw new Error('Missing required parameter: "webhookId"'); + } + + let path = '/projects/{projectId}/webhooks/{webhookId}'.replace(new RegExp('{projectId}', 'g'), projectId).replace(new RegExp('{webhookId}', 'g'), webhookId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let storage = { + + /** + * List Files + * + * Get a list of all the user files. You can use the query params to filter + * your results. On admin mode, this endpoint will return a list of all of the + * project files. [Learn more about different API modes](/docs/admin). + * + * @param {string} search + * @param {number} limit + * @param {number} offset + * @param {string} orderType + * @throws {Error} + * @return {Promise} + */ + list: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/storage/files'; + + let payload = {}; + + if(search) { + payload['search'] = search; + } + + if(limit) { + payload['limit'] = limit; + } + + if(offset) { + payload['offset'] = offset; + } + + if(orderType) { + payload['orderType'] = orderType; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create File + * + * Create a new file. The user who creates the file will automatically be + * assigned to read and write access unless he has passed custom values for + * read and write arguments. + * + * @param {File} file + * @param {array} read + * @param {array} write + * @throws {Error} + * @return {Promise} + */ + create: function(file, read, write) { + if(file === undefined) { + throw new Error('Missing required parameter: "file"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/storage/files'; + + let payload = {}; + + if(file) { + payload['file'] = file; + } + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + return http + .post(path, { + 'content-type': 'multipart/form-data', + }, payload); + }, + + /** + * Get File + * + * Get file by its unique ID. This endpoint response returns a JSON object + * with the file metadata. + * + * @param {string} fileId + * @throws {Error} + * @return {Promise} + */ + get: function(fileId) { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update File + * + * Update file by its unique ID. Only users with write permissions have access + * to update this resource. + * + * @param {string} fileId + * @param {array} read + * @param {array} write + * @throws {Error} + * @return {Promise} + */ + update: function(fileId, read, write) { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + if(read === undefined) { + throw new Error('Missing required parameter: "read"'); + } + + if(write === undefined) { + throw new Error('Missing required parameter: "write"'); + } + + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + if(read) { + payload['read'] = read; + } + + if(write) { + payload['write'] = write; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete File + * + * Delete a file by its unique ID. Only users with write permissions have + * access to delete this resource. + * + * @param {string} fileId + * @throws {Error} + * @return {Promise} + */ + delete: function(fileId) { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get File for Download + * + * Get file content by its unique ID. The endpoint response return with a + * 'Content-Disposition: attachment' header that tells the browser to start + * downloading the file to user downloads directory. + * + * @param {string} fileId + * @throws {Error} + * @return {Promise} + */ + getDownload: function(fileId) { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}/download'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get File Preview + * + * Get a file preview image. Currently, this method supports preview for image + * files (jpg, png, and gif), other supported formats, like pdf, docs, slides, + * and spreadsheets, will return the file icon image. You can also pass query + * string arguments for cutting and resizing your preview image. + * + * @param {string} fileId + * @param {number} width + * @param {number} height + * @param {number} quality + * @param {string} background + * @param {string} output + * @throws {Error} + * @return {Promise} + */ + getPreview: function(fileId, width = 0, height = 0, quality = 100, background = '', output = '') { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}/preview'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + if(width) { + payload['width'] = width; + } + + if(height) { + payload['height'] = height; + } + + if(quality) { + payload['quality'] = quality; + } + + if(background) { + payload['background'] = background; + } + + if(output) { + payload['output'] = output; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get File for View + * + * Get file content by its unique ID. This endpoint is similar to the download + * method but returns with no 'Content-Disposition: attachment' header. + * + * @param {string} fileId + * @param {string} as + * @throws {Error} + * @return {Promise} + */ + getView: function(fileId, as = '') { + if(fileId === undefined) { + throw new Error('Missing required parameter: "fileId"'); + } + + let path = '/storage/files/{fileId}/view'.replace(new RegExp('{fileId}', 'g'), fileId); + + let payload = {}; + + if(as) { + payload['as'] = as; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + let teams = { + + /** + * List Teams + * + * Get a list of all the current user teams. You can use the query params to + * filter your results. On admin mode, this endpoint will return a list of all + * of the project teams. [Learn more about different API modes](/docs/admin). + * + * @param {string} search + * @param {number} limit + * @param {number} offset + * @param {string} orderType + * @throws {Error} + * @return {Promise} + */ + list: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/teams'; + + let payload = {}; + + if(search) { + payload['search'] = search; + } + + if(limit) { + payload['limit'] = limit; + } + + if(offset) { + payload['offset'] = offset; + } + + if(orderType) { + payload['orderType'] = orderType; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Team + * + * Create a new team. The user who creates the team will automatically be + * assigned as the owner of the team. The team owner can invite new members, + * who will be able add new owners and update or delete the team from your + * project. + * + * @param {string} name + * @param {array} roles + * @throws {Error} + * @return {Promise} + */ + create: function(name, roles = ["owner"]) { + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/teams'; + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + if(roles) { + payload['roles'] = roles; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Team + * + * Get team by its unique ID. All team members have read access for this + * resource. + * + * @param {string} teamId + * @throws {Error} + * @return {Promise} + */ + get: function(teamId) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Team + * + * Update team by its unique ID. Only team owners have write access for this + * resource. + * + * @param {string} teamId + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + update: function(teamId, name) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + if(name === undefined) { + throw new Error('Missing required parameter: "name"'); + } + + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + if(name) { + payload['name'] = name; + } + + return http + .put(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Team + * + * Delete team by its unique ID. Only team owners have write access for this + * resource. + * + * @param {string} teamId + * @throws {Error} + * @return {Promise} + */ + delete: function(teamId) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + let path = '/teams/{teamId}'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get Team Memberships + * + * Get team members by the team unique ID. All team members have read access + * for this list of resources. + * + * @param {string} teamId + * @throws {Error} + * @return {Promise} + */ + getMemberships: function(teamId) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create Team Membership + * + * Use this endpoint to invite a new member to your team. An email with a link + * to join the team will be sent to the new member email address. If member + * doesn't exists in the project it will be automatically created. + * + * Use the 'url' parameter to redirect the user from the invitation email back + * to your app. When the user is redirected, use the [Update Team Membership + * Status](/docs/teams#updateTeamMembershipStatus) endpoint to finally join + * the user to the team. + * + * Please note that in order to avoid a [Redirect + * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URL's are the once from domains you have set when + * added your platforms in the console interface. + * + * @param {string} teamId + * @param {string} email + * @param {array} roles + * @param {string} url + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + createMembership: function(teamId, email, roles, url, name = '') { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(roles === undefined) { + throw new Error('Missing required parameter: "roles"'); + } + + if(url === undefined) { + throw new Error('Missing required parameter: "url"'); + } + + let path = '/teams/{teamId}/memberships'.replace(new RegExp('{teamId}', 'g'), teamId); + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(name) { + payload['name'] = name; + } + + if(roles) { + payload['roles'] = roles; + } + + if(url) { + payload['url'] = url; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete Team Membership + * + * This endpoint allows a user to leave a team or for a team owner to delete + * the membership of any other team member. You can also use this endpoint to + * delete a user membership even if he didn't accept it. + * + * @param {string} teamId + * @param {string} inviteId + * @throws {Error} + * @return {Promise} + */ + deleteMembership: function(teamId, inviteId) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + if(inviteId === undefined) { + throw new Error('Missing required parameter: "inviteId"'); + } + + let path = '/teams/{teamId}/memberships/{inviteId}'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update Team Membership Status + * + * Use this endpoint to let user accept an invitation to join a team after he + * is being redirect back to your app from the invitation email. Use the + * success and failure URL's to redirect users back to your application after + * the request completes. + * + * Please note that in order to avoid a [Redirect + * Attacks](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) + * the only valid redirect URL's are the once from domains you have set when + * added your platforms in the console interface. + * + * When not using the success or failure redirect arguments this endpoint will + * result with a 200 status code on success and with 401 status error on + * failure. This behavior was applied to help the web clients deal with + * browsers who don't allow to set 3rd party HTTP cookies needed for saving + * the account session key. + * + * @param {string} teamId + * @param {string} inviteId + * @param {string} userId + * @param {string} secret + * @throws {Error} + * @return {null} + */ + updateMembershipStatus: function(teamId, inviteId, userId, secret) { + if(teamId === undefined) { + throw new Error('Missing required parameter: "teamId"'); + } + + if(inviteId === undefined) { + throw new Error('Missing required parameter: "inviteId"'); + } + + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(secret === undefined) { + throw new Error('Missing required parameter: "secret"'); + } + + let path = '/teams/{teamId}/memberships/{inviteId}/status'.replace(new RegExp('{teamId}', 'g'), teamId).replace(new RegExp('{inviteId}', 'g'), inviteId); + + let payload = {}; + + if(userId) { + payload['userId'] = userId; + } + + if(secret) { + payload['secret'] = secret; + } + + payload['project'] = config.project; + + return iframe('patch', path, payload); + } + }; + + let users = { + + /** + * List Users + * + * Get a list of all the project users. You can use the query params to filter + * your results. + * + * @param {string} search + * @param {number} limit + * @param {number} offset + * @param {string} orderType + * @throws {Error} + * @return {Promise} + */ + list: function(search = '', limit = 25, offset = 0, orderType = 'ASC') { + let path = '/users'; + + let payload = {}; + + if(search) { + payload['search'] = search; + } + + if(limit) { + payload['limit'] = limit; + } + + if(offset) { + payload['offset'] = offset; + } + + if(orderType) { + payload['orderType'] = orderType; + } + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Create User + * + * Create a new user. + * + * @param {string} email + * @param {string} password + * @param {string} name + * @throws {Error} + * @return {Promise} + */ + create: function(email, password, name = '') { + if(email === undefined) { + throw new Error('Missing required parameter: "email"'); + } + + if(password === undefined) { + throw new Error('Missing required parameter: "password"'); + } + + let path = '/users'; + + let payload = {}; + + if(email) { + payload['email'] = email; + } + + if(password) { + payload['password'] = password; + } + + if(name) { + payload['name'] = name; + } + + return http + .post(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get User + * + * Get user by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + get: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get User Logs + * + * Get user activity logs list by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + getLogs: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}/logs'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get User Preferences + * + * Get user preferences by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + getPrefs: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update User Preferences + * + * Update user preferences by its unique ID. You can pass only the specific + * settings you wish to update. + * + * @param {string} userId + * @param {string} prefs + * @throws {Error} + * @return {Promise} + */ + updatePrefs: function(userId, prefs) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(prefs === undefined) { + throw new Error('Missing required parameter: "prefs"'); + } + + let path = '/users/{userId}/prefs'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + if(prefs) { + payload['prefs'] = prefs; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Get User Sessions + * + * Get user sessions list by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + getSessions: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .get(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete User Sessions + * + * Delete all user sessions by its unique ID. + * + * @param {string} userId + * @throws {Error} + * @return {Promise} + */ + deleteSessions: function(userId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + let path = '/users/{userId}/sessions'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Delete User Session + * + * Delete user sessions by its unique ID. + * + * @param {string} userId + * @param {string} sessionId + * @throws {Error} + * @return {Promise} + */ + deleteSession: function(userId, sessionId) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(sessionId === undefined) { + throw new Error('Missing required parameter: "sessionId"'); + } + + let path = '/users/{userId}/sessions/:session'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + if(sessionId) { + payload['sessionId'] = sessionId; + } + + return http + .delete(path, { + 'content-type': 'application/json', + }, payload); + }, + + /** + * Update User Status + * + * Update user status by its unique ID. + * + * @param {string} userId + * @param {string} status + * @throws {Error} + * @return {Promise} + */ + updateStatus: function(userId, status) { + if(userId === undefined) { + throw new Error('Missing required parameter: "userId"'); + } + + if(status === undefined) { + throw new Error('Missing required parameter: "status"'); + } + + let path = '/users/{userId}/status'.replace(new RegExp('{userId}', 'g'), userId); + + let payload = {}; + + if(status) { + payload['status'] = status; + } + + return http + .patch(path, { + 'content-type': 'application/json', + }, payload); + } + }; + + return { + setEndpoint: setEndpoint, + setProject: setProject, + setKey: setKey, + setLocale: setLocale, + setMode: setMode, + account: account, + avatars: avatars, + database: database, + locale: locale, + projects: projects, + storage: storage, + teams: teams, + users: users + }; + }; + + if(typeof module !== "undefined") { + module.exports = window.Appwrite; + } + +})((typeof window !== "undefined") ? window : {}); \ No newline at end of file From 134d516d6ae40a603005ac75f221b1ef8cc6fb9c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Thu, 30 Jan 2020 19:12:29 +0200 Subject: [PATCH 118/237] Updated UI to work with new SDK --- app/views/console/account/index.phtml | 26 +-- app/views/console/comps/header.phtml | 4 +- app/views/console/home/index.phtml | 8 +- app/views/console/index.phtml | 2 +- app/views/console/settings/index.phtml | 18 +- app/views/console/storage/index.phtml | 12 +- app/views/console/users/index.phtml | 26 +-- app/views/console/users/view.phtml | 16 +- app/views/home/auth/confirm.phtml | 4 +- app/views/home/auth/recovery.phtml | 4 +- app/views/home/auth/recovery/reset.phtml | 4 +- app/views/home/auth/signin.phtml | 9 +- app/views/home/auth/signup.phtml | 10 +- public/dist/scripts/app-all.js | 247 ++++++++++++----------- public/scripts/init.js | 4 +- 15 files changed, 194 insertions(+), 200 deletions(-) diff --git a/app/views/console/account/index.phtml b/app/views/console/account/index.phtml index f6e174e959..7662729ac9 100644 --- a/app/views/console/account/index.phtml +++ b/app/views/console/account/index.phtml @@ -13,7 +13,7 @@ data-name="account" data-event="load" data-failure="trigger" - data-failure-param-trigger-events="logout"> + data-failure-param-trigger-events="account.deleteSession">

    Overview

    @@ -109,11 +109,11 @@
    @@ -150,12 +150,12 @@

    PLEASE NOTE: Account deletion is irreversible.

    @@ -176,19 +176,19 @@ data-service="account.getSessions" data-scope="console" data-name="sessions" - data-event="load,session-delete"> + data-event="load,account.deleteSession">
    • @@ -201,12 +201,12 @@ Activity
  • diff --git a/app/views/console/comps/header.phtml b/app/views/console/comps/header.phtml index 5ac13248af..1814ccfffc 100644 --- a/app/views/console/comps/header.phtml +++ b/app/views/console/comps/header.phtml @@ -100,13 +100,13 @@
    diff --git a/app/views/console/home/index.phtml b/app/views/console/home/index.phtml index 9f24564b1d..0461796cf8 100644 --- a/app/views/console/home/index.phtml +++ b/app/views/console/home/index.phtml @@ -5,7 +5,7 @@ $graph = $this->getParam('graph', false);

    getParam('graph', false);
    @@ -204,8 +204,8 @@ $graph = $this->getParam('graph', false); - - + + diff --git a/app/views/console/index.phtml b/app/views/console/index.phtml index 98fb8d25a0..5eab8a44e7 100644 --- a/app/views/console/index.phtml +++ b/app/views/console/index.phtml @@ -19,7 +19,7 @@ $home = $this->getParam('home', '');
    Members

  • Leave
  • - getParam('home', '');
    getParam('home', '');

    Update File

    getParam('home', '');
    getParam('home', ''); getParam('providers', []);

    Create User

    getParam('providers', []);
    getParam('providers', []);
    getParam('providers', []);
    getParam('providers', []); getParam('providers', []);

    Create Team

    getParam('providers', []);
    getParam('providers', []);
    getParam('providers', []);

    Update Team

    getParam('providers', []);
    getParam('providers', []); getParam('providers', []);

    OAuth Providers

    getParam('providers', []);

    OAuth Settings

    Preferences