diff options
Diffstat (limited to 'app/Model')
| -rw-r--r-- | app/Model/Base.php | 2 | ||||
| -rw-r--r-- | app/Model/Link.php | 3 | ||||
| -rw-r--r-- | app/Model/TaskFilter.php | 9 | ||||
| -rw-r--r-- | app/Model/TaskFinder.php | 5 | ||||
| -rw-r--r-- | app/Model/TaskLink.php | 149 |
5 files changed, 152 insertions, 16 deletions
diff --git a/app/Model/Base.php b/app/Model/Base.php index b0d82401..b4f9a9e2 100644 --- a/app/Model/Base.php +++ b/app/Model/Base.php @@ -46,7 +46,7 @@ use Pimple\Container; * @property \Model\Timetable $timetable * @property \Model\TimetableDay $timetableDay * @property \Model\TimetableExtra $timetableExtra - * @property \Model\TimetableOff $timetableOfff + * @property \Model\TimetableOff $timetableOff * @property \Model\TimetableWeek $timetableWeek * @property \Model\SubtaskTimeTracking $subtaskTimeTracking * @property \Model\User $user diff --git a/app/Model/Link.php b/app/Model/Link.php index 87ba49c4..42b8382c 100644 --- a/app/Model/Link.php +++ b/app/Model/Link.php @@ -55,8 +55,7 @@ class Link extends Base */ public function getOppositeLinkId($link_id) { - $link = $this->getById($link_id); - return $link['opposite_id'] ?: $link_id; + return $this->db->table(self::TABLE)->eq('id', $link_id)->findOneColumn('opposite_id') ?: $link_id; } /** diff --git a/app/Model/TaskFilter.php b/app/Model/TaskFilter.php index 31de2795..94f6bab0 100644 --- a/app/Model/TaskFilter.php +++ b/app/Model/TaskFilter.php @@ -24,6 +24,15 @@ class TaskFilter extends Base return $this; } + public function filterById($task_id) + { + if ($task_id > 0) { + $this->query->eq('id', $task_id); + } + + return $this; + } + public function filterByTitle($title) { $this->query->ilike('title', '%'.$title.'%'); diff --git a/app/Model/TaskFinder.php b/app/Model/TaskFinder.php index 554279a5..6f53249a 100644 --- a/app/Model/TaskFinder.php +++ b/app/Model/TaskFinder.php @@ -211,12 +211,13 @@ class TaskFinder extends Base * Fetch a task by the reference (external id) * * @access public + * @param integer $project_id Project id * @param string $reference Task reference * @return array */ - public function getByReference($reference) + public function getByReference($project_id, $reference) { - return $this->db->table(Task::TABLE)->eq('reference', $reference)->findOne(); + return $this->db->table(Task::TABLE)->eq('project_id', $project_id)->eq('reference', $reference)->findOne(); } /** diff --git a/app/Model/TaskLink.php b/app/Model/TaskLink.php index 62391371..7b696afc 100644 --- a/app/Model/TaskLink.php +++ b/app/Model/TaskLink.php @@ -35,13 +35,31 @@ class TaskLink extends Base } /** + * Get the opposite task link (use the unique index task_has_links_unique) + * + * @access public + * @param array $task_link + * @return array + */ + public function getOppositeTaskLink(array $task_link) + { + $opposite_link_id = $this->link->getOppositeLinkId($task_link['link_id']); + + return $this->db->table(self::TABLE) + ->eq('opposite_task_id', $task_link['task_id']) + ->eq('task_id', $task_link['opposite_task_id']) + ->eq('link_id', $opposite_link_id) + ->findOne(); + } + + /** * Get all links attached to a task * * @access public * @param integer $task_id Task id * @return array */ - public function getLinks($task_id) + public function getAll($task_id) { return $this->db ->table(self::TABLE) @@ -52,48 +70,123 @@ class TaskLink extends Base Task::TABLE.'.title', Task::TABLE.'.is_active', Task::TABLE.'.project_id', + Task::TABLE.'.time_spent AS task_time_spent', + Task::TABLE.'.time_estimated AS task_time_estimated', + Task::TABLE.'.owner_id AS task_assignee_id', + User::TABLE.'.username AS task_assignee_username', + User::TABLE.'.name AS task_assignee_name', Board::TABLE.'.title AS column_title' ) ->eq(self::TABLE.'.task_id', $task_id) ->join(Link::TABLE, 'id', 'link_id') ->join(Task::TABLE, 'id', 'opposite_task_id') ->join(Board::TABLE, 'id', 'column_id', Task::TABLE) + ->join(User::TABLE, 'id', 'owner_id', Task::TABLE) ->orderBy(Link::TABLE.'.id ASC, '.Board::TABLE.'.position ASC, '.Task::TABLE.'.is_active DESC, '.Task::TABLE.'.id', Table::SORT_ASC) ->findAll(); } /** + * Get all links attached to a task grouped by label + * + * @access public + * @param integer $task_id Task id + * @return array + */ + public function getAllGroupedByLabel($task_id) + { + $links = $this->getAll($task_id); + $result = array(); + + foreach ($links as $link) { + + if (! isset($result[$link['label']])) { + $result[$link['label']] = array(); + } + + $result[$link['label']][] = $link; + } + + return $result; + } + + /** * Create a new link * * @access public * @param integer $task_id Task id * @param integer $opposite_task_id Opposite task id * @param integer $link_id Link id - * @return boolean + * @return integer Task link id */ public function create($task_id, $opposite_task_id, $link_id) { $this->db->startTransaction(); - // Create the original link + // Get opposite link + $opposite_link_id = $this->link->getOppositeLinkId($link_id); + + // Create the original task link $this->db->table(self::TABLE)->insert(array( 'task_id' => $task_id, 'opposite_task_id' => $opposite_task_id, 'link_id' => $link_id, )); - $link_id = $this->link->getOppositeLinkId($link_id); + $task_link_id = $this->db->getConnection()->getLastId(); - // Create the opposite link + // Create the opposite task link $this->db->table(self::TABLE)->insert(array( 'task_id' => $opposite_task_id, 'opposite_task_id' => $task_id, + 'link_id' => $opposite_link_id, + )); + + $this->db->closeTransaction(); + + return $task_link_id; + } + + /** + * Update a task link + * + * @access public + * @param integer $task_link_id Task link id + * @param integer $task_id Task id + * @param integer $opposite_task_id Opposite task id + * @param integer $link_id Link id + * @return boolean + */ + public function update($task_link_id, $task_id, $opposite_task_id, $link_id) + { + $this->db->startTransaction(); + + // Get original task link + $task_link = $this->getById($task_link_id); + + // Find opposite task link + $opposite_task_link = $this->getOppositeTaskLink($task_link); + + // Get opposite link + $opposite_link_id = $this->link->getOppositeLinkId($link_id); + + // Update the original task link + $rs1 = $this->db->table(self::TABLE)->eq('id', $task_link_id)->update(array( + 'task_id' => $task_id, + 'opposite_task_id' => $opposite_task_id, 'link_id' => $link_id, )); + // Update the opposite link + $rs2 = $this->db->table(self::TABLE)->eq('id', $opposite_task_link['id'])->update(array( + 'task_id' => $opposite_task_id, + 'opposite_task_id' => $task_id, + 'link_id' => $opposite_link_id, + )); + $this->db->closeTransaction(); - return true; + return $rs1 && $rs2; } /** @@ -124,6 +217,23 @@ class TaskLink extends Base } /** + * Common validation rules + * + * @access private + * @return array + */ + private function commonValidationRules() + { + return array( + new Validators\Required('task_id', t('Field required')), + new Validators\Required('opposite_task_id', t('Field required')), + new Validators\Required('link_id', t('Field required')), + new Validators\NotEquals('opposite_task_id', 'task_id', t('A task cannot be linked to itself')), + new Validators\Exists('opposite_task_id', t('This linked task id doesn\'t exists'), $this->db->getConnection(), Task::TABLE, 'id') + ); + } + + /** * Validate creation * * @access public @@ -132,11 +242,28 @@ class TaskLink extends Base */ public function validateCreation(array $values) { - $v = new Validator($values, array( - new Validators\Required('task_id', t('Field required')), - new Validators\Required('link_id', t('Field required')), - new Validators\Required('title', t('Field required')), - )); + $v = new Validator($values, $this->commonValidationRules()); + + return array( + $v->execute(), + $v->getErrors() + ); + } + + /** + * Validate modification + * + * @access public + * @param array $values Form values + * @return array $valid, $errors [0] = Success or not, [1] = List of errors + */ + public function validateModification(array $values) + { + $rules = array( + new Validators\Required('id', t('Field required')), + ); + + $v = new Validator($values, array_merge($rules, $this->commonValidationRules())); return array( $v->execute(), |
