Loading classes/datalayer/UserDAO.php +2 −0 Original line number Diff line number Diff line Loading @@ -79,4 +79,6 @@ interface UserDAO { function isAdmin($userId): bool; function updateIdentity(Identity $identity): void; function findJoinableUsers($userId): array; } classes/datalayer/mysql/MySQLUserDAO.php +27 −0 Original line number Diff line number Diff line Loading @@ -301,4 +301,31 @@ class MySQLUserDAO extends BaseMySQLDAO implements UserDAO { $stmt->execute(); } function findJoinableUsers($userId): array { $dbh = $this->getDBHandler(); $query = "SELECT DISTINCT(i3.user_id)\n" . "FROM user u\n" . "JOIN identity i ON i.user_id = u.id\n" . "JOIN identity i2 ON i.user_id = i2.user_id\n" . "JOIN identity i3 ON i2.email = i3.email\n" . "WHERE i.email IN (SELECT email FROM identity where user_id = :user_id)\n" . "AND i3.user_id NOT IN (SELECT :user_id UNION\n" . "SELECT user_id2 FROM keep_separated WHERE user_id1 = :user_id\n" . "UNION\n" . "SELECT user_id1 FROM keep_separated WHERE user_id2 = :user_id)"; $stmt = $dbh->prepare($query); $stmt->bindParam(':user_id', $userId); $stmt->execute(); $results = []; foreach ($stmt->fetchAll() as $row) { array_push($results, $row['user_id']); } return $results; } } classes/model/SessionData.php +10 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ class SessionData { private $oauth2RequestData; private $action; private $loginIdentityType; private $autojoin = false; public function setUser(?User $user): void { $this->user = $user; Loading @@ -57,6 +58,15 @@ class SessionData { return $this->userToJoin; } public function setAutojoin(bool $autojoin): void { $this->autojoin = $autojoin; $this->save(); } public function isAutojoin(): bool { return $this->autojoin; } public function setLoginIdentityType(string $loginIdentityType): void { $this->loginIdentityType = $loginIdentityType; $this->save(); Loading include/front-controller.php +1 −0 Original line number Diff line number Diff line Loading @@ -297,6 +297,7 @@ Flight::route('GET /confirm-join', function() { die("User data not retrieved."); } else { Flight::render('confirm-join.php', array('title' => 'Confirm join', 'autojoin' => $locator->getSession()->isAutojoin(), 'user' => $locator->getSession()->getUser(), 'user_to_join' => $locator->getSession()->getUserToJoin(), 'version' => $locator->getVersion(), Loading sql/setup-database.sql +9 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,15 @@ CREATE TABLE `identity` ( ALTER TABLE identity ADD CONSTRAINT eppn_unique UNIQUE(eppn); ALTER TABLE identity ADD CONSTRAINT typed_id_unique UNIQUE(typed_id); -- remember that a user decided to avoid a join CREATE TABLE `keep_separated` ( `user_id1` bigint(20) NOT NULL, `user_id2` bigint(20) NOT NULL, PRIMARY KEY (`user_id1`, `user_id2`), FOREIGN KEY (`user_id1`) REFERENCES `user`(`id`), FOREIGN KEY (`user_id2`) REFERENCES `user`(`id`) ); SET FOREIGN_KEY_CHECKS=0; ALTER TABLE `user` ADD FOREIGN KEY (`primary_identity`) REFERENCES `identity`(`id`); SET FOREIGN_KEY_CHECKS=1; Loading Loading
classes/datalayer/UserDAO.php +2 −0 Original line number Diff line number Diff line Loading @@ -79,4 +79,6 @@ interface UserDAO { function isAdmin($userId): bool; function updateIdentity(Identity $identity): void; function findJoinableUsers($userId): array; }
classes/datalayer/mysql/MySQLUserDAO.php +27 −0 Original line number Diff line number Diff line Loading @@ -301,4 +301,31 @@ class MySQLUserDAO extends BaseMySQLDAO implements UserDAO { $stmt->execute(); } function findJoinableUsers($userId): array { $dbh = $this->getDBHandler(); $query = "SELECT DISTINCT(i3.user_id)\n" . "FROM user u\n" . "JOIN identity i ON i.user_id = u.id\n" . "JOIN identity i2 ON i.user_id = i2.user_id\n" . "JOIN identity i3 ON i2.email = i3.email\n" . "WHERE i.email IN (SELECT email FROM identity where user_id = :user_id)\n" . "AND i3.user_id NOT IN (SELECT :user_id UNION\n" . "SELECT user_id2 FROM keep_separated WHERE user_id1 = :user_id\n" . "UNION\n" . "SELECT user_id1 FROM keep_separated WHERE user_id2 = :user_id)"; $stmt = $dbh->prepare($query); $stmt->bindParam(':user_id', $userId); $stmt->execute(); $results = []; foreach ($stmt->fetchAll() as $row) { array_push($results, $row['user_id']); } return $results; } }
classes/model/SessionData.php +10 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ class SessionData { private $oauth2RequestData; private $action; private $loginIdentityType; private $autojoin = false; public function setUser(?User $user): void { $this->user = $user; Loading @@ -57,6 +58,15 @@ class SessionData { return $this->userToJoin; } public function setAutojoin(bool $autojoin): void { $this->autojoin = $autojoin; $this->save(); } public function isAutojoin(): bool { return $this->autojoin; } public function setLoginIdentityType(string $loginIdentityType): void { $this->loginIdentityType = $loginIdentityType; $this->save(); Loading
include/front-controller.php +1 −0 Original line number Diff line number Diff line Loading @@ -297,6 +297,7 @@ Flight::route('GET /confirm-join', function() { die("User data not retrieved."); } else { Flight::render('confirm-join.php', array('title' => 'Confirm join', 'autojoin' => $locator->getSession()->isAutojoin(), 'user' => $locator->getSession()->getUser(), 'user_to_join' => $locator->getSession()->getUserToJoin(), 'version' => $locator->getVersion(), Loading
sql/setup-database.sql +9 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,15 @@ CREATE TABLE `identity` ( ALTER TABLE identity ADD CONSTRAINT eppn_unique UNIQUE(eppn); ALTER TABLE identity ADD CONSTRAINT typed_id_unique UNIQUE(typed_id); -- remember that a user decided to avoid a join CREATE TABLE `keep_separated` ( `user_id1` bigint(20) NOT NULL, `user_id2` bigint(20) NOT NULL, PRIMARY KEY (`user_id1`, `user_id2`), FOREIGN KEY (`user_id1`) REFERENCES `user`(`id`), FOREIGN KEY (`user_id2`) REFERENCES `user`(`id`) ); SET FOREIGN_KEY_CHECKS=0; ALTER TABLE `user` ADD FOREIGN KEY (`primary_identity`) REFERENCES `identity`(`id`); SET FOREIGN_KEY_CHECKS=1; Loading