Commit 15057653 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Started autojoin implementation

parent 1d9aab8c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -79,4 +79,6 @@ interface UserDAO {
    function isAdmin($userId): bool;

    function updateIdentity(Identity $identity): void;

    function findJoinableUsers($userId): array;
}
+27 −0
Original line number Diff line number Diff line
@@ -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;
    }

}
+10 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ class SessionData {
    private $oauth2RequestData;
    private $action;
    private $loginIdentityType;
    private $autojoin = false;

    public function setUser(?User $user): void {
        $this->user = $user;
@@ -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();
+1 −0
Original line number Diff line number Diff line
@@ -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(),
+9 −0
Original line number Diff line number Diff line
@@ -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