Implement memberships subquery

This commit is contained in:
Matej Bačo
2022-04-27 12:44:47 +00:00
parent 63538bb0a1
commit 92d6ed6089
5 changed files with 27 additions and 38 deletions
+2 -2
View File
@@ -1077,8 +1077,8 @@ $collections = [
'signed' => true,
'required' => false,
'default' => [],
'array' => true,
'filters' => ['json'],
'array' => false,
'filters' => ['subQueryMemberships'],
],
[
'$id' => 'search',
+4 -4
View File
@@ -106,7 +106,7 @@ App::post('/v1/account')
'prefs' => new \stdClass(),
'sessions' => [],
'tokens' => [],
'memberships' => [],
'memberships' => null,
'search' => implode(' ', [$userId, $email, $name]),
'deleted' => false
])));
@@ -507,7 +507,7 @@ App::get('/v1/account/sessions/oauth2/:provider/redirect')
'prefs' => new \stdClass(),
'sessions' => [],
'tokens' => [],
'memberships' => [],
'memberships' => null,
'search' => implode(' ', [$userId, $email, $name]),
'deleted' => false
])));
@@ -681,7 +681,7 @@ App::post('/v1/account/sessions/magic-url')
'prefs' => new \stdClass(),
'sessions' => [],
'tokens' => [],
'memberships' => [],
'memberships' => null,
'search' => implode(' ', [$userId, $email]),
'deleted' => false
])));
@@ -953,7 +953,7 @@ App::post('/v1/account/sessions/anonymous')
'prefs' => new \stdClass(),
'sessions' => [],
'tokens' => [],
'memberships' => [],
'memberships' => null,
'search' => $userId,
'deleted' => false
])));
+8 -31
View File
@@ -79,10 +79,7 @@ App::post('/v1/teams')
]);
$membership = $dbForProject->createDocument('memberships', $membership);
// Attach user to team
$user->setAttribute('memberships', $membership, Document::SET_TYPE_APPEND);
$user = $dbForProject->updateDocument('users', $user->getId(), $user);
$dbForProject->deleteCachedDocument('users', $user->getId());
}
if (!empty($user->getId())) {
@@ -340,7 +337,7 @@ App::post('/v1/teams/:teamId/memberships')
'prefs' => new \stdClass(),
'sessions' => [],
'tokens' => [],
'memberships' => [],
'memberships' => null,
'search' => implode(' ', [$userId, $email, $name]),
])));
} catch (Duplicate $th) {
@@ -380,10 +377,7 @@ App::post('/v1/teams/:teamId/memberships')
$team->setAttribute('total', $team->getAttribute('total', 0) + 1);
$team = Authorization::skip(fn() => $dbForProject->updateDocument('teams', $team->getId(), $team));
// Attach user to team
$invitee->setAttribute('memberships', $membership, Document::SET_TYPE_APPEND);
$invitee = Authorization::skip(fn() => $dbForProject->updateDocument('users', $invitee->getId(), $invitee));
$dbForProject->deleteCachedDocument('users', $invitee->getId());
} else {
try {
$membership = $dbForProject->createDocument('memberships', $membership);
@@ -604,13 +598,8 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId')
/**
* Replace membership on profile
*/
$memberships = array_filter($profile->getAttribute('memberships'), fn (Document $m) => $m->getId() !== $membership->getId());
$profile
->setAttribute('memberships', $memberships)
->setAttribute('memberships', $membership, Document::SET_TYPE_APPEND);
Authorization::skip(fn () => $dbForProject->updateDocument('users', $profile->getId(), $profile));
$dbForProject->deleteCachedDocument('users', $profile->getId());
$audits
->setParam('userId', $user->getId())
@@ -700,7 +689,6 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId/status')
$user
->setAttribute('emailVerification', true)
->setAttribute('memberships', $membership, Document::SET_TYPE_APPEND)
;
// Log user in
@@ -734,6 +722,8 @@ App::patch('/v1/teams/:teamId/memberships/:membershipId/status')
$user = $dbForProject->updateDocument('users', $user->getId(), $user);
$membership = $dbForProject->updateDocument('memberships', $membership->getId(), $membership);
$dbForProject->deleteCachedDocument('users', $user->getId());
$team = Authorization::skip(fn() => $dbForProject->updateDocument('teams', $team->getId(), $team->setAttribute('total', $team->getAttribute('total', 0) + 1)));
@@ -813,20 +803,7 @@ App::delete('/v1/teams/:teamId/memberships/:membershipId')
throw new Exception('Failed to remove membership from DB', 500, Exception::GENERAL_SERVER_ERROR);
}
$memberships = $user->getAttribute('memberships', []);
foreach ($memberships as $key => $child) {
/** @var Document $child */
if ($membershipId == $child->getId()) {
unset($memberships[$key]);
break;
}
}
$user->setAttribute('memberships', $memberships);
Authorization::skip(fn() => $dbForProject->updateDocument('users', $user->getId(), $user));
$dbForProject->deleteCachedDocument('users', $user->getId());
if ($membership->getAttribute('confirm')) { // Count only confirmed members
$team->setAttribute('total', \max($team->getAttribute('total', 0) - 1, 0));
+1 -1
View File
@@ -65,7 +65,7 @@ App::post('/v1/users')
'prefs' => new \stdClass(),
'sessions' => [],
'tokens' => [],
'memberships' => [],
'memberships' => null,
'search' => implode(' ', [$userId, $email, $name]),
'deleted' => false
]));
+12
View File
@@ -301,6 +301,18 @@ Database::addFilter('subQueryWebhooks',
}
);
Database::addFilter('subQueryMemberships',
function($value) {
return null;
},
function($value, Document $document, Database $database) {
return Authorization::skip(fn() => $database
->find('memberships', [
new Query('userId', Query::TYPE_EQUAL, [$document->getId()])
], $database->getIndexLimit(), 0, []));
}
);
Database::addFilter('encrypt',
function($value) {
$key = App::getEnv('_APP_OPENSSL_KEY_V1');