Blame | Last modification | View Log | RSS feed
<?php
// declare(encoding='UTF-8');
/**
* Permet de supprimer un commentaire.
*
* @category DEL
* @package Services
* @subpackage Commentaires
* @version 0.1
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class SupprimerCommentaire {
private $conteneur;
private $navigation;
private $bdd;
private $utilisateur;
private $commentaireId;
private $utilisateurId;
public function __construct(Conteneur $conteneur = null) {
$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
$this->navigation = $conteneur->getNavigation();
$this->bdd = $this->conteneur->getBdd();
$this->utilisateur = $this->conteneur->getUtilisateur();
}
public function supprimer($ressources) {
$this->commentaireId = $ressources[0];
$utilisateur = $this->utilisateur->getUtilisateurIdentifie();
$this->verifierIdentificationUtilisateur($utilisateur);
$this->utilisateurId = $utilisateur['id_utilisateur'];
// la suppression est autorisée pour le propriétaire et l'admin sur un commentaire ou une proposition
// qui n'a jamais été commentée en retour
if ($this->etreCommentaireSansEnfant() && $this->etreUtilisateurAutorise() &&
$this->nePasEtreDeterminationInitiale()) {
$this->supprimerCommentaire();
$this->supprimerVotesAssocies();
}
$resultat = new ResultatService();
return $resultat;
}
private function verifierIdentificationUtilisateur($utilisateur) {
if ($utilisateur == null) {
$msg = "Ce service nécessite d'être identifié.";
throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
}
}
private function nePasEtreDeterminationInitiale() {
$idCommentaireP = $this->bdd->proteger($this->commentaireId);
$requete = 'SELECT * '.
'FROM del_commentaire '.
"WHERE id_commentaire = $idCommentaireP ".
"AND (proposition_initiale = 1 OR proposition_retenue = 1) ".
' -- '.__FILE__.' : '.__LINE__;
$resultats = $this->bdd->recupererTous($requete);
if (!empty($resultats)) {
$msg = "Impossible de supprimer la proposition initiale ou la proposition retenue.";
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
}
return true;
}
private function etreCommentaireSansEnfant() {
$idCommentaireP = $this->bdd->proteger($this->commentaireId);
$requete = 'SELECT * '.
'FROM del_commentaire '.
"WHERE (ce_proposition = $idCommentaireP ".
"OR ce_commentaire_parent = $idCommentaireP) ".
' -- '.__FILE__.' : '.__LINE__;
$resultats = $this->bdd->recupererTous($requete);
if (!empty($resultats)) {
$msg = "Impossible de supprimer le commentaire car il a des réponses.";
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
}
return true;
}
private function etreUtilisateurAutorise() {
if (! $this->etreProprietaire() && ! $this->utilisateur->etreAdmin()) {
$msg = "Impossible de supprimer le commentaire car l'utilisateur n'a pas les droits requis.";
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
}
return true;
}
private function etreProprietaire() {
$requete = 'SELECT * '.
'FROM del_commentaire '.
"WHERE id_commentaire = {$this->commentaireId} ".
"AND ce_utilisateur = {$this->utilisateurId} ".
' -- '.__FILE__.' : '.__LINE__;
$resultats = $this->bdd->recupererTous($requete);
return !empty($resultats);
}
private function supprimerCommentaire() {
$commentaireIdP = $this->bdd->proteger($this->commentaireId);
$utilisateurIdP = $this->bdd->proteger($this->utilisateurId);
$requete = 'DELETE FROM del_commentaire '.
"WHERE id_commentaire = $commentaireIdP ".
"AND ce_utilisateur = $utilisateurIdP ".
' -- '.__FILE__.' : '.__LINE__;
$retour = $this->bdd->requeter($requete);
if (!$retour) {
$msg = 'Erreur lors de la suppression.';
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
}
}
private function supprimerVotesAssocies() {
$commentaireId = $this->bdd->proteger($this->commentaireId);
$requete = 'DELETE FROM del_commentaire_vote '.
"WHERE ce_proposition = $commentaireId ".
' -- '.__FILE__.' : '.__LINE__;
$retour = $this->bdd->requeter($requete);
if (!$retour) {
$msg = 'Erreur lors de la suppression des votes associés.';
throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
}
}
}