You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
4.4 KiB
126 lines
4.4 KiB
<?php
|
|
|
|
namespace IQBall\App\Controller;
|
|
|
|
use IQBall\Core\Http\HttpRequest;
|
|
use IQBall\Core\Http\HttpResponse;
|
|
use IQBall\Core\Http\ViewHttpResponse;
|
|
use IQBall\Core\Model\TeamModel;
|
|
use IQBall\Core\Session\SessionHandle;
|
|
use IQBall\Core\Validation\FieldValidationFail;
|
|
use IQBall\Core\Validation\Validators;
|
|
|
|
class TeamController {
|
|
private TeamModel $model;
|
|
|
|
/**
|
|
* @param TeamModel $model
|
|
*/
|
|
public function __construct(TeamModel $model) {
|
|
$this->model = $model;
|
|
}
|
|
|
|
public function displayCreateTeam(SessionHandle $session): HttpResponse {
|
|
return ViewHttpResponse::twig("insert_team.html.twig", []);
|
|
}
|
|
|
|
|
|
public function displayAddMember(SessionHandle $session): HttpResponse {
|
|
return ViewHttpResponse::twig("add_member.html.twig", []);
|
|
}
|
|
|
|
public function displayDeleteMember(SessionHandle $session): HttpResponse {
|
|
return ViewHttpResponse::twig("delete_member.html.twig", []);
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $request
|
|
* @param SessionHandle $session
|
|
* @return HttpResponse
|
|
*/
|
|
public function submitTeam(array $request, SessionHandle $session): HttpResponse {
|
|
$failures = [];
|
|
$request = HttpRequest::from($request, $failures, [
|
|
"name" => [Validators::lenBetween(1, 32), Validators::nameWithSpaces()],
|
|
"mainColor" => [Validators::regex('/#(?:[0-9a-fA-F]{6})/')],
|
|
"secondColor" => [Validators::regex('/#(?:[0-9a-fA-F]{6})/')],
|
|
"picture" => [Validators::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]);
|
|
}
|
|
return $this->displayTeam($this->model->createTeam($request['name'], $request['picture'], $request['mainColor'], $request['secondColor']), $session);
|
|
}
|
|
|
|
public function displayListTeamByName(SessionHandle $session): HttpResponse {
|
|
return ViewHttpResponse::twig("list_team_by_name.html.twig", []);
|
|
}
|
|
|
|
/**
|
|
* @param array<string , mixed> $request
|
|
* @return HttpResponse
|
|
*/
|
|
public function listTeamByName(array $request, SessionHandle $session): HttpResponse {
|
|
$errors = [];
|
|
$request = HttpRequest::from($request, $errors, [
|
|
"name" => [Validators::lenBetween(1, 32), Validators::nameWithSpaces()],
|
|
]);
|
|
|
|
if (!empty($errors) && $errors[0] instanceof FieldValidationFail) {
|
|
$badField = $errors[0]->getFieldName();
|
|
return ViewHttpResponse::twig('list_team_by_name.html.twig', ['bad_field' => $badField]);
|
|
}
|
|
|
|
$results = $this->model->listByName($request['name']);
|
|
|
|
if (empty($results)) {
|
|
return ViewHttpResponse::twig('display_teams.html.twig', []);
|
|
}
|
|
|
|
return ViewHttpResponse::twig('display_teams.html.twig', ['teams' => $results]);
|
|
}
|
|
|
|
public function displayTeam(int $id, SessionHandle $session): HttpResponse {
|
|
$result = $this->model->displayTeam($id);
|
|
return ViewHttpResponse::twig('display_team.html.twig', ['team' => $result]);
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $request
|
|
* @param SessionHandle $session
|
|
* @return HttpResponse
|
|
*/
|
|
public function addMember(array $request, SessionHandle $session): HttpResponse {
|
|
$errors = [];
|
|
|
|
$request = HttpRequest::from($request, $errors, [
|
|
"team" => [Validators::isInteger()],
|
|
"mail" => [Validators::regex("/^\\S+@\\S+\\.\\S+$/"), Validators::lenBetween(5, 256)],
|
|
]);
|
|
|
|
return $this->displayTeam($this->model->addMember($request['mail'], intval($request['team']), $request['role']), $session);
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $request
|
|
* @param SessionHandle $session
|
|
* @return HttpResponse
|
|
*/
|
|
public function deleteMember(array $request, SessionHandle $session): HttpResponse {
|
|
$errors = [];
|
|
|
|
$request = HttpRequest::from($request, $errors, [
|
|
"team" => [Validators::isInteger()],
|
|
"mail" => [Validators::regex("/^\\S+@\\S+\\.\\S+$/"), Validators::lenBetween(5, 256)],
|
|
]);
|
|
|
|
return $this->displayTeam($this->model->deleteMember($request['mail'], intval($request['team'])), $session);
|
|
}
|
|
}
|