synergy/server/db/ReviewDAO.php (323 lines of code) (raw):

<?php namespace Synergy\DB; use PDO; use Synergy\Controller\Mediator; use Synergy\Model\Review\ReviewAssignment; use Synergy\Model\Review\ReviewComment; use Synergy\Model\User; /** * Description of ReviewDAO * * @author vriha */ class ReviewDAO { public function createAssignment($testRunId, $userId, $reviewUrl, $createdBy, $title, $owner) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("INSERT INTO review_assignment (user_id, test_run_id, review_url, created_by, title, owner, is_finished, time_taken, weight) VALUES (:u, :t, :r, :x, :i, :o, 0, 0, 0)"); $handler->bindValue(':t', $testRunId); $handler->bindValue(':u', $userId); $handler->bindValue(':r', $reviewUrl); $handler->bindValue(':x', $createdBy); $handler->bindValue(':i', $title); $handler->bindValue(':o', $owner); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } Mediator::emit("reviewAssignmentCreated", DB_DAO::getDB()->lastInsertId()); return true; } /** * Returns only basic information about assignment * @param int $id assignment ID * @return ReviewAssignment|null Description */ public function getBasicAssignment($id) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT u.username as uusername, rn.id as rnid, rn.title as rntitle, rn.end as rnend, a.id as aid, a.review_url, a.owner as aowner, a.title as atitle FROM review_assignment a, user u, test_run rn WHERE a.id=:id AND a.test_run_id=rn.id AND a.user_id=u.id"); $handler->bindParam(":id", $id); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $tr = new ReviewAssignment(); $tr->testRunTitle = $row["rntitle"]; $tr->testRunId = intval($row["rnid"]); $tr->id = intval($row["aid"]); $tr->deadline = $row["rnend"]; $tr->username = $row["uusername"]; $tr->reviewUrl = $row["reviewUrl"]; $tr->title = $row["atitle"]; $tr->owner = $row["aowner"]; return $tr; } return null; } public function countAssignmentsForRun($testRunId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT count(a.id) as aid FROM review_assignment a WHERE a.test_run_id=:id"); $handler->bindParam(":id", $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return intval($row["aid"]); } return 0; } public function getAssignments($testRunId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT u.username,u.email, a.review_url,a.is_finished as afi, a.title as atitle,a.time_taken as ataken, a.weight as aweight, a.owner as aowner, u.id AS uid, a.last_updated, a.started, u.first_name, u.last_name, a.created_by, a.id as aid FROM review_assignment a, user u WHERE a.test_run_id=:id AND a.user_id=u.id GROUP BY a.id "); $handler->bindParam(":id", $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $results = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $r = new ReviewAssignment(); $r->createdBy = intval($row["created_by"]); $r->setEmail($row["email"]); $r->title = $row["atitle"]; $r->owner = substr($row["aowner"], 0, strpos($row["aowner"], "@")); $r->setLastUpdated($row["last_updated"]); $r->setStarted($row["started"]); $r->username = $row["username"]; $r->userDisplayName = $row["first_name"] . " " . $row["last_name"]; $r->reviewUrl = $row["review_url"]; $r->userId = intval($row["uid"]); $r->isFinished = $row["afi"] === "0" ? false : true; $r->id = intval($row["aid"]); $r->info = ($r->isFinished) ? "finished" : "pending"; $r->weight = intval($row["aweight"], 10); $r->timeTaken = intval($row["ataken"], 10); array_push($results, $r); } return $results; } public function getAssignees($testRunId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT DISTINCT u.username, u.email_notifications,u.email FROM review_assignment t, user u WHERE u.id=t.user_id AND t.test_run_id=:tid"); $handler->bindParam(":tid", $testRunId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $u = new User($row['username']); $u->email = $row['email']; $u->emailNotifications = (intval($row['email_notifications']) === 1 ? true : false); $data[$row['username']] = $u; } return $data; } /** * Returns assoc array with keys userId, specificationId, createdBy and values are proper values or -1 in case no record has been found * @param int $assignmentId * @return array */ public function getAssignmentInfo($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT user_id, created_by FROM review_assignment WHERE id=:id"); $handler->bindParam(':id', $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $data = array("userId" => -1, "specificationId" => -1, "createdBy" => -1); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $data["userId"] = intval($row["user_id"]); $data["createdBy"] = intval($row["created_by"]); } return $data; } public function deleteAssignment($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM review_assignment WHERE id=:id"); $handler->bindParam(':id', $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } public function deleteComments($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("DELETE FROM review_comments WHERE review_assignment_id=:id"); $handler->bindParam(':id', $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } public function getAssignment($assignmentId, $escapeEmail = true) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT t.id as tid, t.title as ttitle, u.username, a.owner as aowner, a.title as atitle, a.review_url, u.id AS uid, a.last_updated, a.started, u.first_name, u.last_name, a.created_by, a.id as aid FROM review_assignment a, user u, test_run t WHERE a.test_run_id=t.id AND a.id=:id AND a.user_id=u.id"); $handler->bindParam(":id", $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $r = new ReviewAssignment(); $r->createdBy = intval($row["created_by"]); $r->title = $row["atitle"]; $r->owner = $escapeEmail ? substr($row["aowner"], 0, strpos($row["aowner"], "@")) : $row["aowner"]; $r->setLastUpdated($row["last_updated"]); $r->setStarted($row["started"]); $r->username = $row["username"]; $r->userDisplayName = $row["first_name"] . " " . $row["last_name"]; $r->reviewUrl = $row["review_url"]; $r->userId = intval($row["uid"]); $r->id = intval($row["aid"]); $r->testRunId = intval($row["tid"]); $r->testRunTitle = $row["ttitle"]; $r->info = strlen($r->lastUpdated) > 0 ? "finished" : "pending"; return $r; } return null; } public function getComments($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT u.username, u.first_name, u.last_name, c.elements, c.text, c.id as cid FROM review_assignment a, review_comments c, user u WHERE c.review_assignment_id=:id AND a.user_id=u.id AND c.review_assignment_id=a.id"); $handler->bindParam(":id", $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $comments = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { array_push($comments, new ReviewComment($row["username"], $row["first_name"] . " " . $row["last_name"], $row["text"], $row["cid"], explode(";", $row["elements"]))); } return $comments; } public function setLastUpdated($localTime, $assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("UPDATE review_assignment a SET a.last_updated=:l WHERE a.id=:id"); $handler->bindParam(":id", $assignmentId); $handler->bindParam(":l", $localTime); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } public function isRequestUpToDate($assignmentId, $requestedTimestamp) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT id FROM review_assignment WHERE id=:id AND (last_updated<:da OR last_updated IS NULL)"); $handler->bindValue(":id", $assignmentId); $handler->bindValue(":da", $requestedTimestamp); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return true; // existing record is older } return false; } public function checkUserIsAssigned($id, $username) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT a.user_id FROM review_assignment a, user u WHERE a.user_id=u.id AND u.username=:u AND a.id=:id"); $handler->bindParam(':id', $id); $handler->bindParam(':u', $username); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return true; } return false; } public function getRunIdByAssignmentId($assignmentId) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT test_run_id FROM review_assignment WHERE id=:id"); $handler->bindValue(":id", $assignmentId); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { return intval($row["test_run_id"]); } return -1; } public function insertComments($comments, $assignmentId) { DB_DAO::connectDatabase(); if (count($comments) < 1) { return; } $baseSql = "INSERT INTO review_comments (review_assignment_id, text, elements) VALUES "; for ($i = 0, $max = count($comments); $i < $max; $i++) { $key = $i . time(); $baseSql = $baseSql . "(:" . $key . "aid,:" . $key . "text,:" . $key . "elements),"; $comments[$i]->setHash($key); } $baseSql = substr($baseSql, 0, strlen($baseSql) - 1); $handler = DB_DAO::getDB()->prepare($baseSql); for ($i = 0, $max = count($comments); $i < $max; $i++) { $key = $comments[$i]->getHash(); $handler->bindValue(':' . $key . "aid", $assignmentId); $handler->bindValue(':' . $key . "text", $comments[$i]->text); $el = ""; for ($j = 0; $j < count($comments[$i]->elements); $j++) { $el = $el . $comments[$i]->elements[$j] . ";"; } $el = substr($el, 0, strlen($el) - 1); $handler->bindValue(':' . $key . "elements", $el); } if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } public function updateStatus($assignmentId, $localTime, $isFinished, $timeTaken, $pageValue) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("UPDATE review_assignment a SET a.time_taken=a.time_taken+:t, a.last_updated=:l, a.is_finished=:f, a.weight=:p WHERE a.id=:id"); $handler->bindParam(":id", $assignmentId); $handler->bindParam(":l", $localTime); $handler->bindParam(":t", $timeTaken); $handler->bindParam(":p", $pageValue); $finished = $isFinished ? 1 : 0; $handler->bindParam(":f", $finished); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } /** * * @param int $time time in minutes */ public function setTimeTaken($assignmentId, $time) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("UPDATE review_assignment a SET a.time_taken=:f WHERE a.id=:id"); $handler->bindParam(":id", $assignmentId); $handler->bindParam(":f", $time); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } } public static function getCommentCounts($cond) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT count(rc.id) as c, ra.id as id FROM review_comments rc, review_assignment ra WHERE " . $cond . " AND rc.review_assignment_id=ra.id GROUP BY ra.id"); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $result = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $result["id" . $row["id"]] = intval($row["c"]); } return $result; } public function getAssignmentsInPeriod($testRunId, $from, $to) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("SELECT u.username, a.review_url,a.is_finished as afi, a.title as atitle,a.time_taken as ataken, a.weight as aweight, a.owner as aowner, u.id AS uid, a.last_updated, a.started, u.first_name, u.last_name, a.created_by, a.id as aid FROM review_assignment a, user u WHERE a.test_run_id=:id AND a.user_id=u.id AND a.last_updated<=:t AND a.last_updated>=:f GROUP BY a.id "); $handler->bindParam(":id", $testRunId); $handler->bindParam(":t", $to); $handler->bindParam(":f", $from); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } $results = array(); while ($row = $handler->fetch(PDO::FETCH_ASSOC)) { $r = new ReviewAssignment(); $r->createdBy = intval($row["created_by"]); $r->title = $row["atitle"]; $r->owner = substr($row["aowner"], 0, strpos($row["aowner"], "@")); $r->setLastUpdated($row["last_updated"]); $r->setStarted($row["started"]); $r->username = $row["username"]; $r->userDisplayName = $row["first_name"] . " " . $row["last_name"]; $r->reviewUrl = $row["review_url"]; $r->userId = intval($row["uid"]); $r->isFinished = $row["afi"] === "0" ? false : true; $r->id = intval($row["aid"]); $r->info = ($r->isFinished) ? "finished" : "pending"; $r->weight = intval($row["aweight"], 10); $r->timeTaken = intval($row["ataken"], 10); array_push($results, $r); } return $results; } /** * * @param \Synergy\Model\Review\ReviewPage $reviewPage */ public function createReviewPage($reviewPage) { DB_DAO::connectDatabase(); $handler = DB_DAO::getDB()->prepare("INSERT INTO review_pages (url, title, owner) VALUES (:u, :t, :o)"); $handler->bindParam(":u", $reviewPage->url); $handler->bindParam(":t", $reviewPage->title); $handler->bindParam(":o", $reviewPage->owner); if (!$handler->execute()) { DB_DAO::throwDbError($handler->errorInfo()); } return true; } //put your code here }