plateforme-corres2math/server_files/controllers/poser_questions.php

118 lines
4.1 KiB
PHP
Raw Normal View History

2019-09-20 12:57:06 +00:00
<?php
if (!isset($_SESSION["user_id"]) || $_SESSION["role"] != Role::PARTICIPANT && $_SESSION["role"] != Role::ENCADRANT)
require_once "server_files/403.php";
/** @var Team $team */
$team = $_SESSION["team"];
if ($team == null)
require_once "server_files/403.php";
$has_error = false;
$error_message = null;
if (isset($_POST["give_questions"])) {
$give_questions = new GiveQuestions($_POST, $_FILES);
2019-09-20 12:57:06 +00:00
try {
$give_questions->makeVerifications();
$give_questions->giveQuestions();
} catch (AssertionError $e) {
$has_error = true;
$error_message = $e->getMessage();
}
}
class GiveQuestions
{
private $to;
/**
* @var Team $to_team
*/
2019-09-20 12:57:06 +00:00
private $to_team;
private $question_1;
private $question_2;
private $question_3;
private $question_4;
private $question_5;
private $question_6;
private $no_drawing;
private $files;
2019-09-20 12:57:06 +00:00
public function __construct($data, $files)
2019-09-20 12:57:06 +00:00
{
foreach ($data as $key => $value) {
$this->$key = $value;
}
$this->files = [];
for ($i = 1; $i <= 6; ++$i)
$this->files[] = strlen($files["file_$i"]["name"]) > 0 ? $files["file_$i"] : null;
2019-09-20 12:57:06 +00:00
}
public function makeVerifications()
{
global $LOCAL_PATH, $team;
$this->to_team = Team::fromTrigram($this->to);
2019-09-20 12:57:06 +00:00
ensure($this->to_team, "L'équipe indiquée n'existe pas.");
ensure($team->getProblem() == $this->to_team->getProblem(), "Les équipes ne travaillent pas sur le même problème.");
ensure($this->question_1 != null && $this->question_1 != "" && $this->question_2 != null && $this->question_2 != "" && $this->question_3 != null && $this->question_3 != "",
"Vous devez poser au moins 3 questions.");
ensure(sizeof($_FILES) == 0 || $this->no_drawing, "Vous devez confirmer ne pas avoir inclus de texte dans vos pièces jointes.");
for ($i = 0; $i < 6; ++$i) {
ensure($this->files[$i]["size"] <= 2e6, "Le fichier doit peser moins que 2 Mo.");
ensure(!$this->files[$i]["error"], "Une erreur est survenue.");
//ensure(finfo_file(finfo_open(FILEINFO_MIME_TYPE), $this->files[$i]["tmp_name"]) == "application/pdf", "Le fichier doit être au format PDF.");
}
ensure(is_dir("$LOCAL_PATH/files") || mkdir("$LOCAL_PATH/files"), "Un problème est survenue dans l'envoi du fichier. Veuillez contacter l'administrateur du serveur.");
2019-09-20 12:57:06 +00:00
}
public function giveQuestions()
{
global $DB, $LOCAL_PATH, $team;
$attached_file = [];
for ($i = 0; $i < 5; ++$i)
{
if ($this->files[$i] == null)
$attached_file[] = null;
else {
do
$id = genRandomPhrase(64);
while (file_exists("$LOCAL_PATH/files/$id"));
if (!rename($this->files[$i]["tmp_name"], "$LOCAL_PATH/files/$id"))
throw new AssertionError("Une erreur est survenue lors de l'envoi du fichier.");
$attached_file[] = $id;
}
}
2019-09-20 12:57:06 +00:00
$DB->exec("DELETE FROM `questions` WHERE `from` = " . $team->getId() . " AND `to` = " . $this->to_team->getId() . ";");
$req = $DB->prepare("INSERT INTO `questions`(`from`, `to`, `problem`, `question`, `attached_file`) VALUES "
. "(?, ?, ?, ?, ?), (?, ?, ?, ?, ?), (?, ?, ?, ?, ?), (?, ?, ?, ?, ?), (?, ?, ?, ?, ?), (?, ?, ?, ?, ?);");
$req->execute([$team->getId(), $this->to_team->getId(), $team->getProblem(), $this->question_1, $attached_file[0],
$team->getId(), $this->to_team->getId(), $team->getProblem(), $this->question_2, $attached_file[1],
$team->getId(), $this->to_team->getId(), $team->getProblem(), $this->question_3, $attached_file[2],
$team->getId(), $this->to_team->getId(), $team->getProblem(), $this->question_4, $attached_file[3],
$team->getId(), $this->to_team->getId(), $team->getProblem(), $this->question_5, $attached_file[4],
$team->getId(), $this->to_team->getId(), $team->getProblem(), $this->question_6, $attached_file[5]]);
2019-09-20 12:57:06 +00:00
}
}
/**
* @var Team[] $receivers
* @var Video[] $videos
* @var Question[][] $questions
*/
$receivers = [Team::fromId($team->getVideoTeamIds()[0]), Team::fromId($team->getVideoTeamIds()[1])];
$videos = [Video::getVideo(Reason::SOLUTION, $receivers[0], Video::ACCEPTED),
Video::getVideo(Reason::SOLUTION, $receivers[1], Video::ACCEPTED)];
$questions = [Question::getQuestions($team, $receivers[0]),
Question::getQuestions($team, $receivers[1])];
require_once "server_files/views/poser_questions.php";