/** * Retrieve a specific employee or search for employees based on given criteria * GET /api/employee/:netId OR GET /api/employee?firstName=x&lastName=y&netId=z&fullTime=1&active=0&area=4 * * If a netId is given, the get data is ignored and the employee who matches * the given netId will be returned * If netId is omitted a search is performed. The following parameters can be given: * firstName string * lastName string * netId string * fullTime 0/1 * active -1/0/1 * area (int) * * The parameters firstName, lastName and netId match any employee where the given * fields contain the supplied search string. (i.e. firstName=m matches any employee with m in their first name) * The parameters fullTime, active, and area must be exact matches * (i.e. fullTime=1 will only retrieve fullTime employees) * * returns: * { * Status: OK/failed, * data: { * netID: "", * active: -1/0/1, * area: int, * firstName: "", * lastName: "", * maidenName: "", * phone: "", * email: "", * chqId: "", * birthday: "", * languages: "", * hometown: "", * major: "", * mission: "", * graduation: "", * position: int, * shift: "", * supervisor: "", * hireDate: "", * certification: "", * international: 0/1, * byuId: "", * fullTime: 0/1 * } * } */ public function get($params) { $this->requireAuthentication(); $single = isset($params['url'][2]) ? true : false; $employeeAccessor = new \TMT\accessor\Employee(); $areaAccessor = new \TMT\accessor\AreaAccessor(); $userAreas = $areaAccessor->getAll($this->user['netId']); // Respond for single employee if ($single) { $netId = $params['url'][2]; $employeeAreas = $areaAccessor->getAll($netId); // Determine if both employees have rights to an area in common $overlap = false; foreach ($employeeAreas as $eArea) { foreach ($userAreas as $uArea) { if ($uArea->ID === $eArea->ID) { $overlap = true; break; } } if ($overlap) { break; } } if (!$overlap) { $this->error("You do not have rights to see this employee's data"); return; } $employee = $employeeAccessor->get($netId); $this->respond($employee); return; } // Respond if it is a search $search = $params['request']; unset($search['url']); $employees = $employeeAccessor->search($search); $results = array(); // Filter results to only return employees who have access to an area in common with the user for ($i = 0; $i < count($employees); $i++) { $employeeAreas = $areaAccessor->getAll($employees[$i]->netID); $overlap = false; foreach ($employeeAreas as $eArea) { foreach ($userAreas as $uArea) { if ($uArea->ID === $eArea->ID) { $overlap = true; $results[] = $employees[$i]; break; } } if ($overlap) { break; } } } $this->respond($results); }
/** * @covers ::search */ public function testSearch() { $accessor = new \TMT\accessor\Employee(); $employees = $accessor->search(); $this->assertEquals(0, count($employees)); $employees = $accessor->search(array()); $this->assertEquals(0, count($employees)); $employees = $accessor->search(array('something' => "L")); $this->assertEquals(0, count($employees)); $employees = $accessor->search(array('lastName' => "l")); $this->assertEquals(3, count($employees)); $employees = $accessor->search(array('firstName' => "f")); $this->assertEquals(2, count($employees)); $employees = $accessor->search(array('firstName' => "f", 'lastName' => 'o')); $this->assertEquals(4, count($employees)); $employees = $accessor->search(array('firstName' => "f", 'lastName' => 'o', 'area' => 1)); $this->assertEquals(1, count($employees)); $this->assertEquals("netId", $employees[0]->netID); $employees = $accessor->search(array('firstName' => "f", 'lastName' => 'o', 'active' => 1)); $this->assertEquals(2, count($employees)); $employees = $accessor->search(array('netId' => "e")); $this->assertEquals(4, count($employees)); $employees = $accessor->search(array('netId' => "e", 'area' => 4)); $this->assertEquals(0, count($employees)); $employees = $accessor->search(array('netId' => "e", 'fullTime' => 1)); $this->assertEquals(2, count($employees)); $employees = $accessor->search(array('active' => 1, 'area' => 1, 'fullTime' => 0)); $this->assertEquals(1, count($employees)); $this->assertEquals($employees[0]->netID, "netId"); $employees = $accessor->search(array('active' => 1, 'area' => 2, 'fullTime' => 1)); $this->assertEquals(1, count($employees)); $this->assertEquals("other", $employees[0]->netID); $employees = $accessor->search(array('firstName' => 'e', 'lastName' => 'e', 'netId' => 'e', 'active' => 0, 'area' => 2, 'fullTime' => 1)); $this->assertEquals(1, count($employees)); $this->assertEquals("employee2", $employees[0]->netID); $employees = $accessor->search(array('firstName' => 'e', 'lastName' => 'e', 'netId' => 'e')); $this->assertEquals(4, count($employees)); $employees = $accessor->search(array('firstName' => 'emp', 'lastName' => 'emp', 'netId' => 'emp')); $this->assertEquals(1, count($employees)); $this->assertEquals("employee2", $employees[0]->netID); }