company_repository = new SapphireICLACompanyRepository; $this->member_repository = new SapphireCLAMemberRepository; $this->invitation_repository = new SapphireTeamInvitationRepository; $this->company_manager = new CCLACompanyService($this->company_repository, SapphireTransactionManager::getInstance()); $this->team_manager = new CCLATeamManager( $this->invitation_repository, $this->member_repository, new TeamInvitationFactory, new TeamFactory, new CCLAValidatorFactory, new SapphireTeamRepository, SapphireTransactionManager::getInstance()); //filters... $this_var = $this; $this->addBeforeFilter('signCompanyCCLA','check_sign',function ($request) use($this_var){ if(!Permission::check("SANGRIA_ACCESS")) return $this_var->permissionFailure(); }); $this->addBeforeFilter('unsignCompanyCCLA','check_unsign',function ($request) use($this_var){ if(!Permission::check("SANGRIA_ACCESS")) return $this_var->permissionFailure(); }); $this->addBeforeFilter('searchCCLAMembers','check_members_search',function() use($this_var){ return $this_var->checkCCLAdmin(); }); $this->addBeforeFilter('addInvitation','check_add_invitation',function() use($this_var){ return $this_var->checkCCLAdmin(); }); $this->addBeforeFilter('deleteInvitation','check_delete_invitation',function() use($this_var){ return $this_var->checkCCLAdmin(); }); } /** * @return SS_HTTPResponse */ public function checkCCLAdmin(){ $member = Member::currentUser(); if(!$member) return $this->permissionFailure(); if(!$member->isCCLAAdmin()) return $this->permissionFailure(); } const ApiPrefix = 'api/v1/ccla'; protected function isApiCall() { $request = $this->getRequest(); if(is_null($request)) return false; return strpos(strtolower($request->getURL()),self::ApiPrefix) !== false; } /** * @return bool */ protected function authorize() { return true; return; } /** * @var array */ static $url_handlers = array( 'PUT companies/$COMPANY_ID/sign' => 'signCompanyCCLA', 'DELETE companies/$COMPANY_ID/sign' => 'unsignCompanyCCLA', 'GET members' => 'searchCCLAMembers', 'POST invitations' => 'addInvitation', 'DELETE teams/$TEAM_ID/memberships/$ID/$STATUS' => 'resignMembership', 'POST teams' => 'addTeam', 'DELETE teams/$TEAM_ID' => 'deleteTeam', 'PUT teams/$TEAM_ID' => 'updateTeamName', ); /** * @var array */ static $allowed_actions = array( 'signCompanyCCLA', 'unsignCompanyCCLA', 'searchCCLAMembers', 'addInvitation', 'resignMembership', 'confirmTeamInvitation', 'addTeam', 'deleteTeam', 'updateTeamName', ); public function addInvitation(){ $data = $this->getJsonRequest(); try{ $entity = $this->team_manager->sendInvitation($data, new TeamInvitationEmailSender($this->invitation_repository)); return $this->created($entity->getIdentifier()); } catch(NotFoundEntityException $ex1){ SS_Log::log($ex1,SS_Log::NOTICE); return $this->notFound($ex1->getMessage()); } catch(EntityValidationException $ex2){ SS_Log::log($ex2,SS_Log::NOTICE); return $this->validationError($ex2->getMessages()); } catch(TeamMemberAlreadyExistsException $ex3){ SS_Log::log($ex3,SS_Log::NOTICE); return $this->validationError(array( array('attribute'=>'error', 'message' => $ex3->getMessage()))); } catch(MemberNotSignedCCLAException $ex4){ SS_Log::log($ex4,SS_Log::NOTICE); return $this->validationError(array( array('attribute'=>'error', 'message' => $ex4->getMessage()))); } catch(Exception $ex){ SS_Log::log($ex,SS_Log::ERR); return $this->serverError(); } if (!$data) return $this->serverError(); } public function resignMembership(){ $id = (int)$this->request->param('ID'); $team_id = (int)$this->request->param('TEAM_ID'); $status = $this->request->param('STATUS'); try{ $this->team_manager->resignMembership($team_id, $id, $status); return $this->deleted(); } catch(NotFoundEntityException $ex1){ SS_Log::log($ex1,SS_Log::NOTICE); return $this->notFound($ex1->getMessage()); } catch(Exception $ex){ SS_Log::log($ex,SS_Log::ERR); return $this->serverError(); } } public function signCompanyCCLA(){ $company_id = (int)$this->request->param('COMPANY_ID'); try{ $res = $this->company_manager->signCCLA($company_id); return $this->ok(array('sign_date' => $res)); } catch(NotFoundEntityException $ex1){ SS_Log::log($ex1,SS_Log::NOTICE); return $this->notFound($ex1->getMessage()); } catch(Exception $ex){ SS_Log::log($ex,SS_Log::ERR); return $this->serverError(); } } public function unsignCompanyCCLA(){ $company_id = (int)$this->request->param('COMPANY_ID'); try{ $this->company_manager->unsignCCLA($company_id); return $this->ok(); } catch(NotFoundEntityException $ex1){ SS_Log::log($ex1,SS_Log::NOTICE); return $this->notFound($ex1->getMessage()); } catch(Exception $ex){ SS_Log::log($ex,SS_Log::ERR); return $this->serverError(); } } public function searchCCLAMembers(){ $params = $this->request->getVars(); $field = $params['field']; $term = $params['term']; try{ $res = array(); switch($field){ case 'email': list($list, $size) = $this->member_repository->getAllIClaMembersByEmail($term,0,25); break; case 'fname': list($list, $size) = $this->member_repository->getAllIClaMembersByFirstName($term,0,25); break; case 'lname': list($list, $size) = $this->member_repository->getAllIClaMembersByLastName($term,0,25); break; default: return $this->validationError('criteria not supported!'); break; } foreach($list as $member){ $label = sprintf('%s - (%s) - %s',$member->getFullName(), $member->Email, $member->LastVisited); array_push($res, array( 'label' => $label, 'value' => $member->getIdentifier(), 'email' => $member->Email, 'first_name' => $member->FirstName, 'last_name' => $member->Surname)); } return $this->ok($res); } catch(NotFoundEntityException $ex1){ SS_Log::log($ex1,SS_Log::NOTICE); return $this->notFound($ex1->getMessage()); } catch(Exception $ex){ SS_Log::log($ex,SS_Log::ERR); return $this->serverError(); } } //Teams public function addTeam(){ $data = $this->getJsonRequest(); if (!$data) return $this->serverError(); try{ $entity = $this->team_manager->registerTeam($data); return $this->created($entity->getIdentifier()); } catch(TeamAlreadyExistsException $ex1){ SS_Log::log($ex1,SS_Log::NOTICE); return $this->validationError(array( array('attribute'=>'error', 'message' => 'Team Already exist on Company!'))); } catch(EntityValidationException $ex2){ SS_Log::log($ex2,SS_Log::NOTICE); return $this->validationError($ex2->getMessages()); } catch(Exception $ex){ SS_Log::log($ex,SS_Log::ERR); return $this->serverError(); } } public function updateTeamName(){ $data = $this->getJsonRequest(); if (!$data) return $this->serverError(); $team_id = (int)$this->request->param('TEAM_ID'); try{ $this->team_manager->updateTeam($team_id, $data); return $this->updated(); } catch(TeamAlreadyExistsException $ex1){ SS_Log::log($ex1,SS_Log::NOTICE); return $this->validationError(array( array('attribute'=>'error', 'message' => 'Team Already exist on Company!'))); } catch(EntityValidationException $ex2){ SS_Log::log($ex2,SS_Log::NOTICE); return $this->validationError($ex2->getMessages()); } catch(NotFoundEntityException $ex3){ SS_Log::log($ex3,SS_Log::NOTICE); return $this->validationError(array( array('attribute'=>'error', 'message' => 'Team does not exist on Company!'))); } catch(Exception $ex){ SS_Log::log($ex,SS_Log::ERR); return $this->serverError(); } } public function deleteTeam(){ $team_id = (int)$this->request->param('TEAM_ID'); try{ $this->team_manager->removeTeam($team_id); return $this->deleted(); } catch(EntityValidationException $ex2){ SS_Log::log($ex2,SS_Log::NOTICE); return $this->validationError($ex2->getMessages()); } catch(NotFoundEntityException $ex3){ SS_Log::log($ex3,SS_Log::NOTICE); return $this->validationError(array( array('attribute'=>'error', 'message' => 'Team does not exist on Company!'))); } catch(Exception $ex){ SS_Log::log($ex,SS_Log::ERR); return $this->serverError(); } } }