* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) * @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL * @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL * @version $Id: Bdd.php 403 2012-02-22 14:35:20Z gduche $ * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images */ class SupprimerCommentaire { private $conteneur; private $navigation; private $masque; private $gestionBdd; private $bdd; private $parametres = array(); private $ressources = array(); private $commentaireId; private $utilisateurId; public function __construct(Conteneur $conteneur = null) { $this->conteneur = $conteneur == null ? new Conteneur() : $conteneur; $this->conteneur->chargerConfiguration('config_commentaires.ini'); $this->conteneur->chargerConfiguration('config_mapping_commentaires.ini'); $this->navigation = $conteneur->getNavigation(); $this->masque = $conteneur->getMasque(); $this->gestionBdd = $conteneur->getGestionBdd(); $this->bdd = $this->gestionBdd->getBdd(); } /** * Méthode principale de la classe. * Lance la récupération des images dans la base et les place dans un objet ResultatService * pour l'afficher. * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2) * @param array $parametres les paramètres situés après le ? dans l'url * */ public function supprimer($ressources, $parametres) { $resultat = new ResultatService(); $this->initialiserRessourcesEtParametres($ressources, $parametres); // Gestion des configuration du script $this->configurer(); // 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->sansEnfant() && $this->utilisateurEstAutorise()) { $this->supprimerCommentaire(); $this->supprimerVotesAssocies(); } else { $e = 'Impossible de supprimer le commentaire car il a des réponses ou ce n\'est pas le vôtre.'; throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); } return $resultat; } private function initialiserRessourcesEtParametres($ressources, $parametres) { $this->ressources = $ressources; $this->parametres = $parametres; } /*------------------------------------------------------------------------------- CONFIGURATION DU SERVICE --------------------------------------------------------------------------------*/ /** sansEnfant permet de vérifier que le commentaire que l'on veut supprimer * n'a aucune réponse * */ public function sansEnfant() { $requete = 'SELECT * '. 'FROM del_commentaire '. "WHERE (ce_proposition = {$this->commentaireId} ". "OR ce_commentaire_parent = {$this->commentaireId}) "; $resultats = $this->bdd->recupererTous($requete); if (!empty($resultats)) { $e = 'Impossible de supprimer le commentaire car il a des réponses'; throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); } return true; } private function utilisateurEstAutorise() { $autorise = true; if (!$this->estProprietaire() && !$this->utilisateurEstAdmin()) { $e = 'Impossible de supprimer le commentaire car l\'utilisateur n\'a pas les droits requis'; throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); $autorise = false; } return $autorise; } /** * estProprietaire permet de vérifier que le commentaire appartient à l'utilisateur * * */ public function estProprietaire() { $requete = 'SELECT * '. 'FROM del_commentaire '. "WHERE id_commentaire = {$this->commentaireId} ". "AND ce_utilisateur = {$this->utilisateurId} "; $resultats = $this->bdd->recupererTous($requete); return !empty($resultats); } /** * Obtient l'utilisateur par le cookie */ public function getUtilisateurParCookie() { //TODO: utiliser le cookie n'est pas très sécurisé // ceci aussi devrait être dans une classe utilitaire if (isset($_COOKIE['del_courriel']) && $_COOKIE['del_courriel'] != '') { $courriel = $this->bdd->proteger($_COOKIE['del_courriel']); $requete = "SELECT id_utilisateur FROM del_utilisateur WHERE courriel = $courriel "; $utilisateur = $this->bdd->recuperer($requete); $this->utilisateurId = $utilisateur['id_utilisateur']; } } /** * Renvoie vrai si l'utilisateur existe dans la base de données et si son champ admin est à 1 */ private function utilisateurEstAdmin() { //TODO: déplacer ceci dans une classe utilitaire $idUtilisateur = $this->bdd->proteger($this->utilisateurId); $requete = 'SELECT admin '. 'FROM del_utilisateur_infos '. "WHERE id_utilisateur = $idUtilisateur "; $resultat = $this->bdd->recuperer($requete); return ($resultat && $resultat['admin'] == 1); } /** * Initialiser les attributs de la classe avec les parametres * */ public function configurer() { $erreurs= array(); if (isset($this->ressources[0]) && is_numeric($this->ressources[0])) { $this->commentaireId = $this->ressources[0]; } else { $erreurs[] = ' - l\identifiant du commentaire doit être un entier; '; } if (isset($_COOKIE['del_courriel']) && $_COOKIE['del_courriel'] != '') { $this->getUtilisateurParCookie(); } else { $erreurs[] = ' - Ce service nécessite d\'être identifié; '; } if (!empty($erreurs)) { $e = 'Erreur de configuration :'; $e = implode("\n", $erreurs); throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); } } /*------------------------------------------------------------------------------- SUPPRESSION DES COMMENTAIRES --------------------------------------------------------------------------------*/ /** * Requete effective de suppression * */ public function supprimerCommentaire() { $commentaireId = $this->bdd->proteger($this->commentaireId); $utilisateurId = $this->bdd->proteger($this->utilisateurId); $requete = 'DELETE FROM del_commentaire '. "WHERE id_commentaire = $commentaireId ". "AND ce_utilisateur = $utilisateurId "; $retour = $this->bdd->requeter($requete); if (!$retour) { $e = 'Erreur lors de la suppression'; throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); } } /** * Requete de suppression de votes associés au commentaire */ public function supprimerVotesAssocies() { $commentaireId = $this->bdd->proteger($this->commentaireId); $requete = "DELETE FROM del_commentaire_vote WHERE ce_proposition = $commentaireId "; $retour = $this->bdd->requeter($requete); if (!$retour) { $e = 'Erreur lors de la suppression des votes associés'; throw new Exception($e, RestServeur::HTTP_CODE_ERREUR); } } } ?>