Subversion Repositories eFlore/Applications.del

Rev

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);
                }
        }
}