diff --git a/server/controllers/staff/get-new-tickets.php b/server/controllers/staff/get-new-tickets.php index e9986740..9407ee54 100755 --- a/server/controllers/staff/get-new-tickets.php +++ b/server/controllers/staff/get-new-tickets.php @@ -32,7 +32,7 @@ class GetNewTicketsStaffController extends Controller { public function validations() { return[ - 'permission' => 'staff_1', + 'permission' => 'any', 'requestData' => [ 'page' => [ 'validation' => DataValidator::numeric(), diff --git a/server/controllers/ticket.php b/server/controllers/ticket.php index 5afbf8d5..e60c253e 100755 --- a/server/controllers/ticket.php +++ b/server/controllers/ticket.php @@ -23,5 +23,6 @@ $ticketControllers->addController(new DeleteTagController); $ticketControllers->addController(new GetTagsController); $ticketControllers->addController(new AddTagController); $ticketControllers->addController(new RemoveTagController); +$ticketControllers->addController(new SearchController); $ticketControllers->finalize(); diff --git a/server/controllers/ticket/search.php b/server/controllers/ticket/search.php new file mode 100644 index 00000000..b4c86a08 --- /dev/null +++ b/server/controllers/ticket/search.php @@ -0,0 +1,290 @@ + 'any', + 'requestData' => [ + 'page' => [ + 'validation' => DataValidator::oneOf(DataValidator::numeric()->positive(),DataValidator::nullType()), + 'error' => ERRORS::INVALID_PAGE + ], + 'tags' => [ + 'validation' => DataValidator::oneOf(DataValidator::validTagsId(),DataValidator::nullType()), + 'error' => ERRORS::INVALID_TAG_FILTER + ], + 'closed' => [ + 'validation' => DataValidator::oneOf(DataValidator::in(['0','1']),DataValidator::nullType()), + 'error' => ERRORS::INVALID_CLOSED_FILTER + ], + 'unreadStaff' => [ + 'validation' => DataValidator::oneOf(DataValidator::in(['0','1']),DataValidator::nullType()), + 'error' => ERRORS::INVALID_UNREAD_STAFF_FILTER + ], + 'priority' => [ + 'validation' => DataValidator::oneOf(DataValidator::validPrioritys(),DataValidator::nullType()), + 'error' => ERRORS::INVALID_PRIORITY_FILTER + ], + 'dateRange' => [ + 'validation' => DataValidator::oneOf(DataValidator::validDateRange(),DataValidator::nullType()), + 'error' => ERRORS::INVALID_DATE_RANGE_FILTER + ], + 'departments' => [ + 'validation' => DataValidator::oneOf(DataValidator::validDepartmentsId(),DataValidator::nullType()), + 'error' => ERRORS::INVALID_DEPARTMENT_FILTER + ], + 'authors' => [ + 'validation' => DataValidator::oneOf(DataValidator::validAuthorsId(),DataValidator::nullType()), + 'error' => ERRORS::INVALID_AUTHOR_FILTER + ], + 'assigned' => [ + 'validation' => DataValidator::oneOf(DataValidator::in(['0','1']),DataValidator::nullType()), + 'error' => ERRORS::INVALID_ASSIGNED_FILTER + ], + 'orderBy' => [ + 'validation' => DataValidator::oneOf(DataValidator::ValidOrderBy(),DataValidator::nullType()), + 'error' => ERRORS::INVALID_ORDER_BY + ], + ] + ]; + } + + public function handler() { + $query = "FROM (ticket LEFT JOIN tag_ticket ON tag_ticket.ticket_id = ticket.id LEFT JOIN ticketevent ON ticketevent.ticket_id = ticket.id)"; + $filters = ""; + $order = ""; + Controller::request("page") ? $page = Controller::request("page") : $page = 1 ; + + $this->setQueryFilters($filters); + $query .= $filters . " GROUP BY ticket.id"; + + $totalCount = RedBean::getAll("SELECT COUNT(*) FROM (SELECT COUNT(*) " . $query . " ) AS T2")[0]['COUNT(*)']; + error_log(print_r("SELECT COUNT(*) FROM (SELECT COUNT(*) " . $query . " ) AS T2", true)); + error_log(print_r($totalCount, true)); + + $query = "SELECT ticket.id,ticket.title,ticket.ticket_number,ticket.content ,ticketevent.content " . $query; + + $this->setQueryOrder($order); + $query .= $order ." LIMIT 10 OFFSET " . (($page-1)*10); + + $ticketList = RedBean::getAll($query); + + Response::respondSuccess([ + 'tickets' => $ticketList, + 'pages' => ceil($totalCount / 10), + 'page' => Controller::request('page') + ]); + + } + //FILTER + private function setQueryFilters(&$filters){ + $this->setTagFilter($filters); + $this->setClosedFilter($filters); + $this->setAssignedFilter($filters); + $this->setSeenFilter($filters); + $this->setPriorityFilter($filters); + $this->setDateFilter($filters); + $this->setDepartmentFilter($filters); + $this->setAuthorFilter($filters); + $this->setStringFilter($filters); + + if($filters != "") $filters = " WHERE " . $filters; + } + + private function setTagFilter(&$filters){ + $tagList = json_decode(Controller::request('tags')); + + if($tagList){ + $filters != "" ? $filters .= " and " : null; + + foreach($tagList as $key => $tag) { + + $key == 0 ? $filters .= " ( " : null; + ($key != 0 && $key != sizeof($tagList)) ? $filters .= " or " : null; + + $filters .= "tag_ticket.tag_id = " . $tag ; + } + $filters .= ")"; + } + } + private function setClosedFilter(&$filters){ + $closed = Controller::request('closed'); + + if ($closed != null) { + if ($filters != "") $filters .= " and "; + $filters .= "ticket.closed = " . $closed ; + } + } + private function setSeenFilter(&$filters){ + $unreadStaff = Controller::request('unreadStaff'); + if ($unreadStaff != null) { + if ($filters != "") $filters .= " and "; + $filters .= "ticket.unread_staff = " . $unreadStaff; + } + } + private function setPriorityFilter(&$filters){ + $prioritys = json_decode(Controller::request('priority')); + if($prioritys != null){ + if ($filters != "") $filters .= " and "; + foreach(array_unique($prioritys) as $key => $priority) { + + $key == 0 ? $filters .= " ( " : null; + ($key != 0 && $key != sizeof($prioritys)) ? $filters .= " or " : null; + + if($priority == 0){ + $filters .= "ticket.priority = " . "'low'"; + }elseif($priority == 1){ + $filters .= "ticket.priority = " . "'medium'"; + }elseif($priority == 2){ + $filters .= "ticket.priority = " . "'high'"; + } + + $key == sizeof($prioritys) ? $filters .= " ) " : null ; + } + $prioritys != "" ? $filters .= ") " : null; + } + } + + private function setDateFilter(&$filters){ + $dateRange = json_decode(Controller::request('dateRange')); + if ($dateRange != null) { + if ($filters != "") $filters .= " and "; + + foreach($dateRange as $key => $date) { + $key == 0 ? ($filters .= "(ticket.date >= " . $date ): ($filters .= " and ticket.date <= " . $date . ")"); + } + } + } + + private function setDepartmentFilter(&$filters){ + + $departments = json_decode(Controller::request('departments')); + + if($departments != null){ + if ($filters != "") $filters .= " and "; + + foreach($departments as $key => $department) { + + $key == 0 ? $filters .= " ( " : null; + ($key != 0 && $key != sizeof($departments)) ? $filters .= " or " : null; + + $filters .= "ticket.department_id = " . $department ; + } + $filters .= ")"; + } + } + + private function setAuthorFilter(&$filters){ + $authors = json_decode(Controller::request('authors')); + + if($authors != null){ + + if ($filters != "") $filters .= " and "; + + foreach($authors as $key => $author){ + + $key == 0 ? $filters .= " ( " : null; + ($key != 0 && $key != sizeof($authors)) ? $filters .= " or " : null; + + if($author->staff){ + $filters .= "ticket.author_staff_id = " . $author->id; + } else { + $filters .= "ticket.author_id = " . $author->id; + } + } + + $filters .= ")"; + + } + } + + private function setAssignedFilter(&$filters){ + $assigned = Controller::request('assigned'); + if($assigned != null){ + if ($filters != "") $filters .= " and "; + $key = ""; + $assigned == 0 ? $key = "IS NULL" : $key = "IS NOT NULL"; + $filters .= "ticket.owner_id " . $key; + } + } + + private function setStringFilter(&$filters){ + $string = Controller::request('query'); + if($string != null){ + if ($filters != "") $filters .= " and "; + $filters .= " (ticket.title LIKE '%" . $string . "%' or ticket.content LIKE '%" . $string . "%' or ticket.ticket_number LIKE '%" . $string . "%' or (ticketevent.type = 'COMMENT' and ticketevent.content LIKE '%" . $string ."%'))"; + }; + } + + //ORDER + private function setQueryOrder(&$order){ + $order = " ORDER BY "; + $this->setStringOrder($order); + $this->setEspecificOrder($order); + $order .= "ticket.closed asc, ticket.owner_id asc, ticket.unread_staff asc, ticket.priority desc, ticket.date desc "; + } + private function setEspecificOrder(&$order){ + $orderBy = json_decode(Controller::request('orderBy')); + if($orderBy != null){ + $orientation = ($orderBy->asc ? " asc" : " desc" ); + $order .= "ticket." . $orderBy->value . $orientation . ","; + }; + } + private function setStringOrder(&$order){ + $string = Controller::request('query'); + if($string != null){ + $order .= "CASE WHEN (ticket.ticket_number LIKE '%" . $string ."%') THEN ticket.ticket_number END desc,CASE WHEN (ticket.title LIKE '%" . $string ."%') THEN ticket.title END desc, CASE WHEN ( ticket.content LIKE '%" . $string ."%') THEN ticket.content END desc, CASE WHEN (ticketevent.type = 'COMMENT' and ticketevent.content LIKE '%".$string."%') THEN ticketevent.content END desc," ; + } + } + +} + diff --git a/server/data/ERRORS.php b/server/data/ERRORS.php index 831086a9..2e56b685 100755 --- a/server/data/ERRORS.php +++ b/server/data/ERRORS.php @@ -277,6 +277,15 @@ class ERRORS { const INVALID_PRIORITY = 'INVALID_PRIORITY'; const INVALID_PAGE = 'INVALID_PAGE'; const INVALID_QUERY = 'INVALID_QUERY'; + const INVALID_TAG_FILTER = 'INVALID_TAG_FILTER'; + const INVALID_CLOSED_FILTER = 'INVALID_CLOSED_FILTER'; + const INVALID_UNREAD_STAFF_FILTER = 'INVALID_UNREAD_STAFF_FILTER'; + const INVALID_PRIORITY_FILTER = 'INVALID_PRIORITY_FILTER'; + const INVALID_DATE_RANGE_FILTER = 'INVALID_DATE_RANGE_FILTER'; + const INVALID_DEPARTMENT_FILTER = 'INVALID_DEPARTMENT_FILTER'; + const INVALID_AUTHOR_FILTER = 'INVALID_AUTHOR_FILTER'; + const INVALID_ASSIGNED_FILTER = 'INVALID_ASSIGNED_FILTER'; + const INVALID_ORDER_BY = 'INVALID_ORDER_BY'; const INVALID_TOPIC = 'INVALID_TOPIC'; const INVALID_SEARCH = 'INVALID_SEARCH'; const INVALID_ORDER = 'INVALID_ORDER'; diff --git a/server/libs/validations/validAuthorsId.php b/server/libs/validations/validAuthorsId.php new file mode 100644 index 00000000..3cda8229 --- /dev/null +++ b/server/libs/validations/validAuthorsId.php @@ -0,0 +1,23 @@ +staff){ + $author = \Staff::getDataStore($authorObject->id); + }else{ + $author = \User::getDataStore($authorObject->id); + } + if($author->isNull()) return false; + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/server/libs/validations/validDateRange.php b/server/libs/validations/validDateRange.php new file mode 100644 index 00000000..05f6a3c2 --- /dev/null +++ b/server/libs/validations/validDateRange.php @@ -0,0 +1,21 @@ +isNull()) return false; + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/server/libs/validations/validOrderBy.php b/server/libs/validations/validOrderBy.php new file mode 100644 index 00000000..4fed26c1 --- /dev/null +++ b/server/libs/validations/validOrderBy.php @@ -0,0 +1,22 @@ +asc !== true && $object->asc !== false) return false; + + foreach ($values as $value) { + if($object->value == $value) $isTrue = true; + } + return $isTrue; + } + } +} \ No newline at end of file diff --git a/server/libs/validations/validPrioritys.php b/server/libs/validations/validPrioritys.php new file mode 100644 index 00000000..53bf9505 --- /dev/null +++ b/server/libs/validations/validPrioritys.php @@ -0,0 +1,19 @@ +isNull()) return false; + } + return true; + } + return false; + } +} \ No newline at end of file