diff --git a/app/app.php b/app/app.php index 51168aadbd..7dfadcbad8 100644 --- a/app/app.php +++ b/app/app.php @@ -130,9 +130,9 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $ */ if (null !== $key && $user->isEmpty()) { $user = new Document([ - '$uid' => 0, + '$id' => 0, 'status' => Auth::USER_STATUS_ACTIVATED, - 'email' => 'app.'.$project->getUid().'@service.'.$domain, + 'email' => 'app.'.$project->getId().'@service.'.$domain, 'password' => '', 'name' => $project->getAttribute('name', 'Untitled'), ]); @@ -143,7 +143,7 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $ Authorization::setDefaultStatus(false); // Cancel security segmentation for API keys. } - Authorization::setRole('user:'.$user->getUid()); + Authorization::setRole('user:'.$user->getId()); Authorization::setRole('role:'.$role); array_map(function ($node) { @@ -159,7 +159,7 @@ $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 + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS !== $project->getCollection()) { // Check if permission is denied because project is missing throw new Exception('Project not found', 404); } @@ -178,14 +178,14 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $ * Background Jobs */ $webhook - ->setParam('projectId', $project->getUid()) + ->setParam('projectId', $project->getId()) ->setParam('event', $route->getLabel('webhook', '')) ->setParam('payload', []) ; $audit - ->setParam('projectId', $project->getUid()) - ->setParam('userId', $user->getUid()) + ->setParam('projectId', $project->getId()) + ->setParam('userId', $user->getId()) ->setParam('event', '') ->setParam('resource', '') ->setParam('userAgent', $request->getServer('HTTP_USER_AGENT', '')) @@ -194,7 +194,7 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $ ; $usage - ->setParam('projectId', $project->getUid()) + ->setParam('projectId', $project->getId()) ->setParam('url', $request->getServer('HTTP_HOST', '').$request->getServer('REQUEST_URI', '')) ->setParam('method', $request->getServer('REQUEST_METHOD', 'UNKNOWN')) ->setParam('request', 0) @@ -218,7 +218,7 @@ $utopia->shutdown(function () use ($response, $request, $webhook, $audit, $usage $route = $utopia->match($request); - if($project->getUid() + if($project->getId() && $mode !== APP_MODE_ADMIN && !empty($route->getLabel('sdk.namespace', null))) { // Don't calculate console usage and admin mode $usage @@ -369,11 +369,11 @@ $utopia->get('/v1/info') // This is only visible to gods 'environment' => $env, 'time' => date('Y-m-d H:i:s', time()), 'user' => [ - 'id' => $user->getUid(), + 'id' => $user->getId(), 'name' => $user->getAttribute('name', ''), ], 'project' => [ - 'id' => $project->getUid(), + 'id' => $project->getId(), 'name' => $project->getAttribute('name', ''), ], ]); diff --git a/app/config/collections.php b/app/config/collections.php index 63dae6a08c..45ad9a3a5b 100644 --- a/app/config/collections.php +++ b/app/config/collections.php @@ -6,7 +6,7 @@ use Database\Database; $collections = [ 'console' => [ - '$uid' => 'console', + '$id' => 'console', '$collection' => 'projects', '$permissions' => ['read' => ['*']], 'name' => 'Appwrite', @@ -71,7 +71,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_COLLECTIONS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_COLLECTIONS, + '$id' => Database::SYSTEM_COLLECTION_COLLECTIONS, '$permissions' => ['read' => ['*']], 'name' => 'Collections', 'structure' => true, @@ -126,7 +126,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_RULES => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_RULES, + '$id' => Database::SYSTEM_COLLECTION_RULES, '$permissions' => ['read' => ['*']], 'name' => 'Collections Rule', 'structure' => true, @@ -198,7 +198,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_USERS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_USERS, + '$id' => Database::SYSTEM_COLLECTION_USERS, '$permissions' => ['read' => ['*']], 'name' => 'User', 'structure' => true, @@ -308,7 +308,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_TOKENS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_TOKENS, + '$id' => Database::SYSTEM_COLLECTION_TOKENS, '$permissions' => ['read' => ['*']], 'name' => 'Token', 'structure' => true, @@ -362,7 +362,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_MEMBERSHIPS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_MEMBERSHIPS, + '$id' => Database::SYSTEM_COLLECTION_MEMBERSHIPS, '$permissions' => ['read' => ['*']], 'name' => 'Membership', 'structure' => true, @@ -434,7 +434,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_TEAMS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_TEAMS, + '$id' => Database::SYSTEM_COLLECTION_TEAMS, '$permissions' => ['read' => ['*']], 'name' => 'Team', 'structure' => true, @@ -470,7 +470,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_PROJECTS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_PROJECTS, + '$id' => Database::SYSTEM_COLLECTION_PROJECTS, '$permissions' => ['read' => ['*']], 'name' => 'Project', 'structure' => true, @@ -610,7 +610,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_WEBHOOKS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_WEBHOOKS, + '$id' => Database::SYSTEM_COLLECTION_WEBHOOKS, '$permissions' => ['read' => ['*']], 'name' => 'Webhook', 'structure' => true, @@ -673,7 +673,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_KEYS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_KEYS, + '$id' => Database::SYSTEM_COLLECTION_KEYS, '$permissions' => ['read' => ['*']], 'name' => 'Key', 'structure' => true, @@ -708,7 +708,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_TASKS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_TASKS, + '$id' => Database::SYSTEM_COLLECTION_TASKS, '$permissions' => ['read' => ['*']], 'name' => 'Task', 'structure' => true, @@ -861,7 +861,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_PLATFORMS => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_PLATFORMS, + '$id' => Database::SYSTEM_COLLECTION_PLATFORMS, '$permissions' => ['read' => ['*']], 'name' => 'Platform', 'structure' => true, @@ -933,7 +933,7 @@ $collections = [ ], Database::SYSTEM_COLLECTION_FILES => [ '$collection' => Database::SYSTEM_COLLECTION_COLLECTIONS, - '$uid' => Database::SYSTEM_COLLECTION_FILES, + '$id' => Database::SYSTEM_COLLECTION_FILES, '$permissions' => ['read' => ['*']], 'name' => 'File', 'structure' => true, diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index bbd4260c88..19d3d9fff3 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -55,7 +55,7 @@ $utopia->post('/v1/account') ->param('name', '', function () { return new Text(100); }, 'User name.', true) ->action( function ($email, $password, $name) use ($register, $request, $response, $audit, $projectDB, $project, $webhook, $oauth2Keys) { - if ('console' === $project->getUid()) { + if ('console' === $project->getId()) { $whitlistEmails = $project->getAttribute('authWhitelistEmails'); $whitlistIPs = $project->getAttribute('authWhitelistIPs'); $whitlistDomains = $project->getAttribute('authWhitelistDomains'); @@ -118,16 +118,16 @@ $utopia->post('/v1/account') ; $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.create') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ; $response ->setStatusCode(Response::STATUS_CODE_CREATED) ->json(array_merge($user->getArrayCopy(array_merge( [ - '$uid', + '$id', 'email', 'registration', 'name', @@ -162,9 +162,9 @@ $utopia->post('/v1/account/sessions') if (false == $profile || !Auth::passwordVerify($password, $profile->getAttribute('password'))) { $audit - //->setParam('userId', $profile->getUid()) + //->setParam('userId', $profile->getId()) ->setParam('event', 'account.sesssions.failed') - ->setParam('resource', 'users/'.($profile ? $profile->getUid() : '')) + ->setParam('resource', 'users/'.($profile ? $profile->getId() : '')) ; throw new Exception('Invalid credentials', 401); // Wrong password or username @@ -174,7 +174,7 @@ $utopia->post('/v1/account/sessions') $secret = Auth::tokenGenerator(); $session = new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, - '$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]], + '$permissions' => ['read' => ['user:'.$profile->getId()], 'write' => ['user:'.$profile->getId()]], 'type' => Auth::TOKEN_TYPE_LOGIN, 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak 'expire' => $expiry, @@ -182,7 +182,7 @@ $utopia->post('/v1/account/sessions') 'ip' => $request->getIP(), ]); - Authorization::setRole('user:'.$profile->getUid()); + Authorization::setRole('user:'.$profile->getId()); $session = $projectDB->createDocument($session->getArrayCopy()); @@ -206,16 +206,16 @@ $utopia->post('/v1/account/sessions') ; $audit - ->setParam('userId', $profile->getUid()) + ->setParam('userId', $profile->getId()) ->setParam('event', 'account.sessions.create') - ->setParam('resource', 'users/'.$profile->getUid()) + ->setParam('resource', 'users/'.$profile->getId()) ; $response - ->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) + ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($profile->getId(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, Auth::encodeSession($profile->getId(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->setStatusCode(Response::STATUS_CODE_CREATED) - ->json($session->getArrayCopy(['$uid', 'type', 'expire'])) + ->json($session->getArrayCopy(['$id', 'type', 'expire'])) ; } ); @@ -238,7 +238,7 @@ $utopia->get('/v1/account/sessions/oauth2/:provider') ->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/oauth2/callback/'.$provider.'/'.$project->getUid(); + $callback = $request->getServer('REQUEST_SCHEME', 'https').'://'.$request->getServer('HTTP_HOST').'/v1/account/sessions/oauth2/callback/'.$provider.'/'.$project->getId(); $appId = $project->getAttribute('usersOauth2'.ucfirst($provider).'Appid', ''); $appSecret = $project->getAttribute('usersOauth2'.ucfirst($provider).'Secret', '{}'); @@ -294,7 +294,7 @@ $utopia->get('/v1/account/sessions/oauth2/:provider/redirect') ->param('state', '', function () { return new Text(2048); }, 'OAuth2 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/oauth2/callback/'.$provider.'/'.$project->getUid(); + $callback = $request->getServer('REQUEST_SCHEME', 'https').'://'.$request->getServer('HTTP_HOST').'/v1/account/sessions/oauth2/callback/'.$provider.'/'.$project->getId(); $defaultState = ['success' => $project->getAttribute('url', ''), 'failure' => '']; $validateURL = new URL(); @@ -360,7 +360,7 @@ $utopia->get('/v1/account/sessions/oauth2/:provider/redirect') $projectDB->deleteDocument($current); //throw new Exception('User already logged in', 401); } - $user = (empty($user->getUid())) ? $projectDB->getCollection([ // Get user by provider id + $user = (empty($user->getId())) ? $projectDB->getCollection([ // Get user by provider id 'limit' => 1, 'first' => true, 'filters' => [ @@ -382,7 +382,7 @@ $utopia->get('/v1/account/sessions/oauth2/:provider/redirect') ], ]); - if (!$user || empty($user->getUid())) { // Last option -> create user alone, generate random password + if (!$user || empty($user->getId())) { // Last option -> create user alone, generate random password Authorization::disable(); $user = $projectDB->createDocument([ @@ -412,7 +412,7 @@ $utopia->get('/v1/account/sessions/oauth2/:provider/redirect') $expiry = time() + Auth::TOKEN_EXPIRATION_LOGIN_LONG; $session = new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, - '$permissions' => ['read' => ['user:'.$user['$uid']], 'write' => ['user:'.$user['$uid']]], + '$permissions' => ['read' => ['user:'.$user['$id']], 'write' => ['user:'.$user['$id']]], 'type' => Auth::TOKEN_TYPE_LOGIN, 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak 'expire' => $expiry, @@ -427,7 +427,7 @@ $utopia->get('/v1/account/sessions/oauth2/:provider/redirect') ->setAttribute('tokens', $session, Document::SET_TYPE_APPEND) ; - Authorization::setRole('user:'.$user->getUid()); + Authorization::setRole('user:'.$user->getId()); $user = $projectDB->updateDocument($user->getArrayCopy()); @@ -436,15 +436,15 @@ $utopia->get('/v1/account/sessions/oauth2/:provider/redirect') } $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.sessions.create') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ->setParam('data', ['provider' => $provider]) ; $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) + ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getId(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getId(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->redirect($state['success']) ; } @@ -462,7 +462,7 @@ $utopia->get('/v1/account') function () use ($response, &$user, $oauth2Keys) { $response->json(array_merge($user->getArrayCopy(array_merge( [ - '$uid', + '$id', 'email', 'registration', 'name', @@ -525,7 +525,7 @@ $utopia->get('/v1/account/sessions') $dd->parse(); $sessions[$index] = [ - '$uid' => $token->getUid(), + '$id' => $token->getId(), 'OS' => $dd->getOs(), 'client' => $dd->getClient(), 'device' => $dd->getDevice(), @@ -533,7 +533,7 @@ $utopia->get('/v1/account/sessions') 'model' => $dd->getModel(), 'ip' => $token->getAttribute('ip', ''), 'geo' => [], - 'current' => ($current == $token->getUid()) ? true : false, + 'current' => ($current == $token->getId()) ? true : false, ]; try { @@ -562,12 +562,12 @@ $utopia->get('/v1/account/logs') ->action( function () use ($response, $register, $project, $user) { $adapter = new AuditAdapter($register->get('db')); - $adapter->setNamespace('app_'.$project->getUid()); + $adapter->setNamespace('app_'.$project->getId()); $audit = new Audit($adapter); $countries = Locale::getText('countries'); - $logs = $audit->getLogsByUserAndActions($user->getUid(), [ + $logs = $audit->getLogsByUserAndActions($user->getId(), [ 'account.create', 'account.delete', 'account.update.name', @@ -644,14 +644,14 @@ $utopia->patch('/v1/account/name') } $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.update.name') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ; $response->json(array_merge($user->getArrayCopy(array_merge( [ - '$uid', + '$id', 'email', 'registration', 'name', @@ -686,14 +686,14 @@ $utopia->patch('/v1/account/password') } $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.update.password') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ; $response->json(array_merge($user->getArrayCopy(array_merge( [ - '$uid', + '$id', 'email', 'registration', 'name', @@ -744,14 +744,14 @@ $utopia->patch('/v1/account/email') } $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.update.email') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ; $response->json(array_merge($user->getArrayCopy(array_merge( [ - '$uid', + '$id', 'email', 'registration', 'name', @@ -785,7 +785,7 @@ $utopia->patch('/v1/account/prefs') $audit ->setParam('event', 'account.update.prefs') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ; $prefs = $user->getAttribute('prefs', '{}'); @@ -828,9 +828,9 @@ $utopia->delete('/v1/account') */ $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.delete') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ->setParam('data', $user->getArrayCopy()) ; @@ -868,15 +868,15 @@ $utopia->delete('/v1/account/sessions/:sessionId') $tokens = $user->getAttribute('tokens', []); foreach ($tokens as $token) { /* @var $token Document */ - if (($sessionId == $token->getUid()) && Auth::TOKEN_TYPE_LOGIN == $token->getAttribute('type')) { - if (!$projectDB->deleteDocument($token->getUid())) { + if (($sessionId == $token->getId()) && Auth::TOKEN_TYPE_LOGIN == $token->getAttribute('type')) { + if (!$projectDB->deleteDocument($token->getId())) { throw new Exception('Failed to remove token from DB', 500); } $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.sessions.delete') - ->setParam('resource', '/user/'.$user->getUid()) + ->setParam('resource', '/user/'.$user->getId()) ; $webhook @@ -915,14 +915,14 @@ $utopia->delete('/v1/account/sessions') $tokens = $user->getAttribute('tokens', []); foreach ($tokens as $token) { /* @var $token Document */ - if (!$projectDB->deleteDocument($token->getUid())) { + if (!$projectDB->deleteDocument($token->getId())) { throw new Exception('Failed to remove token from DB', 500); } $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.sessions.delete') - ->setParam('resource', '/user/'.$user->getUid()) + ->setParam('resource', '/user/'.$user->getId()) ; $webhook @@ -973,7 +973,7 @@ $utopia->post('/v1/account/recovery') $secret = Auth::tokenGenerator(); $recovery = new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, - '$permissions' => ['read' => ['user:'.$profile->getUid()], 'write' => ['user:'.$profile->getUid()]], + '$permissions' => ['read' => ['user:'.$profile->getId()], 'write' => ['user:'.$profile->getId()]], 'type' => Auth::TOKEN_TYPE_RECOVERY, 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak 'expire' => time() + Auth::TOKEN_EXPIRATION_RECOVERY, @@ -981,7 +981,7 @@ $utopia->post('/v1/account/recovery') 'ip' => $request->getIP(), ]); - Authorization::setRole('user:'.$profile->getUid()); + Authorization::setRole('user:'.$profile->getId()); $recovery = $projectDB->createDocument($recovery->getArrayCopy()); @@ -998,7 +998,7 @@ $utopia->post('/v1/account/recovery') } $url = Template::parseURL($url); - $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $profile->getUid(), 'secret' => $secret]); + $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $profile->getId(), 'secret' => $secret]); $url = Template::unParseURL($url); $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('account.emails.recovery.body')); @@ -1024,14 +1024,14 @@ $utopia->post('/v1/account/recovery') } $audit - ->setParam('userId', $profile->getUid()) + ->setParam('userId', $profile->getId()) ->setParam('event', 'account.recovery.create') - ->setParam('resource', 'users/'.$profile->getUid()) + ->setParam('resource', 'users/'.$profile->getId()) ; $response ->setStatusCode(Response::STATUS_CODE_CREATED) - ->json($recovery->getArrayCopy(['$uid', 'type', 'expire'])) + ->json($recovery->getArrayCopy(['$id', 'type', 'expire'])) ; } ); @@ -1060,7 +1060,7 @@ $utopia->put('/v1/account/recovery') 'first' => true, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_USERS, - '$uid='.$userId, + '$id='.$userId, ], ]); @@ -1074,7 +1074,7 @@ $utopia->put('/v1/account/recovery') throw new Exception('Invalid recovery token', 401); } - Authorization::setRole('user:'.$profile->getUid()); + Authorization::setRole('user:'.$profile->getId()); $profile = $projectDB->updateDocument(array_merge($profile->getArrayCopy(), [ 'password' => Auth::passwordHash($passwordA), @@ -1095,14 +1095,14 @@ $utopia->put('/v1/account/recovery') } $audit - ->setParam('userId', $profile->getUid()) + ->setParam('userId', $profile->getId()) ->setParam('event', 'account.recovery.update') - ->setParam('resource', 'users/'.$profile->getUid()) + ->setParam('resource', 'users/'.$profile->getId()) ; - $recovery = $profile->search('$uid', $recovery, $profile->getAttribute('tokens', [])); + $recovery = $profile->search('$id', $recovery, $profile->getAttribute('tokens', [])); - $response->json($recovery->getArrayCopy(['$uid', 'type', 'expire'])); + $response->json($recovery->getArrayCopy(['$id', 'type', 'expire'])); } ); @@ -1122,7 +1122,7 @@ $utopia->post('/v1/account/verification') $verification = new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, - '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], + '$permissions' => ['read' => ['user:'.$user->getId()], 'write' => ['user:'.$user->getId()]], 'type' => Auth::TOKEN_TYPE_VERIFICATION, 'secret' => Auth::hash($verificationSecret), // On way hash encryption to protect DB leak 'expire' => time() + Auth::TOKEN_EXPIRATION_CONFIRM, @@ -1130,7 +1130,7 @@ $utopia->post('/v1/account/verification') 'ip' => $request->getIP(), ]); - Authorization::setRole('user:'.$user->getUid()); + Authorization::setRole('user:'.$user->getId()); $verification = $projectDB->createDocument($verification->getArrayCopy()); @@ -1147,7 +1147,7 @@ $utopia->post('/v1/account/verification') } $url = Template::parseURL($url); - $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $user->getUid(), 'secret' => $verificationSecret]); + $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['userId' => $user->getId(), 'secret' => $verificationSecret]); $url = Template::unParseURL($url); $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('account.emails.verification.body')); @@ -1173,14 +1173,14 @@ $utopia->post('/v1/account/verification') } $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'account.verification.create') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ; $response ->setStatusCode(Response::STATUS_CODE_CREATED) - ->json($verification->getArrayCopy(['$uid', 'type', 'expire'])) + ->json($verification->getArrayCopy(['$id', 'type', 'expire'])) ; } ); @@ -1203,7 +1203,7 @@ $utopia->put('/v1/account/verification') 'first' => true, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_USERS, - '$uid='.$userId, + '$id='.$userId, ], ]); @@ -1217,7 +1217,7 @@ $utopia->put('/v1/account/verification') throw new Exception('Invalid verification token', 401); } - Authorization::setRole('user:'.$profile->getUid()); + Authorization::setRole('user:'.$profile->getId()); $profile = $projectDB->updateDocument(array_merge($profile->getArrayCopy(), [ 'emailVerification' => true, @@ -1236,13 +1236,13 @@ $utopia->put('/v1/account/verification') } $audit - ->setParam('userId', $profile->getUid()) + ->setParam('userId', $profile->getId()) ->setParam('event', 'account.verification.update') - ->setParam('resource', 'users/'.$user->getUid()) + ->setParam('resource', 'users/'.$user->getId()) ; - $verification = $profile->search('$uid', $verification, $profile->getAttribute('tokens', [])); + $verification = $profile->search('$id', $verification, $profile->getAttribute('tokens', [])); - $response->json($verification->getArrayCopy(['$uid', 'type', 'expire'])); + $response->json($verification->getArrayCopy(['$id', 'type', 'expire'])); } ); \ No newline at end of file diff --git a/app/controllers/api/database.php b/app/controllers/api/database.php index 753b50ad5b..04edc2ea79 100644 --- a/app/controllers/api/database.php +++ b/app/controllers/api/database.php @@ -78,7 +78,7 @@ $utopia->post('/v1/database/collections') $audit ->setParam('event', 'database.collections.create') - ->setParam('resource', 'database/collection/'.$data['$uid']) + ->setParam('resource', 'database/collection/'.$data['$id']) ->setParam('data', $data) ; @@ -152,7 +152,7 @@ $utopia->get('/v1/database/collections/:collectionId') function ($collectionId) use ($response, $projectDB) { $collection = $projectDB->getDocument($collectionId, false); - if (empty($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { + if (empty($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { throw new Exception('Collection not found', 404); } @@ -177,7 +177,7 @@ $utopia->put('/v1/database/collections/:collectionId') 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()) { + if (empty($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { throw new Exception('Collection not found', 404); } @@ -216,7 +216,7 @@ $utopia->put('/v1/database/collections/:collectionId') $audit ->setParam('event', 'database.collections.update') - ->setParam('resource', 'database/collections/'.$data['$uid']) + ->setParam('resource', 'database/collections/'.$data['$id']) ->setParam('data', $data) ; @@ -237,7 +237,7 @@ $utopia->delete('/v1/database/collections/:collectionId') function ($collectionId) use ($response, $projectDB, $webhook, $audit) { $collection = $projectDB->getDocument($collectionId, false); - if (empty($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { + if (empty($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { throw new Exception('Collection not found', 404); } @@ -253,7 +253,7 @@ $utopia->delete('/v1/database/collections/:collectionId') $audit ->setParam('event', 'database.collections.delete') - ->setParam('resource', 'database/collections/'.$data['$uid']) + ->setParam('resource', 'database/collections/'.$data['$id']) ->setParam('data', $data) ; @@ -284,13 +284,13 @@ $utopia->post('/v1/database/collections/:collectionId/documents') throw new Exception('Missing payload', 400); } - if (isset($data['$uid'])) { - throw new Exception('$uid is not allowed for creating new documents, try update instead', 400); + if (isset($data['$id'])) { + throw new Exception('$id is not allowed for creating new documents, try update instead', 400); } $collection = $projectDB->getDocument($collectionId/*, $isDev*/); - if (is_null($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { + if (is_null($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { throw new Exception('Collection not found', 404); } @@ -354,7 +354,7 @@ $utopia->post('/v1/database/collections/:collectionId/documents') $audit ->setParam('event', 'database.documents.create') - ->setParam('resource', 'database/document/'.$data['$uid']) + ->setParam('resource', 'database/document/'.$data['$id']) ->setParam('data', $data) ; @@ -376,10 +376,10 @@ $utopia->get('/v1/database/collections/:collectionId/documents') ->label('sdk.method', 'listDocuments') ->label('sdk.description', '/docs/references/database/list-documents.md') ->param('collectionId', null, function () { return new UID(); }, 'Collection unique ID. You can create a new collection with validation rules using the Database service [server integration](/docs/database?platform=server#createCollection).') - ->param('filters', [], function () { return new ArrayList(new Text(128)); }, 'Array of filter strings. Each filter is constructed from a key name, comparison operator (=, !=, >, <, <=, >=) and a value. You can also use a dot (.) separator in attribute names to filter by child document attributes. Examples: \'name=John Doe\' or \'category.$uid>=5bed2d152c362\'.', true) + ->param('filters', [], function () { return new ArrayList(new Text(128)); }, 'Array of filter strings. Each filter is constructed from a key name, comparison operator (=, !=, >, <, <=, >=) and a value. You can also use a dot (.) separator in attribute names to filter by child document attributes. Examples: \'name=John Doe\' or \'category.$id>=5bed2d152c362\'.', true) ->param('offset', 0, function () { return new Range(0, 900000000); }, 'Offset value. Use this value to manage pagination.', true) ->param('limit', 50, function () { return new Range(0, 1000); }, 'Maximum number of documents to return in response. Use this value to manage pagination.', true) - ->param('order-field', '$uid', function () { return new Text(128); }, 'Document field that results will be sorted by.', true) + ->param('order-field', '$id', function () { return new Text(128); }, 'Document field that results will be sorted by.', true) ->param('order-type', 'ASC', function () { return new WhiteList(array('DESC', 'ASC')); }, 'Order direction. Possible values are DESC for descending order, or ASC for ascending order.', true) ->param('order-cast', 'string', function () { return new WhiteList(array('int', 'string', 'date', 'time', 'datetime')); }, 'Order field type casting. Possible values are int, string, date, time or datetime. The database will attempt to cast the order field to the value you pass here. The default value is a string.', true) ->param('search', '', function () { return new Text(256); }, 'Search query. Enter any free text search. The database will try to find a match against all document attributes and children.', true) @@ -389,7 +389,7 @@ $utopia->get('/v1/database/collections/:collectionId/documents') function ($collectionId, $filters, $offset, $limit, $orderField, $orderType, $orderCast, $search, $first, $last) use ($response, $projectDB, $isDev) { $collection = $projectDB->getDocument($collectionId, $isDev); - if (is_null($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { + if (is_null($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { throw new Exception('Collection not found', 404); } @@ -430,7 +430,7 @@ $utopia->get('/v1/database/collections/:collectionId/documents') /* * View */ - $response->json($collection->getArrayCopy(/*['$uid', '$collection', 'name', 'documents']*/[], ['rules'])); + $response->json($collection->getArrayCopy(/*['$id', '$collection', 'name', 'documents']*/[], ['rules'])); } } ); @@ -449,7 +449,7 @@ $utopia->get('/v1/database/collections/:collectionId/documents/:documentId') $document = $projectDB->getDocument($documentId, $isDev); $collection = $projectDB->getDocument($collectionId, $isDev); - if (empty($document->getArrayCopy()) || $document->getCollection() != $collection->getUid()) { // Check empty + if (empty($document->getArrayCopy()) || $document->getCollection() != $collection->getId()) { // Check empty throw new Exception('No document found', 404); } @@ -463,7 +463,7 @@ $utopia->get('/v1/database/collections/:collectionId/documents/:documentId') $output = $document->getAttribute(implode('.', $paths)); } else { $id = (int) array_pop($paths); - $output = $document->search('$uid', $id, $document->getAttribute(implode('.', $paths))); + $output = $document->search('$id', $id, $document->getAttribute(implode('.', $paths))); } $output = ($output instanceof Document) ? $output->getArrayCopy() : $output; @@ -504,7 +504,7 @@ $utopia->patch('/v1/database/collections/:collectionId/documents/:documentId') throw new Exception('Data param should be a valid JSON', 400); } - if (is_null($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { + if (is_null($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { throw new Exception('Collection not found', 404); } @@ -524,8 +524,8 @@ $utopia->patch('/v1/database/collections/:collectionId/documents/:documentId') $data = array_merge($document->getArrayCopy(), $data); - $data['$collection'] = $collection->getUid(); // Make sure user don't switch collectionID - $data['$uid'] = $document->getUid(); // Make sure user don't switch document unique ID + $data['$collection'] = $collection->getId(); // Make sure user don't switch collectionID + $data['$id'] = $document->getId(); // Make sure user don't switch document unique ID if (empty($data)) { throw new Exception('Missing payload', 400); @@ -548,7 +548,7 @@ $utopia->patch('/v1/database/collections/:collectionId/documents/:documentId') $audit ->setParam('event', 'database.documents.update') - ->setParam('resource', 'database/document/'.$data['$uid']) + ->setParam('resource', 'database/document/'.$data['$id']) ->setParam('data', $data) ; @@ -578,7 +578,7 @@ $utopia->delete('/v1/database/collections/:collectionId/documents/:documentId') throw new Exception('No document found', 404); } - if (is_null($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { + if (is_null($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { throw new Exception('Collection not found', 404); } @@ -600,7 +600,7 @@ $utopia->delete('/v1/database/collections/:collectionId/documents/:documentId') $audit ->setParam('event', 'database.documents.delete') - ->setParam('resource', 'database/document/'.$data['$uid']) + ->setParam('resource', 'database/document/'.$data['$id']) ->setParam('data', $data) // Audit document in case of malicious or disastrous action ; diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 626ebb05d4..f7cfb77399 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -41,7 +41,7 @@ $utopia->post('/v1/projects') 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()) { + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); } @@ -62,7 +62,7 @@ $utopia->post('/v1/projects') 'legalCity' => $legalCity, 'legalAddress' => $legalAddress, 'legalTaxId' => $legalTaxId, - 'teamId' => $team->getUid(), + 'teamId' => $team->getId(), 'platforms' => [], 'webhooks' => [], 'keys' => [], @@ -74,7 +74,7 @@ $utopia->post('/v1/projects') throw new Exception('Failed saving project to DB', 500); } - $consoleDB->createNamespace($project->getUid()); + $consoleDB->createNamespace($project->getId()); $response ->setStatusCode(Response::STATUS_CODE_CREATED) @@ -126,7 +126,7 @@ $utopia->get('/v1/projects/:projectId') function ($projectId) use ($request, $response, $providers, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -153,7 +153,7 @@ $utopia->get('/v1/projects/:projectId/usage') function ($projectId) use ($response, $consoleDB, $projectDB, $register) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -170,7 +170,7 @@ $utopia->get('/v1/projects/:projectId/usage') $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)'); + $result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_requests_all" WHERE time > \''.$start.'\' AND time < \''.$end.'\' AND "metric_type"=\'counter\' AND "project"=\''.$project->getId().'\' GROUP BY time(1d) FILL(null)'); $points = $result->getPoints(); foreach ($points as $point) { @@ -181,7 +181,7 @@ $utopia->get('/v1/projects/:projectId/usage') } // 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)'); + $result = $database->query('SELECT sum(value) AS "value" FROM "appwrite_usage_network_all" WHERE time > \''.$start.'\' AND time < \''.$end.'\' AND "metric_type"=\'counter\' AND "project"=\''.$project->getId().'\' GROUP BY time(1d) FILL(null)'); $points = $result->getPoints(); foreach ($points as $point) { @@ -223,7 +223,7 @@ $utopia->get('/v1/projects/:projectId/usage') 'limit' => 0, 'offset' => 0, 'filters' => [ - '$collection='.$collection['$uid'], + '$collection='.$collection['$id'], ], ]); @@ -297,7 +297,7 @@ $utopia->patch('/v1/projects/:projectId') 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()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -335,7 +335,7 @@ $utopia->patch('/v1/projects/:projectId/oauth2') function ($projectId, $provider, $appId, $secret) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -378,7 +378,7 @@ $utopia->delete('/v1/projects/:projectId') $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -389,7 +389,7 @@ $utopia->delete('/v1/projects/:projectId') } // Delete all DBs - // $consoleDB->deleteNamespace($project->getUid()); + // $consoleDB->deleteNamespace($project->getId()); // Optimize DB? @@ -418,7 +418,7 @@ $utopia->post('/v1/projects/:projectId/webhooks') 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()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -476,7 +476,7 @@ $utopia->get('/v1/projects/:projectId/webhooks') function ($projectId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -509,11 +509,11 @@ $utopia->get('/v1/projects/:projectId/webhooks/:webhookId') function ($projectId, $webhookId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $webhook = $project->search('$uid', $webhookId, $project->getAttribute('webhooks', [])); + $webhook = $project->search('$id', $webhookId, $project->getAttribute('webhooks', [])); if (empty($webhook) && $webhook instanceof Document) { throw new Exception('Webhook not found', 404); @@ -548,7 +548,7 @@ $utopia->put('/v1/projects/:projectId/webhooks/:webhookId') 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()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -563,7 +563,7 @@ $utopia->put('/v1/projects/:projectId/webhooks/:webhookId') 'version' => '1', ]); - $webhook = $project->search('$uid', $webhookId, $project->getAttribute('webhooks', [])); + $webhook = $project->search('$id', $webhookId, $project->getAttribute('webhooks', [])); if (empty($webhook) && $webhook instanceof Document) { throw new Exception('Webhook not found', 404); @@ -597,17 +597,17 @@ $utopia->delete('/v1/projects/:projectId/webhooks/:webhookId') function ($projectId, $webhookId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $webhook = $project->search('$uid', $webhookId, $project->getAttribute('webhooks', [])); + $webhook = $project->search('$id', $webhookId, $project->getAttribute('webhooks', [])); if (empty($webhook) && $webhook instanceof Document) { throw new Exception('Webhook not found', 404); } - if (!$consoleDB->deleteDocument($webhook->getUid())) { + if (!$consoleDB->deleteDocument($webhook->getId())) { throw new Exception('Failed to remove webhook from DB', 500); } @@ -629,7 +629,7 @@ $utopia->post('/v1/projects/:projectId/keys') function ($projectId, $name, $scopes) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -673,7 +673,7 @@ $utopia->get('/v1/projects/:projectId/keys') function ($projectId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -692,11 +692,11 @@ $utopia->get('/v1/projects/:projectId/keys/:keyId') function ($projectId, $keyId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $key = $project->search('$uid', $keyId, $project->getAttribute('keys', [])); + $key = $project->search('$id', $keyId, $project->getAttribute('keys', [])); if (empty($key) && $key instanceof Document) { throw new Exception('Key not found', 404); @@ -719,11 +719,11 @@ $utopia->put('/v1/projects/:projectId/keys/:keyId') function ($projectId, $keyId, $name, $scopes) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $key = $project->search('$uid', $keyId, $project->getAttribute('keys', [])); + $key = $project->search('$id', $keyId, $project->getAttribute('keys', [])); if (empty($key) && $key instanceof Document) { throw new Exception('Key not found', 404); @@ -753,17 +753,17 @@ $utopia->delete('/v1/projects/:projectId/keys/:keyId') function ($projectId, $keyId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $key = $project->search('$uid', $keyId, $project->getAttribute('keys', [])); + $key = $project->search('$id', $keyId, $project->getAttribute('keys', [])); if (empty($key) && $key instanceof Document) { throw new Exception('Key not found', 404); } - if (!$consoleDB->deleteDocument($key->getUid())) { + if (!$consoleDB->deleteDocument($key->getId())) { throw new Exception('Failed to remove key from DB', 500); } @@ -792,7 +792,7 @@ $utopia->post('/v1/projects/:projectId/tasks') 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()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -865,7 +865,7 @@ $utopia->get('/v1/projects/:projectId/tasks') function ($projectId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -898,11 +898,11 @@ $utopia->get('/v1/projects/:projectId/tasks/:taskId') function ($projectId, $taskId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $task = $project->search('$uid', $taskId, $project->getAttribute('tasks', [])); + $task = $project->search('$id', $taskId, $project->getAttribute('tasks', [])); if (empty($task) && $task instanceof Document) { throw new Exception('Task not found', 404); @@ -939,11 +939,11 @@ $utopia->put('/v1/projects/:projectId/tasks/:taskId') 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()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $task = $project->search('$uid', $taskId, $project->getAttribute('tasks', [])); + $task = $project->search('$id', $taskId, $project->getAttribute('tasks', [])); if (empty($task) && $task instanceof Document) { throw new Exception('Task not found', 404); @@ -1000,17 +1000,17 @@ $utopia->delete('/v1/projects/:projectId/tasks/:taskId') function ($projectId, $taskId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $task = $project->search('$uid', $taskId, $project->getAttribute('tasks', [])); + $task = $project->search('$id', $taskId, $project->getAttribute('tasks', [])); if (empty($task) && $task instanceof Document) { throw new Exception('Task not found', 404); } - if (!$consoleDB->deleteDocument($task->getUid())) { + if (!$consoleDB->deleteDocument($task->getId())) { throw new Exception('Failed to remove tasks from DB', 500); } @@ -1035,7 +1035,7 @@ $utopia->post('/v1/projects/:projectId/platforms') function ($projectId, $type, $name, $key, $store, $url) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -1083,7 +1083,7 @@ $utopia->get('/v1/projects/:projectId/platforms') function ($projectId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } @@ -1104,11 +1104,11 @@ $utopia->get('/v1/projects/:projectId/platforms/:platformId') function ($projectId, $platformId) use ($request, $response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', [])); + $platform = $project->search('$id', $platformId, $project->getAttribute('platforms', [])); if (empty($platform) && $platform instanceof Document) { throw new Exception('Platform not found', 404); @@ -1133,11 +1133,11 @@ $utopia->put('/v1/projects/:projectId/platforms/:platformId') function ($projectId, $platformId, $name, $key, $store, $url) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', [])); + $platform = $project->search('$id', $platformId, $project->getAttribute('platforms', [])); if (empty($platform) && $platform instanceof Document) { throw new Exception('Platform not found', 404); @@ -1170,17 +1170,17 @@ $utopia->delete('/v1/projects/:projectId/platforms/:platformId') function ($projectId, $platformId) use ($response, $consoleDB) { $project = $consoleDB->getDocument($projectId); - if (empty($project->getUid()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { + if (empty($project->getId()) || Database::SYSTEM_COLLECTION_PROJECTS != $project->getCollection()) { throw new Exception('Project not found', 404); } - $platform = $project->search('$uid', $platformId, $project->getAttribute('platforms', [])); + $platform = $project->search('$id', $platformId, $project->getAttribute('platforms', [])); if (empty($platform) && $platform instanceof Document) { throw new Exception('Platform not found', 404); } - if (!$consoleDB->deleteDocument($platform->getUid())) { + if (!$consoleDB->deleteDocument($platform->getId())) { throw new Exception('Failed to remove platform from DB', 500); } diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index c69e951a2f..5ded8df37a 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -25,7 +25,7 @@ use OpenSSL\OpenSSL; include_once __DIR__ . '/../shared/api.php'; -Storage::addDevice('local', new Local('/storage/uploads/app-'.$project->getUid())); +Storage::addDevice('local', new Local('/storage/uploads/app-'.$project->getId())); $fileLogos = [ // Based on this list @see http://stackoverflow.com/a/4212908/2299554 'default' => 'default.gif', @@ -132,8 +132,8 @@ $utopia->post('/v1/storage/files') ->action( 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; + $read = (empty($read)) ? ['user:'.$user->getId()] : $read; + $write = (empty($write)) ? ['user:'.$user->getId()] : $write; /* * Validators @@ -236,7 +236,7 @@ $utopia->post('/v1/storage/files') $audit ->setParam('event', 'storage.files.create') - ->setParam('resource', 'storage/files/'.$file->getUid()) + ->setParam('resource', 'storage/files/'.$file->getId()) ; $usage @@ -276,7 +276,7 @@ $utopia->get('/v1/storage/files') ]); $results = array_map(function ($value) { /* @var $value \Database\Document */ - return $value->getArrayCopy(['$uid', '$permissions', 'name', 'dateCreated', 'signature', 'mimeType', 'sizeOriginal']); + return $value->getArrayCopy(['$id', '$permissions', 'name', 'dateCreated', 'signature', 'mimeType', 'sizeOriginal']); }, $results); $response->json(['sum' => $projectDB->getSum(), 'files' => $results]); @@ -295,11 +295,11 @@ $utopia->get('/v1/storage/files/:fileId') function ($fileId) use ($response, $projectDB) { $file = $projectDB->getDocument($fileId); - if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { + if (empty($file->getId()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { throw new Exception('File not found', 404); } - $response->json($file->getArrayCopy(['$uid', '$permissions', 'name', 'dateCreated', 'signature', 'mimeType', 'sizeOriginal'])); + $response->json($file->getArrayCopy(['$id', '$permissions', 'name', 'dateCreated', 'signature', 'mimeType', 'sizeOriginal'])); } ); @@ -341,7 +341,7 @@ $utopia->get('/v1/storage/files/:fileId/preview') $file = $projectDB->getDocument($fileId); - if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { + if (empty($file->getId()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { throw new Exception('File not found', 404); } @@ -357,7 +357,7 @@ $utopia->get('/v1/storage/files/:fileId/preview') throw new Exception('File not found in '.$path, 404); } - $cache = new Cache(new Filesystem('/storage/cache/app-'.$project->getUid())); // Limit file number or size + $cache = new Cache(new Filesystem('/storage/cache/app-'.$project->getId())); // Limit file number or size $data = $cache->load($key, 60 * 60 * 24 * 30 * 3 /* 3 months */); if ($data) { @@ -367,8 +367,10 @@ $utopia->get('/v1/storage/files/:fileId/preview') ->setContentType((in_array($output, $outputs)) ? $outputs[$output] : $outputs['jpg']) ->addHeader('Expires', $date) ->addHeader('X-Appwrite-Cache', 'hit') - ->send($data, 0) + ->send($data) ; + + return; } $source = $device->read($path); @@ -402,7 +404,7 @@ $utopia->get('/v1/storage/files/:fileId/preview') ->setContentType($outputs[$output]) ->addHeader('Expires', $date) ->addHeader('X-Appwrite-Cache', 'miss') - ->send('', null) + ->send('') ; $data = $resize->output($output, $quality); @@ -412,8 +414,6 @@ $utopia->get('/v1/storage/files/:fileId/preview') echo $data; unset($resize); - - exit(0); } ); @@ -431,7 +431,7 @@ $utopia->get('/v1/storage/files/:fileId/download') function ($fileId) use ($response, $request, $projectDB) { $file = $projectDB->getDocument($fileId); - if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { + if (empty($file->getId()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { throw new Exception('File not found', 404); } @@ -485,7 +485,7 @@ $utopia->get('/v1/storage/files/:fileId/view') function ($fileId, $as) use ($response, $request, $projectDB, $mimes) { $file = $projectDB->getDocument($fileId); - if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { + if (empty($file->getId()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { throw new Exception('File not found', 404); } @@ -556,7 +556,7 @@ $utopia->put('/v1/storage/files/:fileId') function ($fileId, $read, $write, $folderId = '') use ($response, $projectDB, $audit, $webhook) { $file = $projectDB->getDocument($fileId); - if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { + if (empty($file->getId()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { throw new Exception('File not found', 404); } @@ -578,7 +578,7 @@ $utopia->put('/v1/storage/files/:fileId') $audit ->setParam('event', 'storage.files.update') - ->setParam('resource', 'storage/files/'.$file->getUid()) + ->setParam('resource', 'storage/files/'.$file->getId()) ; $response->json($file->getArrayCopy()); @@ -598,7 +598,7 @@ $utopia->delete('/v1/storage/files/:fileId') function ($fileId) use ($response, $projectDB, $webhook, $audit, $usage) { $file = $projectDB->getDocument($fileId); - if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { + if (empty($file->getId()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { throw new Exception('File not found', 404); } @@ -616,7 +616,7 @@ $utopia->delete('/v1/storage/files/:fileId') $audit ->setParam('event', 'storage.files.delete') - ->setParam('resource', 'storage/files/'.$file->getUid()) + ->setParam('resource', 'storage/files/'.$file->getId()) ; $usage @@ -640,7 +640,7 @@ $utopia->get('/v1/storage/files/:fileId/scan') function ($fileId, $storage) use ($response, $request, $projectDB) { $file = $projectDB->getDocument($fileId); - if (empty($file->getUid()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { + if (empty($file->getId()) || Database::SYSTEM_COLLECTION_FILES != $file->getCollection()) { throw new Exception('File not found', 404); } diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 072768baac..d14e9fb046 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -40,7 +40,7 @@ $utopia->post('/v1/teams') 'write' => ['team:{self}/owner'], ], 'name' => $name, - 'sum' => ($mode !== APP_MODE_ADMIN && $user->getUid()) ? 1 : 0, + 'sum' => ($mode !== APP_MODE_ADMIN && $user->getId()) ? 1 : 0, 'dateCreated' => time(), ]); @@ -50,15 +50,15 @@ $utopia->post('/v1/teams') throw new Exception('Failed saving team to DB', 500); } - if ($mode !== APP_MODE_ADMIN && $user->getUid()) { // Don't add user on server mode + if ($mode !== APP_MODE_ADMIN && $user->getId()) { // Don't add user on server mode $membership = new Document([ '$collection' => Database::SYSTEM_COLLECTION_MEMBERSHIPS, '$permissions' => [ - 'read' => ['user:'.$user->getUid(), 'team:'.$team->getUid()], - 'write' => ['user:'.$user->getUid(), 'team:'.$team->getUid().'/owner'], + 'read' => ['user:'.$user->getId(), 'team:'.$team->getId()], + 'write' => ['user:'.$user->getId(), 'team:'.$team->getId().'/owner'], ], - 'userId' => $user->getUid(), - 'teamId' => $team->getUid(), + 'userId' => $user->getId(), + 'teamId' => $team->getId(), 'roles' => $roles, 'invited' => time(), 'joined' => time(), @@ -124,7 +124,7 @@ $utopia->get('/v1/teams/:teamId') function ($teamId) use ($response, $projectDB) { $team = $projectDB->getDocument($teamId); - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); } @@ -145,7 +145,7 @@ $utopia->put('/v1/teams/:teamId') function ($teamId, $name) use ($response, $projectDB) { $team = $projectDB->getDocument($teamId); - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); } @@ -173,7 +173,7 @@ $utopia->delete('/v1/teams/:teamId') function ($teamId) use ($response, $projectDB) { $team = $projectDB->getDocument($teamId); - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); } @@ -187,7 +187,7 @@ $utopia->delete('/v1/teams/:teamId') ]); foreach ($memberships as $member) { - if (!$projectDB->deleteDocument($member->getUid())) { + if (!$projectDB->deleteDocument($member->getId())) { throw new Exception('Failed to remove membership for team from DB', 500); } } @@ -217,7 +217,7 @@ $utopia->post('/v1/teams/:teamId/memberships') $name = (empty($name)) ? $email : $name; $team = $projectDB->getDocument($teamId); - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); } @@ -226,7 +226,7 @@ $utopia->post('/v1/teams/:teamId/memberships') 'offset' => 0, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_MEMBERSHIPS, - 'teamId='.$team->getUid(), + 'teamId='.$team->getId(), ], ]); @@ -270,11 +270,11 @@ $utopia->post('/v1/teams/:teamId/memberships') $isOwner = false; foreach ($memberships as $member) { - if ($member->getAttribute('userId') == $invitee->getUid()) { + if ($member->getAttribute('userId') == $invitee->getId()) { 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', []))) { + if ($member->getAttribute('userId') == $user->getId() && in_array('owner', $member->getAttribute('roles', []))) { $isOwner = true; } } @@ -289,10 +289,10 @@ $utopia->post('/v1/teams/:teamId/memberships') '$collection' => Database::SYSTEM_COLLECTION_MEMBERSHIPS, '$permissions' => [ 'read' => ['*'], - 'write' => ['user:'.$invitee->getUid(), 'team:'.$team->getUid().'/owner'], + 'write' => ['user:'.$invitee->getId(), 'team:'.$team->getId().'/owner'], ], - 'userId' => $invitee->getUid(), - 'teamId' => $team->getUid(), + 'userId' => $invitee->getId(), + 'teamId' => $team->getId(), 'roles' => $roles, 'invited' => time(), 'joined' => 0, @@ -307,7 +307,7 @@ $utopia->post('/v1/teams/:teamId/memberships') } $url = Template::parseURL($url); - $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['inviteId' => $membership->getUid(), 'teamId' => $team->getUid(), 'userId' => $invitee->getUid(), 'secret' => $secret, 'teamId' => $teamId]); + $url['query'] = Template::mergeQuery(((isset($url['query'])) ? $url['query'] : ''), ['inviteId' => $membership->getId(), 'teamId' => $team->getId(), 'userId' => $invitee->getId(), 'secret' => $secret, 'teamId' => $teamId]); $url = Template::unParseURL($url); $body = new Template(__DIR__.'/../../config/locales/templates/'.Locale::getText('account.emails.invitation.body')); @@ -334,7 +334,7 @@ $utopia->post('/v1/teams/:teamId/memberships') } $audit - ->setParam('userId', $invitee->getUid()) + ->setParam('userId', $invitee->getId()) ->setParam('event', 'teams.membership.create') ->setParam('resource', 'teams/'.$teamId) ; @@ -342,7 +342,7 @@ $utopia->post('/v1/teams/:teamId/memberships') $response ->setStatusCode(Response::STATUS_CODE_CREATED) // TODO change response of this endpoint ->json(array_merge($membership->getArrayCopy([ - '$uid', + '$id', 'userId', 'teamId', 'roles', @@ -369,7 +369,7 @@ $utopia->get('/v1/teams/:teamId/memberships') function ($teamId) use ($response, $projectDB) { $team = $projectDB->getDocument($teamId); - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); } @@ -392,7 +392,7 @@ $utopia->get('/v1/teams/:teamId/memberships') $temp = $projectDB->getDocument($membership->getAttribute('userId', null))->getArrayCopy(['email', 'name']); $users[] = array_merge($temp, $membership->getArrayCopy([ - '$uid', + '$id', 'userId', 'teamId', 'roles', @@ -429,7 +429,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') 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()) { + if (empty($membership->getId()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { throw new Exception('Invite not found', 404); } @@ -443,7 +443,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') Authorization::reset(); - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); } @@ -455,18 +455,18 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') throw new Exception('Invite not belong to current user ('.$user->getAttribute('email').')', 401); } - if (empty($user->getUid())) { + if (empty($user->getId())) { $user = $projectDB->getCollection([ // Get user 'limit' => 1, 'first' => true, 'filters' => [ '$collection='.Database::SYSTEM_COLLECTION_USERS, - '$uid='.$userId, + '$id='.$userId, ], ]); } - if ($membership->getAttribute('userId') !== $user->getUid()) { + if ($membership->getAttribute('userId') !== $user->getId()) { throw new Exception('Invite not belong to current user ('.$user->getAttribute('email').')', 401); } @@ -486,7 +486,7 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') $user->setAttribute('tokens', new Document([ '$collection' => Database::SYSTEM_COLLECTION_TOKENS, - '$permissions' => ['read' => ['user:'.$user->getUid()], 'write' => ['user:'.$user->getUid()]], + '$permissions' => ['read' => ['user:'.$user->getId()], 'write' => ['user:'.$user->getId()]], 'type' => Auth::TOKEN_TYPE_LOGIN, 'secret' => Auth::hash($secret), // On way hash encryption to protect DB leak 'expire' => $expiry, @@ -515,16 +515,16 @@ $utopia->patch('/v1/teams/:teamId/memberships/:inviteId/status') } $audit - ->setParam('userId', $user->getUid()) + ->setParam('userId', $user->getId()) ->setParam('event', 'teams.membership.update') ->setParam('resource', 'teams/'.$teamId) ; $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) + ->addCookie(Auth::$cookieName.'_legacy', Auth::encodeSession($user->getId(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, null) + ->addCookie(Auth::$cookieName, Auth::encodeSession($user->getId(), $secret), $expiry, '/', COOKIE_DOMAIN, ('https' == $request->getServer('REQUEST_SCHEME', 'https')), true, COOKIE_SAMESITE) ->json(array_merge($membership->getArrayCopy([ - '$uid', + '$id', 'userId', 'teamId', 'roles', @@ -552,7 +552,7 @@ $utopia->delete('/v1/teams/:teamId/memberships/:inviteId') function ($teamId, $inviteId) use ($response, $projectDB, $audit) { $membership = $projectDB->getDocument($inviteId); - if (empty($membership->getUid()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { + if (empty($membership->getId()) || Database::SYSTEM_COLLECTION_MEMBERSHIPS != $membership->getCollection()) { throw new Exception('Invite not found', 404); } @@ -562,11 +562,11 @@ $utopia->delete('/v1/teams/:teamId/memberships/:inviteId') $team = $projectDB->getDocument($teamId); - if (empty($team->getUid()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { + if (empty($team->getId()) || Database::SYSTEM_COLLECTION_TEAMS != $team->getCollection()) { throw new Exception('Team not found', 404); } - if (!$projectDB->deleteDocument($membership->getUid())) { + if (!$projectDB->deleteDocument($membership->getId())) { throw new Exception('Failed to remove membership from DB', 500); } diff --git a/app/controllers/api/users.php b/app/controllers/api/users.php index a4091019fa..7e857c9def 100644 --- a/app/controllers/api/users.php +++ b/app/controllers/api/users.php @@ -76,7 +76,7 @@ $utopia->post('/v1/users') $response ->setStatusCode(Response::STATUS_CODE_CREATED) ->json(array_merge($user->getArrayCopy(array_merge([ - '$uid', + '$id', 'status', 'email', 'registration', @@ -125,7 +125,7 @@ $utopia->get('/v1/users') $results = array_map(function ($value) use ($oauth2Keys) { /* @var $value \Database\Document */ return $value->getArrayCopy(array_merge( [ - '$uid', + '$id', 'status', 'email', 'registration', @@ -152,7 +152,7 @@ $utopia->get('/v1/users/:userId') function ($userId) use ($response, $projectDB, $providers) { $user = $projectDB->getDocument($userId); - if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + if (empty($user->getId()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { throw new Exception('User not found', 404); } @@ -169,7 +169,7 @@ $utopia->get('/v1/users/:userId') $response->json(array_merge($user->getArrayCopy(array_merge( [ - '$uid', + '$id', 'status', 'email', 'registration', @@ -193,7 +193,7 @@ $utopia->get('/v1/users/:userId/prefs') function ($userId) use ($response, $projectDB) { $user = $projectDB->getDocument($userId); - if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + if (empty($user->getId()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { throw new Exception('User not found', 404); } @@ -222,7 +222,7 @@ $utopia->get('/v1/users/:userId/sessions') function ($userId) use ($response, $projectDB) { $user = $projectDB->getDocument($userId); - if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + if (empty($user->getId()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { throw new Exception('User not found', 404); } @@ -247,7 +247,7 @@ $utopia->get('/v1/users/:userId/sessions') $dd->parse(); $sessions[$index] = [ - '$uid' => $token->getUid(), + '$id' => $token->getId(), 'OS' => $dd->getOs(), 'client' => $dd->getClient(), 'device' => $dd->getDevice(), @@ -285,18 +285,18 @@ $utopia->get('/v1/users/:userId/logs') function ($userId) use ($response, $register, $projectDB, $project) { $user = $projectDB->getDocument($userId); - if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + if (empty($user->getId()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { throw new Exception('User not found', 404); } $adapter = new AuditAdapter($register->get('db')); - $adapter->setNamespace('app_'.$project->getUid()); + $adapter->setNamespace('app_'.$project->getId()); $audit = new Audit($adapter); $countries = Locale::getText('countries'); - $logs = $audit->getLogsByUser($user->getUid()); + $logs = $audit->getLogsByUser($user->getId()); $reader = new Reader(__DIR__.'/../../db/DBIP/dbip-country-lite-2020-01.mmdb'); $output = []; @@ -350,7 +350,7 @@ $utopia->patch('/v1/users/:userId/status') function ($userId, $status) use ($response, $projectDB, $providers) { $user = $projectDB->getDocument($userId); - if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + if (empty($user->getId()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { throw new Exception('User not found', 404); } @@ -375,7 +375,7 @@ $utopia->patch('/v1/users/:userId/status') $response ->json(array_merge($user->getArrayCopy(array_merge([ - '$uid', + '$id', 'status', 'email', 'registration', @@ -398,7 +398,7 @@ $utopia->patch('/v1/users/:userId/prefs') function ($userId, $prefs) use ($response, $projectDB, $providers) { $user = $projectDB->getDocument($userId); - if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + if (empty($user->getId()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { throw new Exception('User not found', 404); } @@ -441,15 +441,15 @@ $utopia->delete('/v1/users/:userId/sessions/:session') function ($userId, $sessionId) use ($response, $request, $projectDB) { $user = $projectDB->getDocument($userId); - if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + if (empty($user->getId()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { throw new Exception('User not found', 404); } $tokens = $user->getAttribute('tokens', []); foreach ($tokens as $token) { /* @var $token Document */ - if ($sessionId == $token->getUid()) { - if (!$projectDB->deleteDocument($token->getUid())) { + if ($sessionId == $token->getId()) { + if (!$projectDB->deleteDocument($token->getId())) { throw new Exception('Failed to remove token from DB', 500); } } @@ -472,14 +472,14 @@ $utopia->delete('/v1/users/:userId/sessions') function ($userId) use ($response, $request, $projectDB) { $user = $projectDB->getDocument($userId); - if (empty($user->getUid()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { + if (empty($user->getId()) || Database::SYSTEM_COLLECTION_USERS != $user->getCollection()) { throw new Exception('User not found', 404); } $tokens = $user->getAttribute('tokens', []); foreach ($tokens as $token) { /* @var $token Document */ - if (!$projectDB->deleteDocument($token->getUid())) { + if (!$projectDB->deleteDocument($token->getId())) { throw new Exception('Failed to remove token from DB', 500); } } diff --git a/app/controllers/shared/api.php b/app/controllers/shared/api.php index 39f776e6c6..0430212be7 100644 --- a/app/controllers/shared/api.php +++ b/app/controllers/shared/api.php @@ -16,9 +16,9 @@ $utopia->init(function () use ($utopia, $request, $response, $register, $user, $ $timeLimit = new TimeLimit($route->getLabel('abuse-key', 'url:{url},ip:{ip}'), $route->getLabel('abuse-limit', 0), $route->getLabel('abuse-time', 3600), function () use ($register) { return $register->get('db'); }); - $timeLimit->setNamespace('app_'.$project->getUid()); + $timeLimit->setNamespace('app_'.$project->getId()); $timeLimit - ->setParam('{userId}', $user->getUid()) + ->setParam('{userId}', $user->getId()) ->setParam('{userAgent}', $request->getServer('HTTP_USER_AGENT', '')) ->setParam('{ip}', $request->getIP()) ->setParam('{url}', $request->getServer('HTTP_HOST', '').$route->getURL()) diff --git a/app/controllers/web/console.php b/app/controllers/web/console.php index dae9737e49..39ccaa930b 100644 --- a/app/controllers/web/console.php +++ b/app/controllers/web/console.php @@ -183,7 +183,7 @@ $utopia->get('/console/database/collection') ->action(function ($id) use ($layout, $projectDB) { $collection = $projectDB->getDocument($id, false); - if (empty($collection->getUid()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { + if (empty($collection->getId()) || Database::SYSTEM_COLLECTION_COLLECTIONS != $collection->getCollection()) { throw new Exception('Collection not found', 404); } diff --git a/app/init.php b/app/init.php index 42e0d0372e..6a6b830321 100644 --- a/app/init.php +++ b/app/init.php @@ -220,10 +220,10 @@ $console = $consoleDB->getDocument('console'); $mode = $request->getParam('mode', $request->getHeader('X-Appwrite-Mode', 'default')); -Auth::setCookieName('a_session_'.$project->getUid()); +Auth::setCookieName('a_session_'.$project->getId()); if (APP_MODE_ADMIN === $mode) { - Auth::setCookieName('a_session_'.$console->getUid()); + Auth::setCookieName('a_session_'.$console->getId()); } $session = Auth::decodeSession( @@ -235,7 +235,7 @@ Auth::$secret = $session['secret']; $projectDB = new Database(); $projectDB->setAdapter(new RedisAdapter(new MySQLAdapter($register), $register)); -$projectDB->setNamespace('app_'.$project->getUid()); +$projectDB->setNamespace('app_'.$project->getId()); $projectDB->setMocks($collections); $user = $projectDB->getDocument(Auth::$unique); @@ -244,21 +244,21 @@ if (APP_MODE_ADMIN === $mode) { $user = $consoleDB->getDocument(Auth::$unique); $user - ->setAttribute('$uid', 'admin-'.$user->getAttribute('$uid')) + ->setAttribute('$id', 'admin-'.$user->getAttribute('$id')) ; } -if (empty($user->getUid()) // Check a document has been found in the DB +if (empty($user->getId()) // Check a document has been found in the DB || Database::SYSTEM_COLLECTION_USERS !== $user->getCollection() // Validate returned document is really a user document || !Auth::tokenVerify($user->getAttribute('tokens', []), Auth::TOKEN_TYPE_LOGIN, Auth::$secret)) { // Validate user has valid login token - $user = new Document(['$uid' => '', '$collection' => Database::SYSTEM_COLLECTION_USERS]); + $user = new Document(['$id' => '', '$collection' => Database::SYSTEM_COLLECTION_USERS]); } if (APP_MODE_ADMIN === $mode) { if (!empty($user->search('teamId', $project->getAttribute('teamId'), $user->getAttribute('memberships')))) { Authorization::disable(); } else { - $user = new Document(['$uid' => '', '$collection' => Database::SYSTEM_COLLECTION_USERS]); + $user = new Document(['$id' => '', '$collection' => Database::SYSTEM_COLLECTION_USERS]); } } @@ -266,7 +266,7 @@ if (APP_MODE_ADMIN === $mode) { $register->get('smtp') ->setFrom( $request->getServer('_APP_SYSTEM_EMAIL_ADDRESS', APP_EMAIL_TEAM), - ($project->getUid() === 'console') + ($project->getId() === 'console') ? urldecode($request->getServer('_APP_SYSTEM_EMAIL_NAME', APP_NAME.' Server')) : sprintf(Locale::getText('account.emails.team'), $project->getAttribute('name') ) diff --git a/app/tasks/logs.txt b/app/tasks/logs.txt new file mode 100644 index 0000000000..bcf6126145 --- /dev/null +++ b/app/tasks/logs.txt @@ -0,0 +1,1201 @@ +NAME:Appwrite/$ID:console/$UID: +NAME:Demo 2/$ID:/$UID:5e387c7e2a4fd +NAME:Demo 2/$ID:5e49371cb959a/$UID: +NAME:Demo 2/$ID:5e49371cf0f49/$UID: +NAME:Demo 2/$ID:5e493779e61d9/$UID: +NAME:Demo 2/$ID:5e493a36355c2/$UID: +NAME:Demo 2/$ID:5e493ea881e80/$UID: +NAME:Demo 2/$ID:5e4941e822124/$UID: +NAME:Demo Project/$ID:/$UID:5e3eba9170beb +NAME:Demo Project/$ID:/$UID:5e3eba9e6ed16 +NAME:Demo Project/$ID:/$UID:5e3ebaa3520f2 +NAME:Demo Project/$ID:/$UID:5e3ebaa490e8a +NAME:Demo Project/$ID:/$UID:5e3ebaa5cf2e7 +NAME:Demo Project/$ID:/$UID:5e3ebaa731f3f +NAME:Demo Project/$ID:/$UID:5e3ebaa984098 +NAME:Demo Project/$ID:/$UID:5e3ebaaa4ae91 +NAME:Demo Project/$ID:/$UID:5e3ebaac57ea1 +NAME:Demo Project/$ID:/$UID:5e3ebaaee510b +NAME:Demo Project/$ID:/$UID:5e3ebab34e6d0 +NAME:Demo Project/$ID:/$UID:5e3ebab4e8e89 +NAME:Demo Project/$ID:/$UID:5e3ebabb10066 +NAME:Demo Project/$ID:/$UID:5e3ebac0564e8 +NAME:Demo Project/$ID:/$UID:5e3ebac12ed4c +NAME:Demo Project/$ID:/$UID:5e3ebb25621ef +NAME:Demo Project/$ID:/$UID:5e3ebb3661bea +NAME:Demo Project/$ID:/$UID:5e3ebb37cb316 +NAME:Demo Project/$ID:/$UID:5e3ebb3940b7a +NAME:Demo Project/$ID:/$UID:5e3ebb3aa43a0 +NAME:Demo Project/$ID:/$UID:5e3ebb3c411b9 +NAME:Demo Project/$ID:/$UID:5e3ebb3deee85 +NAME:Demo Project/$ID:/$UID:5e3ebb3ee412b +NAME:Demo Project/$ID:/$UID:5e3ebb41aa695 +NAME:Demo Project/$ID:/$UID:5e3ebb448215b +NAME:Demo Project/$ID:/$UID:5e3ebb47759e8 +NAME:Demo Project/$ID:/$UID:5e3ebb487febd +NAME:Demo Project/$ID:/$UID:5e3ebb4e33402 +NAME:Demo Project/$ID:/$UID:5e3ebb535e16d +NAME:Demo Project/$ID:/$UID:5e3ebb542f920 +NAME:Demo Project/$ID:/$UID:5e40380386eb1 +NAME:Demo Project/$ID:/$UID:5e40381416ab9 +NAME:Demo Project/$ID:/$UID:5e403815ea3ca +NAME:Demo Project/$ID:/$UID:5e4038175ef51 +NAME:Demo Project/$ID:/$UID:5e403818a33a0 +NAME:Demo Project/$ID:/$UID:5e40381a52346 +NAME:Demo Project/$ID:/$UID:5e40381c50750 +NAME:Demo Project/$ID:/$UID:5e40381d34f78 +NAME:Demo Project/$ID:/$UID:5e40381f6a5ca +NAME:Demo Project/$ID:/$UID:5e403821bdd7a +NAME:Demo Project/$ID:/$UID:5e403824bd44a +NAME:Demo Project/$ID:/$UID:5e4038263eab4 +NAME:Demo Project/$ID:/$UID:5e40382bf1976 +NAME:Demo Project/$ID:/$UID:5e403830de987 +NAME:Demo Project/$ID:/$UID:5e403831a87a1 +NAME:Demo Project/$ID:/$UID:5e4076f2a6f96 +NAME:Demo Project/$ID:/$UID:5e407703b6814 +NAME:Demo Project/$ID:/$UID:5e40770597b34 +NAME:Demo Project/$ID:/$UID:5e4077071e264 +NAME:Demo Project/$ID:/$UID:5e40770846207 +NAME:Demo Project/$ID:/$UID:5e407709c8eee +NAME:Demo Project/$ID:/$UID:5e40770ba774f +NAME:Demo Project/$ID:/$UID:5e40770cab4b0 +NAME:Demo Project/$ID:/$UID:5e40770ed2d37 +NAME:Demo Project/$ID:/$UID:5e407711108c9 +NAME:Demo Project/$ID:/$UID:5e40771474ad5 +NAME:Demo Project/$ID:/$UID:5e4077162bf8a +NAME:Demo Project/$ID:/$UID:5e4077184510d +NAME:Demo Project/$ID:/$UID:5e40771a03204 +NAME:Demo Project/$ID:/$UID:5e40771ab8321 +NAME:Demo Project/$ID:/$UID:5e4079539e483 +NAME:Demo Project/$ID:/$UID:5e407963d42ff +NAME:Demo Project/$ID:/$UID:5e4079651ba73 +NAME:Demo Project/$ID:/$UID:5e407966764ae +NAME:Demo Project/$ID:/$UID:5e4079679b408 +NAME:Demo Project/$ID:/$UID:5e407968e95f6 +NAME:Demo Project/$ID:/$UID:5e40796ade468 +NAME:Demo Project/$ID:/$UID:5e40796ba8a3b +NAME:Demo Project/$ID:/$UID:5e40796de5301 +NAME:Demo Project/$ID:/$UID:5e4079701e8d7 +NAME:Demo Project/$ID:/$UID:5e407972f2134 +NAME:Demo Project/$ID:/$UID:5e40797404db8 +NAME:Demo Project/$ID:/$UID:5e4079762ad5f +NAME:Demo Project/$ID:/$UID:5e407977ee308 +NAME:Demo Project/$ID:/$UID:5e40797913b50 +NAME:Demo Project/$ID:/$UID:5e4079e5c92b4 +NAME:Demo Project/$ID:/$UID:5e4079f5b96a5 +NAME:Demo Project/$ID:/$UID:5e4079f6dfcfa +NAME:Demo Project/$ID:/$UID:5e4079f838147 +NAME:Demo Project/$ID:/$UID:5e4079f95d92e +NAME:Demo Project/$ID:/$UID:5e4079fad8061 +NAME:Demo Project/$ID:/$UID:5e4079fd1f70b +NAME:Demo Project/$ID:/$UID:5e4079fe56b87 +NAME:Demo Project/$ID:/$UID:5e407a01332a2 +NAME:Demo Project/$ID:/$UID:5e407a0363f03 +NAME:Demo Project/$ID:/$UID:5e407a067305f +NAME:Demo Project/$ID:/$UID:5e407a07a01c3 +NAME:Demo Project/$ID:/$UID:5e407a0d5924d +NAME:Demo Project/$ID:/$UID:5e407a1262a31 +NAME:Demo Project/$ID:/$UID:5e407a132b60d +NAME:Demo Project/$ID:/$UID:5e41022b77ac8 +NAME:Demo Project/$ID:/$UID:5e41023bcf05d +NAME:Demo Project/$ID:/$UID:5e41023d1ab4c +NAME:Demo Project/$ID:/$UID:5e41023e71c8b +NAME:Demo Project/$ID:/$UID:5e41023fb0fe9 +NAME:Demo Project/$ID:/$UID:5e410241541b9 +NAME:Demo Project/$ID:/$UID:5e4102438bf72 +NAME:Demo Project/$ID:/$UID:5e410244749f0 +NAME:Demo Project/$ID:/$UID:5e4102464ca0f +NAME:Demo Project/$ID:/$UID:5e410248853cc +NAME:Demo Project/$ID:/$UID:5e41024b38f50 +NAME:Demo Project/$ID:/$UID:5e41024c538e5 +NAME:Demo Project/$ID:/$UID:5e41025213ef3 +NAME:Demo Project/$ID:/$UID:5e410256f2861 +NAME:Demo Project/$ID:/$UID:5e410257b8e8b +NAME:Demo Project/$ID:/$UID:5e4103125caca +NAME:Demo Project/$ID:/$UID:5e41032281b24 +NAME:Demo Project/$ID:/$UID:5e410323a4ab8 +NAME:Demo Project/$ID:/$UID:5e410324d3acd +NAME:Demo Project/$ID:/$UID:5e4103261cc0b +NAME:Demo Project/$ID:/$UID:5e41032772d24 +NAME:Demo Project/$ID:/$UID:5e41032997028 +NAME:Demo Project/$ID:/$UID:5e41032a790a7 +NAME:Demo Project/$ID:/$UID:5e41032d378ac +NAME:Demo Project/$ID:/$UID:5e41032fdab9f +NAME:Demo Project/$ID:/$UID:5e410332de321 +NAME:Demo Project/$ID:/$UID:5e4103343d7ea +NAME:Demo Project/$ID:/$UID:5e410339cd25c +NAME:Demo Project/$ID:/$UID:5e41033f06545 +NAME:Demo Project/$ID:/$UID:5e41033fc83c7 +NAME:Demo Project/$ID:/$UID:5e4103df34627 +NAME:Demo Project/$ID:/$UID:5e4103ef77ce8 +NAME:Demo Project/$ID:/$UID:5e410421b47bb +NAME:Demo Project/$ID:/$UID:5e410432202a9 +NAME:Demo Project/$ID:/$UID:5e41046baff24 +NAME:Demo Project/$ID:/$UID:5e4104787855c +NAME:Demo Project/$ID:/$UID:5e410482e19d3 +NAME:Demo Project/$ID:/$UID:5e41048f7d99c +NAME:Demo Project/$ID:/$UID:5e4104cb14955 +NAME:Demo Project/$ID:/$UID:5e4104db36f9e +NAME:Demo Project/$ID:/$UID:5e41052a5f2da +NAME:Demo Project/$ID:/$UID:5e410539e5aa1 +NAME:Demo Project/$ID:/$UID:5e41056ccdf40 +NAME:Demo Project/$ID:/$UID:5e41057c504ba +NAME:Demo Project/$ID:/$UID:5e4105a1c45a5 +NAME:Demo Project/$ID:/$UID:5e4105b1c60c2 +NAME:Demo Project/$ID:/$UID:5e4105eeb1acd +NAME:Demo Project/$ID:/$UID:5e4105fe6dbd2 +NAME:Demo Project/$ID:/$UID:5e410654412f6 +NAME:Demo Project/$ID:/$UID:5e410664057e9 +NAME:Demo Project/$ID:/$UID:5e4106c3b7111 +NAME:Demo Project/$ID:/$UID:5e4106d34bd5b +NAME:Demo Project/$ID:/$UID:5e4107118ec93 +NAME:Demo Project/$ID:/$UID:5e4107254a0a1 +NAME:Demo Project/$ID:/$UID:5e41cbef4a01a +NAME:Demo Project/$ID:/$UID:5e41cc0899ca7 +NAME:Demo Project/$ID:/$UID:5e41cc0c72a0f +NAME:Demo Project/$ID:/$UID:5e41cc0dae188 +NAME:Demo Project/$ID:/$UID:5e41cc0f23ec0 +NAME:Demo Project/$ID:/$UID:5e41cc107d460 +NAME:Demo Project/$ID:/$UID:5e41cc1291e08 +NAME:Demo Project/$ID:/$UID:5e41cc1377df2 +NAME:Demo Project/$ID:/$UID:5e41cc15ed2b9 +NAME:Demo Project/$ID:/$UID:5e41cc188051d +NAME:Demo Project/$ID:/$UID:5e41cc1d6285d +NAME:Demo Project/$ID:/$UID:5e41cc1f04a05 +NAME:Demo Project/$ID:/$UID:5e41cc249a658 +NAME:Demo Project/$ID:/$UID:5e41cc29c1350 +NAME:Demo Project/$ID:/$UID:5e41cc2a503bc +NAME:Demo Project/$ID:/$UID:5e41cc974a7ae +NAME:Demo Project/$ID:/$UID:5e41ccafdc2e8 +NAME:Demo Project/$ID:/$UID:5e41ccb135981 +NAME:Demo Project/$ID:/$UID:5e41ccb2819d4 +NAME:Demo Project/$ID:/$UID:5e41ccb3b6ecf +NAME:Demo Project/$ID:/$UID:5e41ccb55523d +NAME:Demo Project/$ID:/$UID:5e41ccb730538 +NAME:Demo Project/$ID:/$UID:5e41ccb850013 +NAME:Demo Project/$ID:/$UID:5e41ccba767f1 +NAME:Demo Project/$ID:/$UID:5e41ccbd1ff22 +NAME:Demo Project/$ID:/$UID:5e41ccc011b27 +NAME:Demo Project/$ID:/$UID:5e41ccc159698 +NAME:Demo Project/$ID:/$UID:5e41ccc712586 +NAME:Demo Project/$ID:/$UID:5e41cccc2431d +NAME:Demo Project/$ID:/$UID:5e41ccccb7b74 +NAME:Demo Project/$ID:/$UID:5e42447ecd98f +NAME:Demo Project/$ID:/$UID:5e424497b79d9 +NAME:Demo Project/$ID:/$UID:5e4244994e19e +NAME:Demo Project/$ID:/$UID:5e42449ae3489 +NAME:Demo Project/$ID:/$UID:5e42449c36bc6 +NAME:Demo Project/$ID:/$UID:5e42449dd6b5d +NAME:Demo Project/$ID:/$UID:5e42449fe1f43 +NAME:Demo Project/$ID:/$UID:5e4244a118be2 +NAME:Demo Project/$ID:/$UID:5e4244a3dcd3f +NAME:Demo Project/$ID:/$UID:5e4244a6d2b6c +NAME:Demo Project/$ID:/$UID:5e4244aa0756e +NAME:Demo Project/$ID:/$UID:5e4244ab84a0f +NAME:Demo Project/$ID:/$UID:5e4244b19f5e8 +NAME:Demo Project/$ID:/$UID:5e4244b6dfe0d +NAME:Demo Project/$ID:/$UID:5e4244b7862a6 +NAME:Demo Project/$ID:/$UID:5e42464fa9453 +NAME:Demo Project/$ID:/$UID:5e424655234c3 +NAME:Demo Project/$ID:/$UID:5e42469d90ea5 +NAME:Demo Project/$ID:/$UID:5e4246a2e524c +NAME:Demo Project/$ID:/$UID:5e431b4d9b8d4 +NAME:Demo Project/$ID:/$UID:5e431b6692fb0 +NAME:Demo Project/$ID:/$UID:5e431bd290602 +NAME:Demo Project/$ID:/$UID:5e431bec24ba1 +NAME:Demo Project/$ID:/$UID:5e431c0aa157d +NAME:Demo Project/$ID:/$UID:5e431c23c2a55 +NAME:Demo Project/$ID:/$UID:5e431c68dec08 +NAME:Demo Project/$ID:/$UID:5e431c7e7412f +NAME:Demo Project/$ID:/$UID:5e431caa2f9fd +NAME:Demo Project/$ID:/$UID:5e431cbf6d89e +NAME:Demo Project/$ID:/$UID:5e4321494e1e4 +NAME:Demo Project/$ID:/$UID:5e43215ed26b5 +NAME:Demo Project/$ID:/$UID:5e4322f77745c +NAME:Demo Project/$ID:/$UID:5e4323108ee70 +NAME:Demo Project/$ID:/$UID:5e4324200572f +NAME:Demo Project/$ID:/$UID:5e432439c73a4 +NAME:Demo Project/$ID:/$UID:5e4324f2086bd +NAME:Demo Project/$ID:/$UID:5e43250b2eb81 +NAME:Demo Project/$ID:/$UID:5e43256d420b6 +NAME:Demo Project/$ID:/$UID:5e432586f30a5 +NAME:Demo Project/$ID:/$UID:5e4325b1843dd +NAME:Demo Project/$ID:/$UID:5e4325bccd1b5 +NAME:Demo Project/$ID:/$UID:5e4325cb44a56 +NAME:Demo Project/$ID:/$UID:5e4325d7889be +NAME:Demo Project/$ID:/$UID:5e4326986f103 +NAME:Demo Project/$ID:/$UID:5e4326b17aac0 +NAME:Demo Project/$ID:/$UID:5e4329233ab8f +NAME:Demo Project/$ID:/$UID:5e43293c4d152 +NAME:Demo Project/$ID:/$UID:5e432989005b5 +NAME:Demo Project/$ID:/$UID:5e4329a2ace4e +NAME:Demo Project/$ID:/$UID:5e4452f777b4b +NAME:Demo Project/$ID:/$UID:5e445310d48ea +NAME:Demo Project/$ID:/$UID:5e48ead447092 +NAME:Demo Project/$ID:/$UID:5e48eaeeb0972 +NAME:Demo Project/$ID:/$UID:5e48eaf224619 +NAME:Demo Project/$ID:/$UID:5e48eaf3e80d7 +NAME:Demo Project/$ID:/$UID:5e48eaf5d7a6d +NAME:Demo Project/$ID:/$UID:5e48eaf8505c6 +NAME:Demo Project/$ID:/$UID:5e48eafaeb508 +NAME:Demo Project/$ID:/$UID:5e48eafc32df2 +NAME:Demo Project/$ID:/$UID:5e48eafe94bd8 +NAME:Demo Project/$ID:/$UID:5e48eb01b14ab +NAME:Demo Project/$ID:/$UID:5e48eb076c414 +NAME:Demo Project/$ID:/$UID:5e48eb08c3a4c +NAME:Demo Project/$ID:/$UID:5e48eb0f861bb +NAME:Demo Project/$ID:/$UID:5e48eb14b23fd +NAME:Demo Project/$ID:/$UID:5e48eb15c3638 +NAME:Demo Project/$ID:/$UID:5e4926b3eb301 +NAME:Demo Project/$ID:/$UID:5e4926cd71277 +NAME:Demo Project/$ID:/$UID:5e4926cf6824b +NAME:Demo Project/$ID:/$UID:5e4926d0d30f3 +NAME:Demo Project/$ID:/$UID:5e4926d266e05 +NAME:Demo Project/$ID:/$UID:5e4926d40ef61 +NAME:Demo Project/$ID:/$UID:5e4926d66d70f +NAME:Demo Project/$ID:/$UID:5e4926d794da6 +NAME:Demo Project/$ID:/$UID:5e4926da04a26 +NAME:Demo Project/$ID:/$UID:5e4926dc6ea20 +NAME:Demo Project/$ID:/$UID:5e4926dfc6e7d +NAME:Demo Project/$ID:/$UID:5e4926e178e9f +NAME:Demo Project/$ID:/$UID:5e4926e858be0 +NAME:Demo Project/$ID:/$UID:5e4926ed83d1e +NAME:Demo Project/$ID:/$UID:5e4926ee6299d +NAME:Demo Project/$ID:5e493a36f0708/$UID: +NAME:Demo Project/$ID:5e493a370d332/$UID: +NAME:Demo Project/$ID:5e493a371bdd6/$UID: +NAME:Demo Project/$ID:5e493a3729a3d/$UID: +NAME:Demo Project/$ID:5e493a37398cf/$UID: +NAME:Demo Project/$ID:5e493a3748487/$UID: +NAME:Demo Project/$ID:5e493a37593c5/$UID: +NAME:Demo Project/$ID:5e493a3769393/$UID: +NAME:Demo Project/$ID:5e493a3776c5f/$UID: +NAME:Demo Project/$ID:5e493a3786b07/$UID: +NAME:Demo Project/$ID:5e493a379481f/$UID: +NAME:Demo Project/$ID:5e493a37a30b8/$UID: +NAME:Demo Project/$ID:5e493a37b13f6/$UID: +NAME:Demo Project/$ID:5e493a37bf24e/$UID: +NAME:Demo Project/$ID:5e493a37cdf18/$UID: +NAME:Demo Project/$ID:5e493a37de1ba/$UID: +NAME:Demo Project/$ID:5e493a37ecd13/$UID: +NAME:Demo Project/$ID:5e493a38079cb/$UID: +NAME:Demo Project/$ID:5e493a3815295/$UID: +NAME:Demo Project/$ID:5e493a3823ab1/$UID: +NAME:Demo Project/$ID:5e493a3833932/$UID: +NAME:Demo Project/$ID:5e493a3841db1/$UID: +NAME:Demo Project/$ID:5e493a3850577/$UID: +NAME:Demo Project/$ID:5e493a385f49f/$UID: +NAME:Demo Project/$ID:5e493a386db9f/$UID: +NAME:Demo Project/$ID:5e493a387bfcc/$UID: +NAME:Demo Project/$ID:5e493a388a227/$UID: +NAME:Demo Project/$ID:5e493a38987f0/$UID: +NAME:Demo Project/$ID:5e493a38a698e/$UID: +NAME:Demo Project/$ID:5e493a38e22e1/$UID: +NAME:Demo Project/$ID:5e493a3900312/$UID: +NAME:Demo Project/$ID:5e493a39117c2/$UID: +NAME:Demo Project/$ID:5e493a3922467/$UID: +NAME:Demo Project/$ID:5e493a39321f4/$UID: +NAME:Demo Project/$ID:5e493a39414ec/$UID: +NAME:Demo Project/$ID:5e493a395026e/$UID: +NAME:Demo Project/$ID:5e493a39607c6/$UID: +NAME:Demo Project/$ID:5e493a396f306/$UID: +NAME:Demo Project/$ID:5e493a398077b/$UID: +NAME:Demo Project/$ID:5e493a3992f02/$UID: +NAME:Demo Project/$ID:5e493a39a1c65/$UID: +NAME:Demo Project/$ID:5e493a39afa04/$UID: +NAME:Demo Project/$ID:5e493a39bebaf/$UID: +NAME:Demo Project/$ID:5e493a39cd0d7/$UID: +NAME:Demo Project/$ID:5e493a39dd91e/$UID: +NAME:Demo Project/$ID:5e493a39f3e60/$UID: +NAME:Demo Project/$ID:5e493a3a11706/$UID: +NAME:Demo Project/$ID:5e493a3a21155/$UID: +NAME:Demo Project/$ID:5e493a3a2f514/$UID: +NAME:Demo Project/$ID:5e493a3a3d734/$UID: +NAME:Demo Project/$ID:5e493a3a4ced9/$UID: +NAME:Demo Project/$ID:5e493a3a5b6a3/$UID: +NAME:Demo Project/$ID:5e493a3a6a906/$UID: +NAME:Demo Project/$ID:5e493a3a78c50/$UID: +NAME:Demo Project/$ID:5e493a3a86824/$UID: +NAME:Demo Project/$ID:5e493a3a947e1/$UID: +NAME:Demo Project/$ID:5e493a3aa4aa6/$UID: +NAME:Demo Project/$ID:5e493a3ab4de9/$UID: +NAME:Demo Project/$ID:5e493a3ac53d6/$UID: +NAME:Demo Project/$ID:5e493a3b0d8a7/$UID: +NAME:Demo Project/$ID:5e493a3b1c21a/$UID: +NAME:Demo Project/$ID:5e493a3b2a896/$UID: +NAME:Demo Project/$ID:5e493a3b3892b/$UID: +NAME:Demo Project/$ID:5e493a3b47fd8/$UID: +NAME:Demo Project/$ID:5e493a3b56d5b/$UID: +NAME:Demo Project/$ID:5e493a3b68979/$UID: +NAME:Demo Project/$ID:5e493a3b7818a/$UID: +NAME:Demo Project/$ID:5e493a3b881ed/$UID: +NAME:Demo Project/$ID:5e493a3b98f07/$UID: +NAME:Demo Project/$ID:5e493a3ba7ac9/$UID: +NAME:Demo Project/$ID:5e493a3bb643e/$UID: +NAME:Demo Project/$ID:5e493a3be1747/$UID: +NAME:Demo Project/$ID:5e493a3c098b8/$UID: +NAME:Demo Project/$ID:5e493a3c188a1/$UID: +NAME:Demo Project/$ID:5e493a3c27829/$UID: +NAME:Demo Project/$ID:5e493a3c36714/$UID: +NAME:Demo Project/$ID:5e493a3c453b8/$UID: +NAME:Demo Project/$ID:5e493a3c549a7/$UID: +NAME:Demo Project/$ID:5e493a3c64e2d/$UID: +NAME:Demo Project/$ID:5e493a3c736f9/$UID: +NAME:Demo Project/$ID:5e493a3c81915/$UID: +NAME:Demo Project/$ID:5e493a3c8fdb5/$UID: +NAME:Demo Project/$ID:5e493a3c9f46b/$UID: +NAME:Demo Project/$ID:5e493a3cae4c2/$UID: +NAME:Demo Project/$ID:5e493a3cbd367/$UID: +NAME:Demo Project/$ID:5e493a3ccbbf8/$UID: +NAME:Demo Project/$ID:5e493a3cdb584/$UID: +NAME:Demo Project/$ID:5e493a3ce9f25/$UID: +NAME:Demo Project/$ID:5e493a3d05238/$UID: +NAME:Demo Project/$ID:5e493a3d3e6cf/$UID: +NAME:Demo Project/$ID:5e493a3d4de6a/$UID: +NAME:Demo Project/$ID:5e493a3d5e78a/$UID: +NAME:Demo Project/$ID:5e493a3d6dd0a/$UID: +NAME:Demo Project/$ID:5e493a3d7cdf8/$UID: +NAME:Demo Project/$ID:5e493a3d8ad10/$UID: +NAME:Demo Project/$ID:5e493a3d99fcc/$UID: +NAME:Demo Project/$ID:5e493a3da865a/$UID: +NAME:Demo Project/$ID:5e493a3db69b6/$UID: +NAME:Demo Project/$ID:5e493a3dc49fc/$UID: +NAME:Demo Project/$ID:5e493a3dd2a76/$UID: +NAME:Demo Project/$ID:5e493a3de283e/$UID: +NAME:Demo Project/$ID:5e493a3df0ec1/$UID: +NAME:Demo Project/$ID:5e493a3e186f1/$UID: +NAME:Demo Project/$ID:5e493a3e27119/$UID: +NAME:Demo Project/$ID:5e493a3e35a77/$UID: +NAME:Demo Project/$ID:5e493a3e43ce5/$UID: +NAME:Demo Project/$ID:5e493a3e52d9a/$UID: +NAME:Demo Project/$ID:5e493a3e61af8/$UID: +NAME:Demo Project/$ID:5e493a3e6fb14/$UID: +NAME:Demo Project/$ID:5e493a3e7debc/$UID: +NAME:Demo Project/$ID:5e493a3e8be17/$UID: +NAME:Demo Project/$ID:5e493a3e9b2bd/$UID: +NAME:Demo Project/$ID:5e493a3ea9888/$UID: +NAME:Demo Project/$ID:5e493a3eb829e/$UID: +NAME:Demo Project/$ID:5e493a3ec6976/$UID: +NAME:Demo Project/$ID:5e493a3ed5bc0/$UID: +NAME:Demo Project/$ID:5e493a3ee4f9a/$UID: +NAME:Demo Project/$ID:5e493a3ef36f0/$UID: +NAME:Demo Project/$ID:5e493a3f0e12a/$UID: +NAME:Demo Project/$ID:5e493a3f49ed2/$UID: +NAME:Demo Project/$ID:5e493a3f59977/$UID: +NAME:Demo Project/$ID:5e493a3f6a0c9/$UID: +NAME:Demo Project/$ID:5e493a3f78c43/$UID: +NAME:Demo Project/$ID:5e493a3f879ce/$UID: +NAME:Demo Project/$ID:5e493a3f9652e/$UID: +NAME:Demo Project/$ID:5e493a3fa6687/$UID: +NAME:Demo Project/$ID:5e493a3fb524b/$UID: +NAME:Demo Project/$ID:5e493a3fc52e3/$UID: +NAME:Demo Project/$ID:5e493a3fd50a4/$UID: +NAME:Demo Project/$ID:5e493a3fe5732/$UID: +NAME:Demo Project/$ID:5e493a40004e9/$UID: +NAME:Demo Project/$ID:5e493a4010272/$UID: +NAME:Demo Project/$ID:5e493a401fc93/$UID: +NAME:Demo Project/$ID:5e493a402f0a6/$UID: +NAME:Demo Project/$ID:5e493a403e37a/$UID: +NAME:Demo Project/$ID:5e493a404e089/$UID: +NAME:Demo Project/$ID:5e493a405cc19/$UID: +NAME:Demo Project/$ID:5e493a406c6b5/$UID: +NAME:Demo Project/$ID:5e493a407a9ed/$UID: +NAME:Demo Project/$ID:5e493a4089c9d/$UID: +NAME:Demo Project/$ID:5e493a409a768/$UID: +NAME:Demo Project/$ID:5e493a40a8a44/$UID: +NAME:Demo Project/$ID:5e493a40b6090/$UID: +NAME:Demo Project/$ID:5e493a40c3df2/$UID: +NAME:Demo Project/$ID:5e493a40d1399/$UID: +NAME:Demo Project/$ID:5e493a40e0396/$UID: +NAME:Demo Project/$ID:5e493a40ed8ac/$UID: +NAME:Demo Project/$ID:5e493a410747e/$UID: +NAME:Demo Project/$ID:5e493a41152a7/$UID: +NAME:Demo Project/$ID:5e493a414f6d4/$UID: +NAME:Demo Project/$ID:5e493a416071d/$UID: +NAME:Demo Project/$ID:5e493a4170be3/$UID: +NAME:Demo Project/$ID:5e493a41804a0/$UID: +NAME:Demo Project/$ID:5e493a418edfb/$UID: +NAME:Demo Project/$ID:5e493a419f882/$UID: +NAME:Demo Project/$ID:5e493a41ae1f9/$UID: +NAME:Demo Project/$ID:5e493a41bcf98/$UID: +NAME:Demo Project/$ID:5e493a41cc358/$UID: +NAME:Demo Project/$ID:5e493a41db553/$UID: +NAME:Demo Project/$ID:5e493a41eae1e/$UID: +NAME:Demo Project/$ID:5e493a4205cc8/$UID: +NAME:Demo Project/$ID:5e493a4214a16/$UID: +NAME:Demo Project/$ID:5e493a4223c7a/$UID: +NAME:Demo Project/$ID:5e493a42324d3/$UID: +NAME:Demo Project/$ID:5e493a42417c0/$UID: +NAME:Demo Project/$ID:5e493a4250926/$UID: +NAME:Demo Project/$ID:5e493a425fd21/$UID: +NAME:Demo Project/$ID:5e493a426edf8/$UID: +NAME:Demo Project/$ID:5e493a427d576/$UID: +NAME:Demo Project/$ID:5e493a428b179/$UID: +NAME:Demo Project/$ID:5e493a42992da/$UID: +NAME:Demo Project/$ID:5e493a42a7d76/$UID: +NAME:Demo Project/$ID:5e493a42b5d96/$UID: +NAME:Demo Project/$ID:5e493a42c3f22/$UID: +NAME:Demo Project/$ID:5e493a42d2134/$UID: +NAME:Demo Project/$ID:5e493a42e1c09/$UID: +NAME:Demo Project/$ID:5e493a42ef51e/$UID: +NAME:Demo Project/$ID:5e493a4308cff/$UID: +NAME:Demo Project/$ID:5e493a4317dfd/$UID: +NAME:Demo Project/$ID:5e493a43523d8/$UID: +NAME:Demo Project/$ID:5e493a436064c/$UID: +NAME:Demo Project/$ID:5e493a436d2d7/$UID: +NAME:Demo Project/$ID:5e493a437ae00/$UID: +NAME:Demo Project/$ID:5e493a4390056/$UID: +NAME:Demo Project/$ID:5e493a439fb35/$UID: +NAME:Demo Project/$ID:5e493a43ae8a0/$UID: +NAME:Demo Project/$ID:5e493a43bd318/$UID: +NAME:Demo Project/$ID:5e493a43cb867/$UID: +NAME:Demo Project/$ID:5e493a43dbe0a/$UID: +NAME:Demo Project/$ID:5e493a43ea84a/$UID: +NAME:Demo Project/$ID:5e493a4405002/$UID: +NAME:Demo Project/$ID:5e493a44173c3/$UID: +NAME:Demo Project/$ID:5e493a443e468/$UID: +NAME:Demo Project/$ID:5e493a444e9c7/$UID: +NAME:Demo Project/$ID:5e493a4460a74/$UID: +NAME:Demo Project/$ID:5e493a4471065/$UID: +NAME:Demo Project/$ID:5e493a4480e98/$UID: +NAME:Demo Project/$ID:5e493a44911b4/$UID: +NAME:Demo Project/$ID:5e493a44a1ae6/$UID: +NAME:Demo Project/$ID:5e493a44b011b/$UID: +NAME:Demo Project/$ID:5e493a44bf890/$UID: +NAME:Demo Project/$ID:5e493a44ce3e3/$UID: +NAME:Demo Project/$ID:5e493a44de65d/$UID: +NAME:Demo Project/$ID:5e493a44ebfb0/$UID: +NAME:Demo Project/$ID:5e493a4505a38/$UID: +NAME:Demo Project/$ID:5e493a45120cd/$UID: +NAME:Demo Project/$ID:5e493a4524b86/$UID: +NAME:Demo Project/$ID:5e493a4532919/$UID: +NAME:Demo Project/$ID:5e493a453a6cb/$UID: +NAME:Demo Project/$ID:5e493a457b85a/$UID: +NAME:Demo Project/$ID:5e493a458b26d/$UID: +NAME:Demo Project/$ID:5e493a459840a/$UID: +NAME:Demo Project/$ID:5e493a45a6090/$UID: +NAME:Demo Project/$ID:5e493a45b36ed/$UID: +NAME:Demo Project/$ID:5e493a45c18e7/$UID: +NAME:Demo Project/$ID:5e493a45cf774/$UID: +NAME:Demo Project/$ID:5e493a45dd2c9/$UID: +NAME:Demo Project/$ID:5e493a45e9d84/$UID: +NAME:Demo Project/$ID:5e493a4602df0/$UID: +NAME:Demo Project/$ID:5e493a4611e20/$UID: +NAME:Demo Project/$ID:5e493a4620bef/$UID: +NAME:Demo Project/$ID:5e493a462e553/$UID: +NAME:Demo Project/$ID:5e493a463d358/$UID: +NAME:Demo Project/$ID:5e493a464bf59/$UID: +NAME:Demo Project/$ID:5e493a465d39a/$UID: +NAME:Demo Project/$ID:5e493a466c966/$UID: +NAME:Demo Project/$ID:5e493a467bd69/$UID: +NAME:Demo Project/$ID:5e493a468bb20/$UID: +NAME:Demo Project/$ID:5e493a469bb21/$UID: +NAME:Demo Project/$ID:5e493a46abc4c/$UID: +NAME:Demo Project/$ID:5e493a46baa08/$UID: +NAME:Demo Project/$ID:5e493a46c94c3/$UID: +NAME:Demo Project/$ID:5e493a46d8b9b/$UID: +NAME:Demo Project/$ID:5e493a46e7149/$UID: +NAME:Demo Project/$ID:5e493a471123c/$UID: +NAME:Demo Project/$ID:5e493a471ffde/$UID: +NAME:Demo Project/$ID:5e493a472db39/$UID: +NAME:Demo Project/$ID:5e493a473d338/$UID: +NAME:Demo Project/$ID:5e493a474b5bf/$UID: +NAME:Demo Project/$ID:5e493a479a56f/$UID: +NAME:Demo Project/$ID:5e493a47a8788/$UID: +NAME:Demo Project/$ID:5e493a47b83d7/$UID: +NAME:Demo Project/$ID:5e493a47c66c3/$UID: +NAME:Demo Project/$ID:5e493a47d4b7d/$UID: +NAME:Demo Project/$ID:5e493a47e32ea/$UID: +NAME:Demo Project/$ID:5e493a47f0db1/$UID: +NAME:Demo Project/$ID:5e493a480a620/$UID: +NAME:Demo Project/$ID:5e493a48198b5/$UID: +NAME:Demo Project/$ID:5e493a48290cf/$UID: +NAME:Demo Project/$ID:5e493a4838176/$UID: +NAME:Demo Project/$ID:5e493a48477af/$UID: +NAME:Demo Project/$ID:5e493a4856125/$UID: +NAME:Demo Project/$ID:5e493a486487a/$UID: +NAME:Demo Project/$ID:5e493a48734ce/$UID: +NAME:Demo Project/$ID:5e493a4881f0c/$UID: +NAME:Demo Project/$ID:5e493e745da3d/$UID: +NAME:Demo Project/$ID:5e493e74899f1/$UID: +NAME:Demo Project/$ID:5e493e74a24bf/$UID: +NAME:Demo Project/$ID:5e493e74eb6c4/$UID: +NAME:Demo Project/$ID:5e493e750cf8c/$UID: +NAME:Demo Project/$ID:5e493e7525329/$UID: +NAME:Demo Project/$ID:5e493e753c0fc/$UID: +NAME:Demo Project/$ID:5e493e7604494/$UID: +NAME:Demo Project/$ID:5e493e761abe9/$UID: +NAME:Demo Project/$ID:5e493e765efe2/$UID: +NAME:Demo Project/$ID:5e493e7676ea5/$UID: +NAME:Demo Project/$ID:5e493e7693dbb/$UID: +NAME:Demo Project/$ID:5e493e76af371/$UID: +NAME:Demo Project/$ID:5e493e76cb8ab/$UID: +NAME:Demo Project/$ID:5e493e76e7ed7/$UID: +NAME:Demo Project/$ID:5e493e7792a6d/$UID: +NAME:Demo Project/$ID:5e493e785111c/$UID: +NAME:Demo Project/$ID:5e493e7869154/$UID: +NAME:Demo Project/$ID:5e493e787f346/$UID: +NAME:Demo Project/$ID:5e493e78956e8/$UID: +NAME:Demo Project/$ID:5e493e78d1acc/$UID: +NAME:Demo Project/$ID:5e493e78e813b/$UID: +NAME:Demo Project/$ID:5e493e790f75c/$UID: +NAME:Demo Project/$ID:5e493e7933374/$UID: +NAME:Demo Project/$ID:5e493e7954184/$UID: +NAME:Demo Project/$ID:5e493e7adfb4e/$UID: +NAME:Demo Project/$ID:5e493e7b04929/$UID: +NAME:Demo Project/$ID:5e493e7b780f8/$UID: +NAME:Demo Project/$ID:5e493e7b94982/$UID: +NAME:Demo Project/$ID:5e493e7c77fb5/$UID: +NAME:Demo Project/$ID:5e493e7c88fac/$UID: +NAME:Demo Project/$ID:5e493e7ca22b4/$UID: +NAME:Demo Project/$ID:5e493e7cda829/$UID: +NAME:Demo Project/$ID:5e493e7d466ad/$UID: +NAME:Demo Project/$ID:5e493e7d6475c/$UID: +NAME:Demo Project/$ID:5e493e7e6f5b0/$UID: +NAME:Demo Project/$ID:5e493e7eb1fe2/$UID: +NAME:Demo Project/$ID:5e493e7ec94e0/$UID: +NAME:Demo Project/$ID:5e493e7f122c2/$UID: +NAME:Demo Project/$ID:5e493e7f29d7c/$UID: +NAME:Demo Project/$ID:5e493e7f64139/$UID: +NAME:Demo Project/$ID:5e493e7f81cfe/$UID: +NAME:Demo Project/$ID:5e493e80948d0/$UID: +NAME:Demo Project/$ID:5e493e80b6267/$UID: +NAME:Demo Project/$ID:5e493e8119670/$UID: +NAME:Demo Project/$ID:5e493e8139099/$UID: +NAME:Demo Project/$ID:5e493e818849f/$UID: +NAME:Demo Project/$ID:5e493e81a353c/$UID: +NAME:Demo Project/$ID:5e493e82f171a/$UID: +NAME:Demo Project/$ID:5e493e8315ce8/$UID: +NAME:Demo Project/$ID:5e493e84a4ae7/$UID: +NAME:Demo Project/$ID:5e493e84b6903/$UID: +NAME:Demo Project/$ID:5e493e84c9cc4/$UID: +NAME:Demo Project/$ID:5e493e851700c/$UID: +NAME:Demo Project/$ID:5e493e852a062/$UID: +NAME:Demo Project/$ID:5e493e853ba75/$UID: +NAME:Demo Project/$ID:5e493e854dbad/$UID: +NAME:Demo Project/$ID:5e493e864a205/$UID: +NAME:Demo Project/$ID:5e493e865caa0/$UID: +NAME:Demo Project/$ID:5e493e866f79d/$UID: +NAME:Demo Project/$ID:5e493e8683094/$UID: +NAME:Demo Project/$ID:5e493e8696431/$UID: +NAME:Demo Project/$ID:5e493e86a9678/$UID: +NAME:Demo Project/$ID:5e493e872973f/$UID: +NAME:Demo Project/$ID:5e493e873b754/$UID: +NAME:Demo Project/$ID:5e493e875032b/$UID: +NAME:Demo Project/$ID:5e493e8780350/$UID: +NAME:Demo Project/$ID:5e493e884697f/$UID: +NAME:Demo Project/$ID:5e493e885a990/$UID: +NAME:Demo Project/$ID:5e493e888c7d4/$UID: +NAME:Demo Project/$ID:5e493e889f0aa/$UID: +NAME:Demo Project/$ID:5e493e88b1716/$UID: +NAME:Demo Project/$ID:5e493e88c4282/$UID: +NAME:Demo Project/$ID:5e493e88d9473/$UID: +NAME:Demo Project/$ID:5e493e88ed8b1/$UID: +NAME:Demo Project/$ID:5e493e89780f3/$UID: +NAME:Demo Project/$ID:5e493e898bf6b/$UID: +NAME:Demo Project/$ID:5e493e89a07a8/$UID: +NAME:Demo Project/$ID:5e493e8a7d210/$UID: +NAME:Demo Project/$ID:5e493e8aa9a25/$UID: +NAME:Demo Project/$ID:5e493e8ac2aa5/$UID: +NAME:Demo Project/$ID:5e493e8add586/$UID: +NAME:Demo Project/$ID:5e493e8b02ee8/$UID: +NAME:Demo Project/$ID:5e493e8b1d4fb/$UID: +NAME:Demo Project/$ID:5e493e8b613ca/$UID: +NAME:Demo Project/$ID:5e493e8b75d00/$UID: +NAME:Demo Project/$ID:5e493e8b88145/$UID: +NAME:Demo Project/$ID:5e493e8b9afea/$UID: +NAME:Demo Project/$ID:5e493e8baf364/$UID: +NAME:Demo Project/$ID:5e493e8bc6d89/$UID: +NAME:Demo Project/$ID:5e493e8c6a215/$UID: +NAME:Demo Project/$ID:5e493e8d2e107/$UID: +NAME:Demo Project/$ID:5e493e8d635a9/$UID: +NAME:Demo Project/$ID:5e493e8d73b18/$UID: +NAME:Demo Project/$ID:5e493e8dbafa7/$UID: +NAME:Demo Project/$ID:5e493e8dd617d/$UID: +NAME:Demo Project/$ID:5e493e8e26910/$UID: +NAME:Demo Project/$ID:5e493e8e3da56/$UID: +NAME:Demo Project/$ID:5e493e8e85b07/$UID: +NAME:Demo Project/$ID:5e493e8e9d4d5/$UID: +NAME:Demo Project/$ID:5e493e8ee17c6/$UID: +NAME:Demo Project/$ID:5e493e8fa2e71/$UID: +NAME:Demo Project/$ID:5e493e8fe33b0/$UID: +NAME:Demo Project/$ID:5e493e9002e88/$UID: +NAME:Demo Project/$ID:5e493e903ceee/$UID: +NAME:Demo Project/$ID:5e493e904f551/$UID: +NAME:Demo Project/$ID:5e493e908e962/$UID: +NAME:Demo Project/$ID:5e493e90a3ede/$UID: +NAME:Demo Project/$ID:5e493e90cb10b/$UID: +NAME:Demo Project/$ID:5e493e90f2a84/$UID: +NAME:Demo Project/$ID:5e493e912f2ae/$UID: +NAME:Demo Project/$ID:5e493e91e20a6/$UID: +NAME:Demo Project/$ID:5e493e9220fcd/$UID: +NAME:Demo Project/$ID:5e493e9234302/$UID: +NAME:Demo Project/$ID:5e493e926b813/$UID: +NAME:Demo Project/$ID:5e493e927e534/$UID: +NAME:Demo Project/$ID:5e493e92922f8/$UID: +NAME:Demo Project/$ID:5e493e92bf6dd/$UID: +NAME:Demo Project/$ID:5e493e92d0cbf/$UID: +NAME:Demo Project/$ID:5e493e92e2b36/$UID: +NAME:Demo Project/$ID:5e493e92f3e8f/$UID: +NAME:Demo Project/$ID:5e493e93bed65/$UID: +NAME:Demo Project/$ID:5e493e93d3dde/$UID: +NAME:Demo Project/$ID:5e493e9414698/$UID: +NAME:Demo Project/$ID:5e493e94283e6/$UID: +NAME:Demo Project/$ID:5e493e943cc4d/$UID: +NAME:Demo Project/$ID:5e493e9450b54/$UID: +NAME:Demo Project/$ID:5e493e9465374/$UID: +NAME:Demo Project/$ID:5e493e9477964/$UID: +NAME:Demo Project/$ID:5e493e94f15a3/$UID: +NAME:Demo Project/$ID:5e493e95114aa/$UID: +NAME:Demo Project/$ID:5e493e952673f/$UID: +NAME:Demo Project/$ID:5e493e95f09c3/$UID: +NAME:Demo Project/$ID:5e493e96133b4/$UID: +NAME:Demo Project/$ID:5e493e9626da8/$UID: +NAME:Demo Project/$ID:5e493e96395d0/$UID: +NAME:Demo Project/$ID:5e493e964cbba/$UID: +NAME:Demo Project/$ID:5e493e9661a44/$UID: +NAME:Demo Project/$ID:5e493e9695355/$UID: +NAME:Demo Project/$ID:5e493e96ab4d6/$UID: +NAME:Demo Project/$ID:5e493e96bfaa4/$UID: +NAME:Demo Project/$ID:5e493e96d2f67/$UID: +NAME:Demo Project/$ID:5e493e96e8288/$UID: +NAME:Demo Project/$ID:5e493e9709a30/$UID: +NAME:Demo Project/$ID:5e493e9856092/$UID: +NAME:Demo Project/$ID:5e493e986ce6b/$UID: +NAME:Demo Project/$ID:5e493e988192f/$UID: +NAME:Demo Project/$ID:5e493e98b22b0/$UID: +NAME:Demo Project/$ID:5e493e98c58c4/$UID: +NAME:Demo Project/$ID:5e493e98da259/$UID: +NAME:Demo Project/$ID:5e493e98efaaa/$UID: +NAME:Demo Project/$ID:5e493e990ff92/$UID: +NAME:Demo Project/$ID:5e493e9924d1a/$UID: +NAME:Demo Project/$ID:5e493e9957f9f/$UID: +NAME:Demo Project/$ID:5e493e996b290/$UID: +NAME:Demo Project/$ID:5e493e997d7f2/$UID: +NAME:Demo Project/$ID:5e493e9a3f33f/$UID: +NAME:Demo Project/$ID:5e493e9a515dc/$UID: +NAME:Demo Project/$ID:5e493e9a65409/$UID: +NAME:Demo Project/$ID:5e493e9ad614a/$UID: +NAME:Demo Project/$ID:5e493e9ae8677/$UID: +NAME:Demo Project/$ID:5e493e9b062fe/$UID: +NAME:Demo Project/$ID:5e493e9b29fe6/$UID: +NAME:Demo Project/$ID:5e493e9b3be84/$UID: +NAME:Demo Project/$ID:5e493e9b4e49d/$UID: +NAME:Demo Project/$ID:5e493e9b61250/$UID: +NAME:Demo Project/$ID:5e493e9b73d66/$UID: +NAME:Demo Project/$ID:5e493e9b856c0/$UID: +NAME:Demo Project/$ID:5e493e9c658e9/$UID: +NAME:Demo Project/$ID:5e493e9c77139/$UID: +NAME:Demo Project/$ID:5e493e9c8a224/$UID: +NAME:Demo Project/$ID:5e493e9c9e964/$UID: +NAME:Demo Project/$ID:5e493e9cb0a0d/$UID: +NAME:Demo Project/$ID:5e493e9cc211e/$UID: +NAME:Demo Project/$ID:5e493e9d50a60/$UID: +NAME:Demo Project/$ID:5e493e9d62fdb/$UID: +NAME:Demo Project/$ID:5e493e9d746b1/$UID: +NAME:Demo Project/$ID:5e493e9e44c4e/$UID: +NAME:Demo Project/$ID:5e493e9e56b48/$UID: +NAME:Demo Project/$ID:5e493e9e69ec7/$UID: +NAME:Demo Project/$ID:5e493e9e7b69c/$UID: +NAME:Demo Project/$ID:5e493e9e8dc2d/$UID: +NAME:Demo Project/$ID:5e493e9ea2151/$UID: +NAME:Demo Project/$ID:5e493e9ed4017/$UID: +NAME:Demo Project/$ID:5e493e9ee7803/$UID: +NAME:Demo Project/$ID:5e493e9f07002/$UID: +NAME:Demo Project/$ID:5e493e9f1a226/$UID: +NAME:Demo Project/$ID:5e493e9f2f785/$UID: +NAME:Demo Project/$ID:5e493e9f48b54/$UID: +NAME:Demo Project/$ID:5e493e9fcd302/$UID: +NAME:Demo Project/$ID:5e493e9fe1521/$UID: +NAME:Demo Project/$ID:5e493ea0a7c82/$UID: +NAME:Demo Project/$ID:5e493ea0dd760/$UID: +NAME:Demo Project/$ID:5e493ea0efc14/$UID: +NAME:Demo Project/$ID:5e493ea10ebe4/$UID: +NAME:Demo Project/$ID:5e493ea122316/$UID: +NAME:Demo Project/$ID:5e493ea135879/$UID: +NAME:Demo Project/$ID:5e493ea147f6b/$UID: +NAME:Demo Project/$ID:5e493ea17adbc/$UID: +NAME:Demo Project/$ID:5e493ea18cd3e/$UID: +NAME:Demo Project/$ID:5e493ea19fa80/$UID: +NAME:Demo Project/$ID:5e493ea1b2191/$UID: +NAME:Demo Project/$ID:5e493ea1c5c91/$UID: +NAME:Demo Project/$ID:5e493ea294077/$UID: +NAME:Demo Project/$ID:5e493ea3068eb/$UID: +NAME:Demo Project/$ID:5e493ea319113/$UID: +NAME:Demo Project/$ID:5e493ea335b48/$UID: +NAME:Demo Project/$ID:5e493ea363a31/$UID: +NAME:Demo Project/$ID:5e493ea37b595/$UID: +NAME:Demo Project/$ID:5e493ea396516/$UID: +NAME:Demo Project/$ID:5e493ea3afe70/$UID: +NAME:Demo Project/$ID:5e493ea3c8e27/$UID: +NAME:Demo Project/$ID:5e493ea3e3167/$UID: +NAME:Demo Project/$ID:5e493ea4319ca/$UID: +NAME:Demo Project/$ID:5e493ea4e206d/$UID: +NAME:Demo Project/$ID:5e493ea5008bc/$UID: +NAME:Demo Project/$ID:5e493ea5140f7/$UID: +NAME:Demo Project/$ID:5e493ea5273be/$UID: +NAME:Demo Project/$ID:5e493ea536edf/$UID: +NAME:Demo Project/$ID:5e493ea59ceb0/$UID: +NAME:Demo Project/$ID:5e493ea5ae90e/$UID: +NAME:Demo Project/$ID:5e493ea5c1341/$UID: +NAME:Demo Project/$ID:5e493ea62ed4d/$UID: +NAME:Demo Project/$ID:5e493ea643115/$UID: +NAME:Demo Project/$ID:5e493ea658cab/$UID: +NAME:Demo Project/$ID:5e493ea741f0a/$UID: +NAME:Demo Project/$ID:5e493ea758519/$UID: +NAME:Demo Project/$ID:5e493ea769b49/$UID: +NAME:Demo Project/$ID:5e493ea798162/$UID: +NAME:Demo Project/$ID:5e493ea7aa4e4/$UID: +NAME:Demo Project/$ID:5e493ea7be2fc/$UID: +NAME:Demo Project/$ID:5e493ea7ceeb8/$UID: +NAME:Demo Project/$ID:5e493ea7e0ec3/$UID: +NAME:Demo Project/$ID:5e493ea800b24/$UID: +NAME:Demo Project/$ID:5e4941d65bcf2/$UID: +NAME:Demo Project/$ID:5e4941d7cf8bd/$UID: +NAME:Demo Project/$ID:5e4941d7e15aa/$UID: +NAME:Demo Project/$ID:5e4941d7f3366/$UID: +NAME:Demo Project/$ID:5e4941d80eca7/$UID: +NAME:Demo Project/$ID:5e4941d82131e/$UID: +NAME:Demo Project/$ID:5e4941d830c80/$UID: +NAME:Demo Project/$ID:5e4941d840cdb/$UID: +NAME:Demo Project/$ID:5e4941d85241d/$UID: +NAME:Demo Project/$ID:5e4941d85ffcd/$UID: +NAME:Demo Project/$ID:5e4941d871285/$UID: +NAME:Demo Project/$ID:5e4941d881a19/$UID: +NAME:Demo Project/$ID:5e4941d8901b4/$UID: +NAME:Demo Project/$ID:5e4941d89f4c1/$UID: +NAME:Demo Project/$ID:5e4941d8ae678/$UID: +NAME:Demo Project/$ID:5e4941d8be077/$UID: +NAME:Demo Project/$ID:5e4941d8cbea9/$UID: +NAME:Demo Project/$ID:5e4941d8d9bb0/$UID: +NAME:Demo Project/$ID:5e4941d8e90ce/$UID: +NAME:Demo Project/$ID:5e4941d902489/$UID: +NAME:Demo Project/$ID:5e4941d91005c/$UID: +NAME:Demo Project/$ID:5e4941d91d6e0/$UID: +NAME:Demo Project/$ID:5e4941d92b6ac/$UID: +NAME:Demo Project/$ID:5e4941d938ae5/$UID: +NAME:Demo Project/$ID:5e4941d9464b6/$UID: +NAME:Demo Project/$ID:5e4941d95adbc/$UID: +NAME:Demo Project/$ID:5e4941d96a2b3/$UID: +NAME:Demo Project/$ID:5e4941d9797fd/$UID: +NAME:Demo Project/$ID:5e4941d988ca1/$UID: +NAME:Demo Project/$ID:5e4941d997e9e/$UID: +NAME:Demo Project/$ID:5e4941d9cd1f5/$UID: +NAME:Demo Project/$ID:5e4941d9daaf5/$UID: +NAME:Demo Project/$ID:5e4941da07581/$UID: +NAME:Demo Project/$ID:5e4941da1509c/$UID: +NAME:Demo Project/$ID:5e4941da238a8/$UID: +NAME:Demo Project/$ID:5e4941da308e4/$UID: +NAME:Demo Project/$ID:5e4941da4050a/$UID: +NAME:Demo Project/$ID:5e4941da4f73d/$UID: +NAME:Demo Project/$ID:5e4941da62726/$UID: +NAME:Demo Project/$ID:5e4941da73c31/$UID: +NAME:Demo Project/$ID:5e4941da83940/$UID: +NAME:Demo Project/$ID:5e4941da92f0d/$UID: +NAME:Demo Project/$ID:5e4941daa3a92/$UID: +NAME:Demo Project/$ID:5e4941dab2077/$UID: +NAME:Demo Project/$ID:5e4941dac1e55/$UID: +NAME:Demo Project/$ID:5e4941dad0c35/$UID: +NAME:Demo Project/$ID:5e4941dae09b8/$UID: +NAME:Demo Project/$ID:5e4941daeeabe/$UID: +NAME:Demo Project/$ID:5e4941db0a7c2/$UID: +NAME:Demo Project/$ID:5e4941db18299/$UID: +NAME:Demo Project/$ID:5e4941db26b5d/$UID: +NAME:Demo Project/$ID:5e4941db3507b/$UID: +NAME:Demo Project/$ID:5e4941db43a95/$UID: +NAME:Demo Project/$ID:5e4941db5294e/$UID: +NAME:Demo Project/$ID:5e4941db61361/$UID: +NAME:Demo Project/$ID:5e4941db6f0f9/$UID: +NAME:Demo Project/$ID:5e4941db884bf/$UID: +NAME:Demo Project/$ID:5e4941db9864a/$UID: +NAME:Demo Project/$ID:5e4941dbaf044/$UID: +NAME:Demo Project/$ID:5e4941dbbc99f/$UID: +NAME:Demo Project/$ID:5e4941dbc9179/$UID: +NAME:Demo Project/$ID:5e4941dbd591f/$UID: +NAME:Demo Project/$ID:5e4941dbe231b/$UID: +NAME:Demo Project/$ID:5e4941dbefd25/$UID: +NAME:Demo Project/$ID:5e4941dc0850b/$UID: +NAME:Demo Project/$ID:5e4941dc1d105/$UID: +NAME:Demo Project/$ID:5e4941dc2abb6/$UID: +NAME:Demo Project/$ID:5e4941dc38311/$UID: +NAME:Demo Project/$ID:5e4941dc45dfb/$UID: +NAME:Demo Project/$ID:5e4941dc53e22/$UID: +NAME:Demo Project/$ID:5e4941dc66122/$UID: +NAME:Demo Project/$ID:5e4941dc76abb/$UID: +NAME:Demo Project/$ID:5e4941dc85c41/$UID: +NAME:Demo Project/$ID:5e4941dc95b93/$UID: +NAME:Demo Project/$ID:5e4941dca4109/$UID: +NAME:Demo Project/$ID:5e4941dcb359f/$UID: +NAME:Demo Project/$ID:5e4941dcc2102/$UID: +NAME:Demo Project/$ID:5e4941dcd1481/$UID: +NAME:Demo Project/$ID:5e4941dce01b5/$UID: +NAME:Demo Project/$ID:5e4941dceeee9/$UID: +NAME:Demo Project/$ID:5e4941dd08fed/$UID: +NAME:Demo Project/$ID:5e4941dd17d11/$UID: +NAME:Demo Project/$ID:5e4941dd26371/$UID: +NAME:Demo Project/$ID:5e4941dd33db5/$UID: +NAME:Demo Project/$ID:5e4941dd4161f/$UID: +NAME:Demo Project/$ID:5e4941dd4f333/$UID: +NAME:Demo Project/$ID:5e4941dd6b3a3/$UID: +NAME:Demo Project/$ID:5e4941dd7b185/$UID: +NAME:Demo Project/$ID:5e4941dd89d6c/$UID: +NAME:Demo Project/$ID:5e4941dd9987a/$UID: +NAME:Demo Project/$ID:5e4941dda8561/$UID: +NAME:Demo Project/$ID:5e4941ddb6e1e/$UID: +NAME:Demo Project/$ID:5e4941ddc550b/$UID: +NAME:Demo Project/$ID:5e4941ddd419d/$UID: +NAME:Demo Project/$ID:5e4941dde3510/$UID: +NAME:Demo Project/$ID:5e4941ddf2442/$UID: +NAME:Demo Project/$ID:5e4941de0ce89/$UID: +NAME:Demo Project/$ID:5e4941de1b114/$UID: +NAME:Demo Project/$ID:5e4941de2a010/$UID: +NAME:Demo Project/$ID:5e4941de387e8/$UID: +NAME:Demo Project/$ID:5e4941de46b84/$UID: +NAME:Demo Project/$ID:5e4941de55e70/$UID: +NAME:Demo Project/$ID:5e4941de65f38/$UID: +NAME:Demo Project/$ID:5e4941de75271/$UID: +NAME:Demo Project/$ID:5e4941de83cad/$UID: +NAME:Demo Project/$ID:5e4941de91c45/$UID: +NAME:Demo Project/$ID:5e4941dea10db/$UID: +NAME:Demo Project/$ID:5e4941deb02ea/$UID: +NAME:Demo Project/$ID:5e4941debf853/$UID: +NAME:Demo Project/$ID:5e4941dece8db/$UID: +NAME:Demo Project/$ID:5e4941dede871/$UID: +NAME:Demo Project/$ID:5e4941def08dc/$UID: +NAME:Demo Project/$ID:5e4941df0c432/$UID: +NAME:Demo Project/$ID:5e4941df1d21b/$UID: +NAME:Demo Project/$ID:5e4941df2dd34/$UID: +NAME:Demo Project/$ID:5e4941df3dc67/$UID: +NAME:Demo Project/$ID:5e4941df61b0f/$UID: +NAME:Demo Project/$ID:5e4941df73ba9/$UID: +NAME:Demo Project/$ID:5e4941df8a086/$UID: +NAME:Demo Project/$ID:5e4941df9ffab/$UID: +NAME:Demo Project/$ID:5e4941dfb4c9c/$UID: +NAME:Demo Project/$ID:5e4941dfc59d0/$UID: +NAME:Demo Project/$ID:5e4941dfd4c23/$UID: +NAME:Demo Project/$ID:5e4941dfe4e1d/$UID: +NAME:Demo Project/$ID:5e4941e0000a4/$UID: +NAME:Demo Project/$ID:5e4941e01549e/$UID: +NAME:Demo Project/$ID:5e4941e024de5/$UID: +NAME:Demo Project/$ID:5e4941e033a98/$UID: +NAME:Demo Project/$ID:5e4941e04207a/$UID: +NAME:Demo Project/$ID:5e4941e05028b/$UID: +NAME:Demo Project/$ID:5e4941e060c02/$UID: +NAME:Demo Project/$ID:5e4941e0702c5/$UID: +NAME:Demo Project/$ID:5e4941e080a66/$UID: +NAME:Demo Project/$ID:5e4941e090de1/$UID: +NAME:Demo Project/$ID:5e4941e0a0652/$UID: +NAME:Demo Project/$ID:5e4941e0aec74/$UID: +NAME:Demo Project/$ID:5e4941e0bdab4/$UID: +NAME:Demo Project/$ID:5e4941e0cb4a4/$UID: +NAME:Demo Project/$ID:5e4941e0d8eca/$UID: +NAME:Demo Project/$ID:5e4941e0e7813/$UID: +NAME:Demo Project/$ID:5e4941e10100a/$UID: +NAME:Demo Project/$ID:5e4941e10f646/$UID: +NAME:Demo Project/$ID:5e4941e11df22/$UID: +NAME:Demo Project/$ID:5e4941e12e6c6/$UID: +NAME:Demo Project/$ID:5e4941e13e138/$UID: +NAME:Demo Project/$ID:5e4941e14dc97/$UID: +NAME:Demo Project/$ID:5e4941e173530/$UID: +NAME:Demo Project/$ID:5e4941e185804/$UID: +NAME:Demo Project/$ID:5e4941e1944d6/$UID: +NAME:Demo Project/$ID:5e4941e1a0979/$UID: +NAME:Demo Project/$ID:5e4941e1a5639/$UID: +NAME:Demo Project/$ID:5e4941e1b38b3/$UID: +NAME:Demo Project/$ID:5e4941e1c2191/$UID: +NAME:Demo Project/$ID:5e4941e1d02b0/$UID: +NAME:Demo Project/$ID:5e4941e1df7da/$UID: +NAME:Demo Project/$ID:5e4941e1edfc1/$UID: +NAME:Demo Project/$ID:5e4941e20858e/$UID: +NAME:Demo Project/$ID:5e4941e2171ea/$UID: +NAME:Demo Project/$ID:5e4941e226dee/$UID: +NAME:Demo Project/$ID:5e4941e2354ee/$UID: +NAME:Demo Project/$ID:5e4941e245563/$UID: +NAME:Demo Project/$ID:5e4941e2547bb/$UID: +NAME:Demo Project/$ID:5e4941e2640b7/$UID: +NAME:Demo Project/$ID:5e4941e2740ed/$UID: +NAME:Demo Project/$ID:5e4941e283f62/$UID: +NAME:Demo Project/$ID:5e4941e29c3a3/$UID: +NAME:Demo Project/$ID:5e4941e2ad15c/$UID: +NAME:Demo Project/$ID:5e4941e2bf953/$UID: +NAME:Demo Project/$ID:5e4941e2d4d09/$UID: +NAME:Demo Project/$ID:5e4941e2e91cd/$UID: +NAME:Demo Project/$ID:5e4941e30339a/$UID: +NAME:Demo Project/$ID:5e4941e310ec3/$UID: +NAME:Demo Project/$ID:5e4941e31f00b/$UID: +NAME:Demo Project/$ID:5e4941e32ba30/$UID: +NAME:Demo Project/$ID:5e4941e3389ce/$UID: +NAME:Demo Project/$ID:5e4941e352b97/$UID: +NAME:Demo Project/$ID:5e4941e35fecf/$UID: +NAME:Demo Project/$ID:5e4941e36d180/$UID: +NAME:Demo Project/$ID:5e4941e37a66e/$UID: +NAME:Demo Project/$ID:5e4941e38778d/$UID: +NAME:Demo Project/$ID:5e4941e395017/$UID: +NAME:Demo Project/$ID:5e4941e3a2582/$UID: +NAME:Demo Project/$ID:5e4941e3af651/$UID: +NAME:Demo Project/$ID:5e4941e3bce57/$UID: +NAME:Demo Project/$ID:5e4941e3cacee/$UID: +NAME:Demo Project/$ID:5e4941e3d869d/$UID: +NAME:Demo Project/$ID:5e4941e3e732b/$UID: +NAME:Demo Project/$ID:5e4941e400664/$UID: +NAME:Demo Project/$ID:5e4941e40e284/$UID: +NAME:Demo Project/$ID:5e4941e41bacb/$UID: +NAME:Demo Project/$ID:5e4941e42930f/$UID: +NAME:Demo Project/$ID:5e4941e4366ad/$UID: +NAME:Demo Project/$ID:5e4941e4443b9/$UID: +NAME:Demo Project/$ID:5e4941e452080/$UID: +NAME:Demo Project/$ID:5e4941e460622/$UID: +NAME:Demo Project/$ID:5e4941e46f198/$UID: +NAME:Demo Project/$ID:5e4941e47c90b/$UID: +NAME:Demo Project/$ID:5e4941e489e6a/$UID: +NAME:Demo Project/$ID:5e4941e497f8f/$UID: +NAME:Demo Project/$ID:5e4941e4a5edb/$UID: +NAME:Demo Project/$ID:5e4941e4b3bc4/$UID: +NAME:Demo Project/$ID:5e4941e4c1a70/$UID: +NAME:Demo Project/$ID:5e4941e4cef0b/$UID: +NAME:Demo Project/$ID:5e4941e4dc4cc/$UID: +NAME:Demo Project/$ID:5e4941e4eabf5/$UID: +NAME:Demo Project/$ID:5e4941e511ff9/$UID: +NAME:Demo Project/$ID:5e4941e5205a7/$UID: +NAME:Demo Project/$ID:5e4941e52de67/$UID: +NAME:Demo Project/$ID:5e4941e53bd24/$UID: +NAME:Demo Project/$ID:5e4941e549bdf/$UID: +NAME:Demo Project/$ID:5e4941e5580b3/$UID: +NAME:Demo Project/$ID:5e4941e565b88/$UID: +NAME:Demo Project/$ID:5e4941e573906/$UID: +NAME:Demo Project/$ID:5e4941e581436/$UID: +NAME:Demo Project/$ID:5e4941e58ead0/$UID: +NAME:Demo Project/$ID:5e4941e59cb57/$UID: +NAME:Demo Project/$ID:5e4941e5a9f40/$UID: +NAME:Demo Project/$ID:5e4941e5b7940/$UID: +NAME:Demo Project/$ID:5e4941e5c571f/$UID: +NAME:Demo Project/$ID:5e4941e5d2da9/$UID: +NAME:Demo Project/$ID:5e4941e5e187e/$UID: +NAME:Demo Project/$ID:5e4941e5eefa2/$UID: +NAME:Demo Project/$ID:5e4941e607eb6/$UID: +NAME:Demo Project/$ID:5e4941e615b8b/$UID: +NAME:Demo Project/$ID:5e4941e622f42/$UID: +NAME:Demo Project/$ID:5e4941e6311ed/$UID: +NAME:Demo Project/$ID:5e4941e63e88d/$UID: +NAME:Demo Project/$ID:5e4941e64c1fe/$UID: +NAME:Demo Project/$ID:5e4941e659979/$UID: +NAME:Demo Project/$ID:5e4941e668031/$UID: +NAME:Demo Project/$ID:5e4941e678809/$UID: +NAME:Demo Project/$ID:5e4941e687920/$UID: +NAME:Demo Project/$ID:5e4941e69839f/$UID: +NAME:Demo Project/$ID:5e4941e6a911d/$UID: +NAME:Demo Project/$ID:5e4941e6b9158/$UID: +NAME:Demo Project/$ID:5e4941e6d588c/$UID: +NAME:Demo Project/$ID:5e4941e6e4aa2/$UID: +NAME:Demo Project/$ID:5e4941e700116/$UID: +NAME:Demo Project/$ID:5e4941e70eab1/$UID: +NAME:Demo Project/$ID:5e4941e71d47c/$UID: +NAME:Demo Project/$ID:5e4941e72c87c/$UID: +NAME:Demo Project/$ID:5e4941e73a8ff/$UID: +NAME:Demo Project/$ID:5e4941e748cf9/$UID: +NAME:Demo Project/$ID:5e4941e75799b/$UID: +NAME:Demo Project/$ID:5e4941e76641e/$UID: +NAME:Demo Project/$ID:5e4941e775006/$UID: +NAME:Demo Project/$ID:5e4941e783dd2/$UID: +NAME:Demo Project/$ID:5e4941e792433/$UID: +NAME:Demo Project/$ID:5e4941e7a0900/$UID: +NAME:Demo Project/$ID:5e4941e7ae5db/$UID: +NAME:Demo Project/$ID:5e4941e7bce69/$UID: +NAME:Demo Project/$ID:5e4941e7cb007/$UID: +NAME:Demo Project/$ID:5e4941e7da3ec/$UID: +NAME:Demo Project/$ID:5e4941e7e9ef3/$UID: +NAME:Demo Project/$ID:5e4941e804340/$UID: +NAME:Demo Project/$ID:5e4942fdc01ed/$UID: +NAME:Demo Project/$ID:5e4943177a279/$UID: +NAME:Demo Project/$ID:5e494319670ed/$UID: +NAME:Demo Project/$ID:5e49431ab41b7/$UID: +NAME:Demo Project/$ID:5e49431c31477/$UID: +NAME:Demo Project/$ID:5e49431e3d811/$UID: +NAME:Demo Project/$ID:5e494320da21b/$UID: +NAME:Demo Project/$ID:5e494321e9c94/$UID: +NAME:Demo Project/$ID:5e494324adb65/$UID: +NAME:Demo Project/$ID:5e49432882b98/$UID: +NAME:Demo Project/$ID:5e49432ac903a/$UID: +NAME:Demo Project/$ID:5e49432bc08da/$UID: +NAME:Demo Project/$ID:5e4943328dd2d/$UID: +NAME:Demo Project/$ID:5e4943384419e/$UID: +NAME:Demo Project/$ID:5e49433935608/$UID: +NAME:Demo Project/$ID:5e4943c967905/$UID: +NAME:Demo Project/$ID:5e4943e4a245f/$UID: +NAME:Demo Project/$ID:5e4943e660c19/$UID: +NAME:Demo Project/$ID:5e4943e7ec4e4/$UID: +NAME:Demo Project/$ID:5e4943e954f94/$UID: +NAME:Demo Project/$ID:5e4943ebed5e7/$UID: +NAME:Demo Project/$ID:5e4943eee467d/$UID: +NAME:Demo Project/$ID:5e4943f03c6aa/$UID: +NAME:Demo Project/$ID:5e4943f3045f9/$UID: +NAME:Demo Project/$ID:5e4943f576591/$UID: +NAME:Demo Project/$ID:5e4943f907860/$UID: +NAME:Demo Project/$ID:5e4943faa5cdc/$UID: +NAME:Demo Project/$ID:5e494402a47ad/$UID: +NAME:Demo Project/$ID:5e49440805ecc/$UID: +NAME:Demo Project/$ID:5e494409530e2/$UID: +NAME:Demo Project/$ID:5e4947eadba64/$UID: +NAME:Demo Project/$ID:5e494804c2641/$UID: +NAME:Demo Project/$ID:5e49480738408/$UID: +NAME:Demo Project/$ID:5e4948088ff22/$UID: +NAME:Demo Project/$ID:5e494809c5fb8/$UID: +NAME:Demo Project/$ID:5e49480bc1857/$UID: +NAME:Demo Project/$ID:5e49480e32f78/$UID: +NAME:Demo Project/$ID:5e49480f63583/$UID: +NAME:Demo Project/$ID:5e494814871ce/$UID: +NAME:Demo Project/$ID:5e4948178b313/$UID: +NAME:Demo Project/$ID:5e49481b08c73/$UID: +NAME:Demo Project/$ID:5e49481c77d91/$UID: +NAME:Demo Project/$ID:5e4948244edb9/$UID: +NAME:Demo Project/$ID:5e494829cfc33/$UID: +NAME:Demo Project/$ID:5e49482aad1d2/$UID: +NAME:My New Project/$ID:/$UID:5e432b633e0d5 +NAME:My New Project/$ID:5e493a55400e8/$UID: +NAME:My New Project/$ID:5e493e7b65b73/$UID: +NAME:My New Project/$ID:5e4941d9f01c9/$UID: +NAME:New Project/$ID:5e4945b2133ab/$UID: +NAME:poc/$ID:/$UID:5e407b09ba955 +NAME:poc/$ID:5e493a58e19d5/$UID: +NAME:poc/$ID:5e493a5955551/$UID: +NAME:poc/$ID:5e493a632cac1/$UID: +NAME:poc/$ID:5e493a686924e/$UID: +NAME:poc/$ID:5e493a6c3b62c/$UID: +NAME:poc/$ID:5e493a72931f8/$UID: +NAME:poc/$ID:5e493a784dc6d/$UID: +NAME:poc/$ID:5e493a7e94f30/$UID: +NAME:poc/$ID:5e493a8405b96/$UID: +NAME:poc/$ID:5e493a8da6edb/$UID: +NAME:poc/$ID:5e493e9783d9d/$UID: +NAME:poc/$ID:5e4941e2950a6/$UID: +NAME:Project 11/$ID:/$UID:5e449b61e7fa2 +NAME:Project 11/$ID:5e493a58eb9e7/$UID: +NAME:Project 11/$ID:5e493a5960d12/$UID: +NAME:Project 11/$ID:5e493a633d2b6/$UID: +NAME:Project 11/$ID:5e493a6875af5/$UID: +NAME:Project 11/$ID:5e493a68b48b6/$UID: +NAME:Project 11/$ID:5e493a6c7c262/$UID: +NAME:Project 11/$ID:5e493a729d538/$UID: +NAME:Project 11/$ID:5e493a7859406/$UID: +NAME:Project 11/$ID:5e493a7899591/$UID: +NAME:Project 11/$ID:5e493a7e9f457/$UID: +NAME:Project 11/$ID:5e493a8420cda/$UID: +NAME:Project 11/$ID:5e493a8db824b/$UID: +NAME:Project 11/$ID:5e493a949cead/$UID: +NAME:Project 11/$ID:5e493e7a981f0/$UID: +NAME:Project 11/$ID:5e4941d9c618c/$UID: +NAME:Project 12/$ID:/$UID:5e44a0ebd1e43 +NAME:Project 12/$ID:5e493a5901a2b/$UID: +NAME:Project 12/$ID:5e493a596ea7c/$UID: +NAME:Project 12/$ID:5e493a634a3fc/$UID: +NAME:Project 12/$ID:5e493a68befdd/$UID: +NAME:Project 12/$ID:5e493a6c890bc/$UID: +NAME:Project 12/$ID:5e493a72df779/$UID: +NAME:Project 12/$ID:5e493a78a5e15/$UID: +NAME:Project 12/$ID:5e493a7ee5836/$UID: +NAME:Project 12/$ID:5e493a8484241/$UID: +NAME:Project 12/$ID:5e493a8e255c5/$UID: +NAME:Project 12/$ID:5e493a94ab3ff/$UID: +NAME:Project 12/$ID:5e493a9510ad5/$UID: +NAME:Project 12/$ID:5e493a9b03bd7/$UID: +NAME:Project 12/$ID:5e493aa13b882/$UID: +NAME:Project 12/$ID:5e493aae8c660/$UID: +NAME:Project 12/$ID:5e493e7a87cdc/$UID: +NAME:Project 12/$ID:5e4941d9bc81a/$UID: +NAME:Project X/$ID:/$UID:5e38a7cf4a204 +NAME:Project X/$ID:5e493a590b55e/$UID: +NAME:Project X/$ID:5e493a5978945/$UID: +NAME:Project X/$ID:5e493a63582a9/$UID: +NAME:Project X/$ID:5e493a63bfcbb/$UID: +NAME:Project X/$ID:5e493a68c7da8/$UID: +NAME:Project X/$ID:5e493a6cc86dc/$UID: +NAME:Project X/$ID:5e493a72e8d3e/$UID: +NAME:Project X/$ID:5e493a78e67ff/$UID: +NAME:Project X/$ID:5e493a7f3952f/$UID: +NAME:Project X/$ID:5e493a84cbd33/$UID: +NAME:Project X/$ID:5e493a8e789a3/$UID: +NAME:Project X/$ID:5e493a9519707/$UID: +NAME:Project X/$ID:5e493a9b4e2f0/$UID: +NAME:Project X/$ID:5e493aa18b8fd/$UID: +NAME:Project X/$ID:5e493aa787e7f/$UID: +NAME:Project X/$ID:5e493aaee0c95/$UID: +NAME:Project X/$ID:5e493ab5a4e8a/$UID: +NAME:Project X/$ID:5e493ea868c78/$UID: +NAME:Project X/$ID:5e4941e813099/$UID: +NAME:test/$ID:/$UID:5e387605843dd +NAME:test/$ID:5e493a598a939/$UID: +NAME:test/$ID:5e493a59efcee/$UID: +NAME:test/$ID:5e493a636ed53/$UID: +NAME:test/$ID:5e493a63d1227/$UID: +NAME:test/$ID:5e493a68da6f8/$UID: +NAME:test/$ID:5e493a6cdda3f/$UID: +NAME:test/$ID:5e493a7305c90/$UID: +NAME:test/$ID:5e493a7902f02/$UID: +NAME:test/$ID:5e493a7f4ab79/$UID: +NAME:test/$ID:5e493a84dc693/$UID: +NAME:test/$ID:5e493a8e8ce30/$UID: +NAME:test/$ID:5e493a956e854/$UID: +NAME:test/$ID:5e493a9b5fa73/$UID: +NAME:test/$ID:5e493a9bb19c6/$UID: +NAME:test/$ID:5e493aa1a2a39/$UID: +NAME:test/$ID:5e493aa7df24e/$UID: +NAME:test/$ID:5e493aaef2101/$UID: +NAME:test/$ID:5e493aaf54b0a/$UID: +NAME:test/$ID:5e493ab5b72e8/$UID: +NAME:test/$ID:5e493abbe77fa/$UID: +NAME:test/$ID:5e493ad9caf3e/$UID: +NAME:test/$ID:5e493ea893797/$UID: +NAME:test/$ID:5e4941e82d8c5/$UID: +NAME:Test Project/$ID:/$UID:5e43c279965e4 +NAME:Test Project/$ID:5e493a59ac9b1/$UID: +NAME:Test Project/$ID:5e493a5a1ae2f/$UID: +NAME:Test Project/$ID:5e493a63ef5b0/$UID: +NAME:Test Project/$ID:5e493a6453248/$UID: +NAME:Test Project/$ID:5e493a697e857/$UID: +NAME:Test Project/$ID:5e493a6d3c240/$UID: +NAME:Test Project/$ID:5e493a739f68e/$UID: +NAME:Test Project/$ID:5e493a79823ea/$UID: +NAME:Test Project/$ID:5e493a7fd3804/$UID: +NAME:Test Project/$ID:5e493a856b455/$UID: +NAME:Test Project/$ID:5e493a8878c68/$UID: +NAME:Test Project/$ID:5e493a8f7c892/$UID: +NAME:Test Project/$ID:5e493a9643d9e/$UID: +NAME:Test Project/$ID:5e493a9c803c1/$UID: +NAME:Test Project/$ID:5e493aa2b9392/$UID: +NAME:Test Project/$ID:5e493aa8bb03c/$UID: +NAME:Test Project/$ID:5e493ab02f4dc/$UID: +NAME:Test Project/$ID:5e493ab6e63c2/$UID: +NAME:Test Project/$ID:5e493abd104f6/$UID: +NAME:Test Project/$ID:5e493abf9cd79/$UID: +NAME:Test Project/$ID:5e493ac36478d/$UID: +NAME:Test Project/$ID:5e493aca43cea/$UID: +NAME:Test Project/$ID:5e493aceac0d2/$UID: +NAME:Test Project/$ID:5e493ad3c771d/$UID: +NAME:Test Project/$ID:5e493adb0471d/$UID: +NAME:Test Project/$ID:5e493add9f206/$UID: +NAME:Test Project/$ID:5e493ae2d276d/$UID: +NAME:Test Project/$ID:5e493ae944d66/$UID: +NAME:Test Project/$ID:5e493af29e906/$UID: +NAME:Test Project/$ID:5e493afc0c645/$UID: +NAME:Test Project/$ID:5e493b0560747/$UID: +NAME:Test Project/$ID:5e493b0f25528/$UID: +NAME:Test Project/$ID:5e493b1b833bc/$UID: +NAME:Test Project/$ID:5e493b265d4e3/$UID: +NAME:Test Project/$ID:5e493b3124de1/$UID: +NAME:Test Project/$ID:5e493b3b5ee95/$UID: +NAME:Test Project/$ID:5e493b45b4964/$UID: +NAME:Test Project/$ID:5e493b5281d53/$UID: +NAME:Test Project/$ID:5e493b82f1bab/$UID: +NAME:Test Project/$ID:5e493b8e96f1c/$UID: +NAME:Test Project/$ID:5e493b99d1791/$UID: +NAME:Test Project/$ID:5e493ba53535e/$UID: +NAME:Test Project/$ID:5e493bbd1bd01/$UID: +NAME:Test Project/$ID:5e493bca523c6/$UID: +NAME:Test Project/$ID:5e493bd5c1dce/$UID: +NAME:Test Project/$ID:5e493be12d3e6/$UID: +NAME:Test Project/$ID:5e493bec63fbd/$UID: +NAME:Test Project/$ID:5e493bf8080bf/$UID: +NAME:Test Project/$ID:5e493c040e247/$UID: +NAME:Test Project/$ID:5e493c103d788/$UID: +NAME:Test Project/$ID:5e493c1c192db/$UID: +NAME:Test Project/$ID:5e493c2774309/$UID: diff --git a/app/tasks/upgrade.php b/app/tasks/upgrade.php index e9e9363b84..57f9aa1888 100644 --- a/app/tasks/upgrade.php +++ b/app/tasks/upgrade.php @@ -3,9 +3,10 @@ require_once __DIR__.'/../init.php'; -global $register, $projectDB, $console; +global $register, $projectDB, $console, $providers; use Database\Database; +use Database\Document; use Database\Validator\Authorization; use Utopia\CLI\CLI; use Utopia\CLI\Console; @@ -19,65 +20,147 @@ $callbacks = [ }, '0.5.0' => function($project) use ($db, $projectDB) { - Console::info('Altering table for project: '.$project->getUid()); + Console::info('Upgrading project: '.$project->getId()); - try { - $statement = $db->prepare(" - ALTER TABLE `appwrite`.`app_{$project->getUid()}.audit.audit` DROP COLUMN IF EXISTS `userType`; - ALTER TABLE `appwrite`.`app_{$project->getUid()}.audit.audit` DROP INDEX IF EXISTS `index_1`; - ALTER TABLE `appwrite`.`app_{$project->getUid()}.audit.audit` ADD INDEX IF NOT EXISTS `index_1` (`userId` ASC); - "); - - $statement->execute(); - } - catch (\Exception $e) { - Console::error($e->getMessage().'/'); - } - - $statement->closeCursor(); + // Update all documents $uid -> $id $limit = 30; $sum = 30; $offset = 0; while ($sum >= 30) { - $users = $projectDB->getCollection([ + $all = $projectDB->getCollection([ 'limit' => $limit, 'offset' => $offset, - 'orderField' => 'name', - 'orderType' => 'ASC', + 'orderField' => '$uid', + 'orderType' => 'DESC', 'orderCast' => 'string', - 'filters' => [ - '$collection='.Database::SYSTEM_COLLECTION_USERS, - ], ]); - $sum = count($users); + $sum = count($all); - Console::success('Fetched '.$sum.' users...'); - - foreach($users as $user) { - $user - ->setAttribute('emailVerification', $user->getAttribute('confirm', false)) - ->removeAttribute('confirm') - ; - - if(!$projectDB->updateDocument($user->getArrayCopy())) { - Console::error('Failed to update user'); + Console::success('Fetched '.$sum.' (offset: '.$offset.' / limit: '.$limit.') documents from a total of '.$projectDB->getSum()); + + foreach($all as $document) { + if(empty($document->getAttribute('$uid', null))) { + Console::info('Skipped document'); + continue; } - else { - Console::success('Updated user succefully'); + + $document = fixDocument($document); + + if(empty($document->getId())) { + throw new Exception('Missing ID'); + } + + try { + $new = $projectDB->overwriteDocument($document->getArrayCopy()); + Console::success('Updated document succefully'); + } catch (\Throwable $th) { + Console::error('Failed to update document: '.$th->getMessage()); + continue; + } + + if($new->getId() !== $document->getId()) { + throw new Exception('Duplication Error'); } } $offset = $offset + $limit; } + + try { + $statement = $db->prepare(" + ALTER TABLE `appwrite`.`app_{$project->getId()}.audit.audit` DROP COLUMN IF EXISTS `userType`; + ALTER TABLE `appwrite`.`app_{$project->getId()}.audit.audit` DROP INDEX IF EXISTS `index_1`; + ALTER TABLE `appwrite`.`app_{$project->getId()}.audit.audit` ADD INDEX IF NOT EXISTS `index_1` (`userId` ASC); + "); + + $statement->closeCursor(); + + $statement->execute(); + } + catch (\Exception $e) { + Console::error('Failed to alter table for project: '.$project->getId().' with message: '.$e->getMessage().'/'); + } }, ]; +function fixDocument(Document $document) { + global $providers; + + if($document->getAttribute('$collection') === Database::SYSTEM_COLLECTION_PROJECTS){ + foreach($providers as $key => $provider) { + if(!empty($document->getAttribute('usersOauth'.ucfirst($key).'Appid'))) { + $document + ->setAttribute('usersOauth2'.ucfirst($key).'Appid', $document->getAttribute('usersOauth'.ucfirst($key).'Appid', '')) + ->removeAttribute('usersOauth'.ucfirst($key).'Appid') + ; + } + + if(!empty($document->getAttribute('usersOauth'.ucfirst($key).'Secret'))) { + $document + ->setAttribute('usersOauth2'.ucfirst($key).'Secret', $document->getAttribute('usersOauth'.ucfirst($key).'Secret', '')) + ->removeAttribute('usersOauth'.ucfirst($key).'Secret') + ; + } + } + } + + if($document->getAttribute('$collection') === Database::SYSTEM_COLLECTION_USERS) { + foreach($providers as $key => $provider) { + if(!empty($document->getAttribute('oauth'.ucfirst($key)))) { + $document + ->setAttribute('oauth2'.ucfirst($key), $document->getAttribute('oauth'.ucfirst($key), '')) + ->removeAttribute('oauth'.ucfirst($key)) + ; + } + + if(!empty($document->getAttribute('oauth'.ucfirst($key).'AccessToken'))) { + $document + ->setAttribute('oauth2'.ucfirst($key).'AccessToken', $document->getAttribute('oauth'.ucfirst($key).'AccessToken', '')) + ->removeAttribute('oauth'.ucfirst($key).'AccessToken') + ; + } + } + + if($document->getAttribute('confirm', null) !== null) { + $document + ->setAttribute('emailVerification', $document->getAttribute('confirm', $document->getAttribute('emailVerification', false))) + ->removeAttribute('confirm') + ; + } + } + + if(empty($document->getAttribute('$uid', null))) { + return $document; + } + + $document + ->setAttribute('$id', $document->getAttribute('$uid', null)) + ->removeAttribute('$uid') + ; + + foreach($document as &$attr) { + if($attr instanceof Document) { + $attr = fixDocument($attr); + } + + if(is_array($attr)) { + foreach($attr as &$child) { + if($child instanceof Document) { + $child = fixDocument($child); + } + } + } + } + + return $document; +} + $cli ->task('run') - ->action(function () use ($console, $db, $projectDB, $consoleDB, $callbacks) { + ->action(function () use ($console, $projectDB, $consoleDB, $callbacks) { Console::success('Starting Upgrade'); Authorization::disable(); @@ -89,9 +172,15 @@ $cli while ($sum >= 30) { foreach($projects as $project) { - $projectDB->setNamespace('app_'.$project->getUid()); + $projectDB->setNamespace('app_'.$project->getId()); - $callbacks['0.5.0']($project); + try { + $callbacks['0.5.0']($project); + } catch (\Throwable $th) { + Console::error('Failed to update project ("'.$project->getId().'") version with error: '.$th->getMessage()); + $projectDB->setNamespace('app_console'); + $projectDB->deleteDocument($project->getId()); + } } $projects = $consoleDB->getCollection([ diff --git a/app/views/console/account/index.phtml b/app/views/console/account/index.phtml index 99e74c54c5..99cbe7f3f2 100644 --- a/app/views/console/account/index.phtml +++ b/app/views/console/account/index.phtml @@ -213,7 +213,7 @@ data-failure-param-alert-text="Logout from Session Failed" data-failure-param-alert-classname="error"> - + @@ -234,7 +234,7 @@ data-failure="alert" data-failure-param-alert-text="Logout from Session Failed" data-failure-param-alert-classname="error"> - + diff --git a/app/views/console/comps/header.phtml b/app/views/console/comps/header.phtml index 308f52a596..dcd543eb81 100644 --- a/app/views/console/comps/header.phtml +++ b/app/views/console/comps/header.phtml @@ -10,7 +10,7 @@ data-ls-bind="{{router.params.project}}" data-unsync="1" data-ls-loop="projects" data-ls-as="option"> - + diff --git a/app/views/console/database/index.phtml b/app/views/console/database/index.phtml index ab6611a742..36ca570a39 100644 --- a/app/views/console/database/index.phtml +++ b/app/views/console/database/index.phtml @@ -67,7 +67,7 @@