model = $model; } /** * @param SessionHandle $session * @return ViewHttpResponse the team creation panel */ public function displayCreateTeam(SessionHandle $session): ViewHttpResponse { return ViewHttpResponse::twig("insert_team.html.twig", []); } /** * @param SessionHandle $session * @return ViewHttpResponse the team panel to delete a member */ public function displayDeleteMember(SessionHandle $session): ViewHttpResponse { return ViewHttpResponse::twig("delete_member.html.twig", []); } /** * create a new team from given request name, mainColor, secondColor and picture url * @param array $request * @param SessionHandle $session * @return HttpResponse */ public function submitTeam(array $request, SessionHandle $session): HttpResponse { $failures = []; $request = HttpRequest::from($request, $failures, [ "name" => [DefaultValidators::lenBetween(1, 32), DefaultValidators::nameWithSpaces()], "main_color" => [DefaultValidators::hexColor()], "second_color" => [DefaultValidators::hexColor()], "picture" => [DefaultValidators::isURL()], ]); if (!empty($failures)) { $badFields = []; foreach ($failures as $e) { if ($e instanceof FieldValidationFail) { $badFields[] = $e->getFieldName(); } } return ViewHttpResponse::twig('insert_team.html.twig', ['bad_fields' => $badFields]); } $teamId = $this->model->createTeam($request['name'], $request['picture'], $request['main_color'], $request['second_color']); $this->model->addMember($session->getAccount()->getUser()->getEmail(), $teamId, 'COACH'); return HttpResponse::redirect('/team/' . $teamId); } /** * @param SessionHandle $session * @return ViewHttpResponse the panel to search a team by its name */ public function displayListTeamByName(SessionHandle $session): ViewHttpResponse { return ViewHttpResponse::twig("list_team_by_name.html.twig", []); } /** * returns a view that contains all the teams description whose name matches the given name needle. * @param array $request * @param SessionHandle $session * @return HttpResponse */ public function listTeamByName(array $request, SessionHandle $session): HttpResponse { $errors = []; $request = HttpRequest::from($request, $errors, [ "name" => [DefaultValidators::lenBetween(1, 32), DefaultValidators::nameWithSpaces()], ]); if (!empty($errors) && $errors[0] instanceof FieldValidationFail) { $badField = $errors[0]->getFieldName(); return ViewHttpResponse::twig('list_team_by_name.html.twig', ['bad_field' => $badField]); } $teams = $this->model->listByName($request['name'], $session->getAccount()->getUser()->getId()); if (empty($teams)) { return ViewHttpResponse::twig('display_teams.html.twig', []); } return ViewHttpResponse::twig('display_teams.html.twig', ['teams' => $teams]); } /** * Delete a team with its id * @param int $id * @param SessionHandle $session * @return HttpResponse */ public function deleteTeamById(int $id, SessionHandle $session): HttpResponse { $a = $session->getAccount(); $ret = $this->model->deleteTeam($a->getUser()->getEmail(), $id); if($ret != 0) { return ViewHttpResponse::twig('display_team.html.twig', ['notDeleted' => true]); } return HttpResponse::redirect('/'); } /** * Display a team with its id * @param int $id * @param SessionHandle $session * @return ViewHttpResponse a view that displays given team information */ public function displayTeam(int $id, SessionHandle $session): ViewHttpResponse { $result = $this->model->getTeam($id, $session->getAccount()->getUser()->getId()); if($result == null) { return ViewHttpResponse::twig('error.html.twig', [ 'failures' => [ValidationFail::unauthorized("Vous n'avez pas accès à cette équipe.")], ], HttpCodes::FORBIDDEN); } $role = $this->model->isCoach($id, $session->getAccount()->getUser()->getEmail()); return ViewHttpResponse::react( 'views/TeamPanel.tsx', [ 'team' => [ "info" => $result->getInfo(), "members" => $result->listMembers(), ], 'isCoach' => $role, 'currentUserId' => $session->getAccount()->getUser()->getId()] ); } /** * @param int $idTeam * @param SessionHandle $session * @return ViewHttpResponse the team panel to add a member */ public function displayAddMember(int $idTeam, SessionHandle $session): ViewHttpResponse { return ViewHttpResponse::twig("add_member.html.twig", ['idTeam' => $idTeam]); } /** * add a member to a team * @param int $idTeam * @param array $request * @param SessionHandle $session * @return HttpResponse */ public function addMember(int $idTeam, array $request, SessionHandle $session): HttpResponse { $errors = []; if(!$this->model->isCoach($idTeam, $session->getAccount()->getUser()->getEmail())) { return ViewHttpResponse::twig('error.html.twig', [ 'failures' => [ValidationFail::unauthorized("Vous n'avez pas accès à cette action pour cette équipe.")], ], HttpCodes::FORBIDDEN); } $request = HttpRequest::from($request, $errors, [ "email" => [DefaultValidators::email(), DefaultValidators::lenBetween(5, 256)], ]); if(!empty($errors)) { return ViewHttpResponse::twig('add_member.html.twig', ['badEmail' => true,'idTeam' => $idTeam]); } $ret = $this->model->addMember($request['email'], $idTeam, $request['role']); switch($ret) { case -1: return ViewHttpResponse::twig('add_member.html.twig', ['notFound' => true,'idTeam' => $idTeam]); case -2: return ViewHttpResponse::twig('add_member.html.twig', ['alreadyExisting' => true,'idTeam' => $idTeam]); default: return HttpResponse::redirect('/team/' . $idTeam); } } /** * remove a member from a team with their ids * @param int $idTeam * @param int $idMember * @param SessionHandle $session * @return HttpResponse */ public function deleteMember(int $idTeam, int $idMember, SessionHandle $session): HttpResponse { if(!$this->model->isCoach($idTeam, $session->getAccount()->getUser()->getEmail())) { return ViewHttpResponse::twig('error.html.twig', [ 'failures' => [ValidationFail::unauthorized("Vous n'avez pas accès à cette action pour cette équipe.")], ], HttpCodes::FORBIDDEN); } $teamId = $this->model->deleteMember($idMember, $idTeam); if($teamId == -1 || $session->getAccount()->getUser()->getId() == $idMember) { return HttpResponse::redirect('/'); } return $this->displayTeam($teamId, $session); } /** * @param int $idTeam * @param SessionHandle $session * @return ViewHttpResponse */ public function displayEditTeam(int $idTeam, SessionHandle $session): ViewHttpResponse { return ViewHttpResponse::twig("edit_team.html.twig", ['team' => $this->model->getTeam($idTeam, $session->getAccount()->getUser()->getId())]); } /** * @param int $idTeam * @param array $request * @param SessionHandle $session * @return HttpResponse */ public function editTeam(int $idTeam, array $request, SessionHandle $session): HttpResponse { if(!$this->model->isCoach($idTeam, $session->getAccount()->getUser()->getEmail())) { return ViewHttpResponse::twig('error.html.twig', [ 'failures' => [ValidationFail::unauthorized("Vous n'avez pas accès à cette action pour cette équipe.")], ], HttpCodes::FORBIDDEN); } $failures = []; $request = HttpRequest::from($request, $failures, [ "name" => [DefaultValidators::lenBetween(1, 32), DefaultValidators::nameWithSpaces()], "main_color" => [DefaultValidators::hexColor()], "second_color" => [DefaultValidators::hexColor()], "picture" => [DefaultValidators::isURL()], ]); if (!empty($failures)) { $badFields = []; foreach ($failures as $e) { if ($e instanceof FieldValidationFail) { $badFields[] = $e->getFieldName(); } } return ViewHttpResponse::twig('edit_team.html.twig', ['bad_fields' => $badFields]); } $this->model->editTeam($idTeam, $request['name'], $request['picture'], $request['main_color'], $request['second_color']); return HttpResponse::redirect('/team/' . $idTeam); } }