* @author Jean-Pascal MILCENT * @author Aurelien PERONNET * @license GPL v3 * @license CECILL v2 * @copyright 1999-2014 Tela Botanica */ 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); } } }