synergy/server/controller/NotificationCtrl.php (201 lines of code) (raw):

<?php namespace Synergy\Controller; use Synergy\App\Synergy; use Synergy\Interfaces\Observer; use Synergy\Providers\EmailCtrl; use Synergy\Extensions\Specification\RemovalRequestExtension; /** * Description of NotificationCtrl * * @author vriha */ class NotificationCtrl implements Observer { /** @var EmailCtrl */ public $emailProvider; private static $listening = array("assignmentCreated", "testRunEdited", "assignmentRemovedByLeader", "requestedRemoval", "reviewAssignmentCreated", "reviewFinished"); private $ready = false; private $emailsEnabled = true; /** @var RunCtrl */ private $runCtrl; private $reviewCtrl; private $specificationCtrl; private $userCtrl; function __construct() { $this->emailProvider = Synergy::getProvider("email"); $this->ready = true; if (defined('SEND_EMAIL') && intval(SEND_EMAIL) === 0) { $this->emailsEnabled = false; } } public function getRunCtrl() { if (is_null($this->runCtrl)) { $this->runCtrl = new RunCtrl(); } return $this->runCtrl; } public function getReviewCtrl() { if (is_null($this->reviewCtrl)) { $this->reviewCtrl = new ReviewCtrl(); } return $this->reviewCtrl; } /** * * @return SpecificationCtrl */ public function getSpecificationCtrl() { if (is_null($this->specificationCtrl)) { $this->specificationCtrl = new SpecificationCtrl(); } return $this->specificationCtrl; } /** * * @return UserCtrl */ public function getUserCtrl() { if (is_null($this->userCtrl)) { $this->userCtrl = new UserCtrl(); } return $this->userCtrl; } /** * Listens on events and if necessary handles the event * @param String $name message name * @param mixed $data data */ public static function on($name, $data) { if (in_array($name, NotificationCtrl::$listening)) { $instance = new self(); if ($instance->ready) { $instance->handleEvent($name, $data); } } } /** * Handles particular event * @param String $name event name * @param mixed $data received data with event */ public function handleEvent($name, $data) { switch ($name) { case "assignmentCreated": $this->sendNewAssignmentEmail($data); break; case "testRunEdited": $this->sendTestRunUpdatedEmail($data); break; case "assignmentRemovedByLeader": $this->sendTestAssignmentRemovedEmail($data); break; case "requestedRemoval": $this->sendRemovalRequest($data); break; case "reviewAssignmentCreated": $this->sendNewReviewAssignmentEmail($data); break; case "reviewFinished": $this->sendReviewFinishedEmail($data); break; default: break; } } private function sendNewAssignmentEmail($assignmentId) { if (!$this->emailsEnabled) { return; } $assignment = $this->getRunCtrl()->getBasicAssignment($assignmentId); $ctrl = new UserCtrl(); $user = $ctrl->getUser($assignment->username); if (!is_null($assignment) && $user->emailNotifications) { $body = ($this->emailProvider->useHTML) ? $assignment->getCreatedEmailBodyHTML() : $assignment->getCreatedEmailBody(); if (!is_null($user->email) && strlen($user->email) > 0) { $email = $this->emailProvider->compose($body, $assignment->getCreatedEmailSubject(), $user->email); } else { $email = $this->emailProvider->compose($body, $assignment->getCreatedEmailSubject(), $assignment->username . '@' . DOMAIN); } $this->emailProvider->send($email); } } private function sendNewReviewAssignmentEmail($assignmentId) { if (!$this->emailsEnabled) { return; } $assignment = $this->getReviewCtrl()->getBasicAssignment($assignmentId); $ctrl = new UserCtrl(); $user = $ctrl->getUser($assignment->username); if (!is_null($assignment) && $user->emailNotifications) { $body = ($this->emailProvider->useHTML) ? $assignment->getCreatedEmailBodyHTML() : $assignment->getCreatedEmailBody(); if (!is_null($user->email) && strlen($user->email) > 0) { $email = $this->emailProvider->compose($body, $assignment->getCreatedEmailSubject(), $user->email); } else { $email = $this->emailProvider->compose($body, $assignment->getCreatedEmailSubject(), $assignment->username . '@' . DOMAIN); } $this->emailProvider->send($email); } } public function sendTestRunUpdatedEmail($testRunId) { if (!$this->emailsEnabled) { return; } $assignees = $this->getRunCtrl()->getAssignees($testRunId); $testRun = $this->getRunCtrl()->getRunOverview($testRunId); foreach ($assignees as $assignee) { if ($assignee->emailNotifications) { $body = ($this->emailProvider->useHTML) ? $testRun->getUpdatedEmailBodyHTML() : $testRun->getUpdatedEmailBody(); if (!is_null($assignee->email) && strlen($assignee->email) > 0) { $email = $this->emailProvider->compose($body, $testRun->getCUpdatedEmailSubject(), $assignee->email); } else { $email = $this->emailProvider->compose($body, $testRun->getCUpdatedEmailSubject(), $assignee->username . '@' . DOMAIN); } $this->emailProvider->send($email); } } } /** * Sends notification about removed assignment to assignees * @param \Synergy\Model\TestAssignment $assignment * @return type */ private function sendTestAssignmentRemovedEmail($assignment) { if (!$this->emailsEnabled) { return; } $ctrl = new UserCtrl(); $user = $ctrl->getUser($assignment->username); if (!is_null($assignment) && $user->emailNotifications) { $body = ($this->emailProvider->useHTML) ? "<b>Message from tribe leader:</b> " . $assignment->getRemovalComment() . "<br/>" : "Message from tribe leader: " . $assignment->getRemovalComment() . "\r\n"; $body = $body . (($this->emailProvider->useHTML) ? $assignment->getCreatedEmailBodyHTML() : $assignment->getCreatedEmailBody()); if (!is_null($user->email) && strlen($user->email) > 0) { $email = $this->emailProvider->compose($body, $assignment->getRemovedEmailSubject(), $user->email); } else { $email = $this->emailProvider->compose($body, $assignment->getRemovedEmailSubject(), $assignment->username . '@' . DOMAIN); } $this->emailProvider->send($email); } } /** * Sends email notification to specification owner asking to delete the specification * @param type $specificationId */ public function sendRemovalRequest($specificationId) { $specification = $this->getSpecificationCtrl()->getSpecificationOverview($specificationId); $ctrl = new UserCtrl(); $owner = $ctrl->getUser($specification->owner); if (!is_null($specification)) { $users = RemovalRequestExtension::getRequestsForSpecification($specificationId); $_u = ""; foreach ($users as $u) { $_u = $_u . $u->username . ", "; } $_u = substr($_u, 0, strlen($_u) - 2); $body = ($this->emailProvider->useHTML) ? $specification->removalRequestBodyHTML($_u) : $specification->removalRequestBody($_u); if (!is_null($specification->owner) && $specification->owner !== "import") { if (!is_null($owner->email) && strlen($owner->email) > 0) { $email = $this->emailProvider->compose($body, $specification->getRemovalEmailSubject(), $owner->email); } else { $email = $this->emailProvider->compose($body, $specification->getRemovalEmailSubject(), $specification->owner . '@' . DOMAIN); } $this->emailProvider->send($email); } else { // send to manager $managers = $this->getUserCtrl()->getManagers(); foreach ($managers as $man) { if (!is_null($man->email) && strlen($man->email) > 0) { $email = $this->emailProvider->compose($body, $specification->getRemovalEmailSubject(), $man->email); } else { $email = $this->emailProvider->compose($body, $specification->getRemovalEmailSubject(), $man->username . '@' . DOMAIN); } $this->emailProvider->send($email); } } } } /** * Sends email notification about transferring ownership of specification to specification owner * @param \Synergy\Model\Specification $specification * @param String $msg message with explanation * @param String $displayName requester display name * @param String $username requester username */ public function sendOwnershipRequest($specification, $msg, $displayName, $username) { $ctrl = new UserCtrl(); $owner = $ctrl->getUser($specification->owner); $body = ($this->emailProvider->useHTML) ? $specification->ownershipRequestBodyHTML($msg, $displayName, $username) : $specification->ownershipRequestBody($msg, $displayName, $username); if (!is_null($owner->email) && strlen($owner->email) > 0) { $email = $this->emailProvider->compose($body, $specification->getOwnershipRequestSubject(), $owner->email); } else { $email = $this->emailProvider->compose($body, $specification->getOwnershipRequestSubject(), $specification->owner . '@' . DOMAIN); } $this->emailProvider->send($email); } private function sendReviewFinishedEmail($assignmentId) { if (!$this->emailsEnabled) { return; } $assignment = $this->getReviewCtrl()->getAssignmentWithoutComments($assignmentId, false); $body = ($this->emailProvider->useHTML) ? $assignment->getFinishedEmailBodyHTML() : $assignment->getFinishedEmailBody(); $email = $this->emailProvider->compose($body, $assignment->getFinishedEmailSubject(), $assignment->owner); $this->emailProvider->send($email); } } ?>