File size: 3,113 Bytes
e4f4821 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
<?php
namespace Kanboard\Filter;
use Kanboard\Core\Filter\FilterInterface;
use Kanboard\Model\SubtaskModel;
use Kanboard\Model\TaskModel;
use Kanboard\Model\UserModel;
use PicoDb\Database;
use PicoDb\Table;
/**
* Filter tasks by subtasks assignee
*
* @package filter
* @author Frederic Guillot
*/
class TaskSubtaskAssigneeFilter extends BaseFilter implements FilterInterface
{
/**
* Database object
*
* @access private
* @var Database
*/
private $db;
/**
* Current user id
*
* @access private
* @var int
*/
private $currentUserId = 0;
/**
* Set current user id
*
* @access public
* @param integer $userId
* @return TaskSubtaskAssigneeFilter
*/
public function setCurrentUserId($userId)
{
$this->currentUserId = $userId;
return $this;
}
/**
* Set database object
*
* @access public
* @param Database $db
* @return TaskSubtaskAssigneeFilter
*/
public function setDatabase(Database $db)
{
$this->db = $db;
return $this;
}
/**
* Get search attribute
*
* @access public
* @return string[]
*/
public function getAttributes()
{
return array('subtask:assignee');
}
/**
* Apply filter
*
* @access public
* @return string
*/
public function apply()
{
$this->query->inSubquery(TaskModel::TABLE.'.id', $this->getSubQuery());
}
/**
* Get subquery
*
* @access protected
* @return Table
*/
protected function getSubQuery()
{
$subquery = $this->db->table(SubtaskModel::TABLE)
->columns(SubtaskModel::TABLE.'.task_id')
->join(UserModel::TABLE, 'id', 'user_id', SubtaskModel::TABLE)
->neq(SubtaskModel::TABLE.'.status', SubtaskModel::STATUS_DONE);
return $this->applySubQueryFilter($subquery);
}
/**
* Apply subquery filter
*
* @access protected
* @param Table $subquery
* @return Table
*/
protected function applySubQueryFilter(Table $subquery)
{
if (is_int($this->value) || ctype_digit((string) $this->value)) {
$subquery->eq(SubtaskModel::TABLE.'.user_id', $this->value);
} else {
switch ($this->value) {
case 'me':
$subquery->eq(SubtaskModel::TABLE.'.user_id', $this->currentUserId);
break;
case 'nobody':
$subquery->eq(SubtaskModel::TABLE.'.user_id', 0);
break;
case 'anybody':
$subquery->gt(SubtaskModel::TABLE.'.user_id', 0);
break;
default:
$subquery->beginOr();
$subquery->ilike(UserModel::TABLE.'.username', $this->value.'%');
$subquery->ilike(UserModel::TABLE.'.name', '%'.$this->value.'%');
$subquery->closeOr();
}
}
return $subquery;
}
}
|