| 751 | delphine | 1 | <?php
 | 
        
           |  |  | 2 | // declare(encoding='UTF-8');
 | 
        
           |  |  | 3 | /**
 | 
        
           | 1603 | jpm | 4 |  * Le web service image récupère toutes les données de la table del_obs_images
 | 
        
           | 751 | delphine | 5 |  * pour retourner une liste d'images associée à une observation
 | 
        
           |  |  | 6 |  *
 | 
        
           | 1827 | jpm | 7 |  * @category   DEL
 | 
        
           |  |  | 8 |  * @package    Services
 | 
        
           |  |  | 9 |  * @subpackage Images
 | 
        
           |  |  | 10 |  * @version    0.1
 | 
        
           |  |  | 11 |  * @author     Mathias CHOUET <mathias@tela-botanica.org>
 | 
        
           |  |  | 12 |  * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
 | 
        
           |  |  | 13 |  * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
 | 
        
           |  |  | 14 |  * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 | 
        
           |  |  | 15 |  * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 | 
        
           |  |  | 16 |  * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
 | 
        
           | 751 | delphine | 17 |  */
 | 
        
           |  |  | 18 |   | 
        
           | 1472 | aurelien | 19 | class VotesImage {
 | 
        
           | 1603 | jpm | 20 |   | 
        
           | 751 | delphine | 21 | 	private $conteneur;
 | 
        
           |  |  | 22 | 	private $navigation;
 | 
        
           | 1827 | jpm | 23 | 	private $bdd;
 | 
        
           |  |  | 24 | 	private $mapping = array();
 | 
        
           | 758 | delphine | 25 | 	private $ressources;
 | 
        
           |  |  | 26 | 	private $parametres;
 | 
        
           | 1603 | jpm | 27 |   | 
        
           | 1827 | jpm | 28 | 	public function __construct(Conteneur $conteneur) {
 | 
        
           |  |  | 29 | 		$this->conteneur = $conteneur;
 | 
        
           | 751 | delphine | 30 | 		$this->navigation = $conteneur->getNavigation();
 | 
        
           | 1793 | jpm | 31 | 		$this->bdd = $this->conteneur->getBdd();
 | 
        
           | 1827 | jpm | 32 |   | 
        
           |  |  | 33 | 		$this->mapping = $this->conteneur->getParametreTableau('votes.mapping');
 | 
        
           | 751 | delphine | 34 | 	}
 | 
        
           | 1603 | jpm | 35 |   | 
        
           | 751 | delphine | 36 | 	/**
 | 
        
           |  |  | 37 | 	 * Méthode principale de la classe.
 | 
        
           | 1603 | jpm | 38 | 	 * Lance la récupération des images dans la base et les place dans un objet ResultatService
 | 
        
           | 751 | delphine | 39 | 	 * pour l'afficher.
 | 
        
           |  |  | 40 | 	 * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
 | 
        
           |  |  | 41 | 	 * @param array $parametres les paramètres situés après le ? dans l'url
 | 
        
           |  |  | 42 | 	 * */
 | 
        
           |  |  | 43 | 	public function consulter($ressources, $parametres) {
 | 
        
           |  |  | 44 | 		$this->ressources = $ressources;
 | 
        
           | 758 | delphine | 45 | 		$this->parametres = $parametres;
 | 
        
           | 1603 | jpm | 46 |   | 
        
           | 751 | delphine | 47 | 		// Lancement du service
 | 
        
           |  |  | 48 | 		$votes = $this->chargerVotes();
 | 
        
           |  |  | 49 | 		$total = $this->compterVotes();
 | 
        
           |  |  | 50 | 		$this->navigation->setTotal($total);
 | 
        
           | 1603 | jpm | 51 |   | 
        
           | 751 | delphine | 52 | 		// Mettre en forme le résultat et l'envoyer pour affichage
 | 
        
           |  |  | 53 | 		$resultat = new ResultatService();
 | 
        
           | 1794 | jpm | 54 | 		$resultat->corps = array('entete' => $this->navigation->getEntete(), 'resultats' => $votes);
 | 
        
           | 751 | delphine | 55 | 		return $resultat;
 | 
        
           |  |  | 56 | 	}
 | 
        
           | 1603 | jpm | 57 |   | 
        
           | 1827 | jpm | 58 | 	private function chargerVotes() {
 | 
        
           |  |  | 59 | 		$idImgP = $this->bdd->proteger($this->ressources[0]);
 | 
        
           |  |  | 60 | 		$idProtocoleP = isset($this->parametres['protocole']) ? $this->bdd->proteger($this->parametres['protocole']) : null;
 | 
        
           |  |  | 61 | 		$requete = 'SELECT * FROM del_image_vote '.
 | 
        
           |  |  | 62 | 			"WHERE ce_image = $idImgP ".
 | 
        
           |  |  | 63 | 			($idProtocoleP != null ? "AND ce_protocole = $idProtocoleP " : '').
 | 
        
           |  |  | 64 | 			' -- '.__FILE__.' : '.__LINE__;
 | 
        
           |  |  | 65 | 		$resultats = $this->bdd->recupererTous($requete);
 | 
        
           |  |  | 66 | 		return $this->formaterVotes($resultats);
 | 
        
           |  |  | 67 | 	}
 | 
        
           | 1603 | jpm | 68 |   | 
        
           | 1827 | jpm | 69 | 	private function compterVotes() {
 | 
        
           |  |  | 70 | 		$requete = 'SELECT FOUND_ROWS() AS nbre -- '.__FILE__.' : '.__LINE__;
 | 
        
           |  |  | 71 | 		$resultats = $this->bdd->recuperer($requete);
 | 
        
           |  |  | 72 | 		return (int) $resultats['nbre'];
 | 
        
           |  |  | 73 | 	}
 | 
        
           | 1472 | aurelien | 74 |   | 
        
           | 1827 | jpm | 75 | 	private function formaterVotes($votes) {
 | 
        
           |  |  | 76 | 		$retour = array();
 | 
        
           |  |  | 77 | 		foreach ($votes as $vote) {
 | 
        
           |  |  | 78 | 			foreach ($vote as $champ => $valeur) {
 | 
        
           |  |  | 79 | 				$attribut = $this->mapping[$champ];
 | 
        
           |  |  | 80 | 				$retour[$vote['id_vote']][$attribut] = $valeur;
 | 
        
           |  |  | 81 | 			}
 | 
        
           |  |  | 82 | 		}
 | 
        
           |  |  | 83 | 		return $retour;
 | 
        
           |  |  | 84 | 	}
 | 
        
           | 1603 | jpm | 85 |   | 
        
           | 1827 | jpm | 86 | 	public function ajouter($ressources, $parametres) {
 | 
        
           |  |  | 87 | 		$this->ressources = $ressources;
 | 
        
           |  |  | 88 | 		$this->parametres = $parametres;
 | 
        
           | 1603 | jpm | 89 |   | 
        
           | 1827 | jpm | 90 | 		$this->verifierParametresAjoutModif();
 | 
        
           |  |  | 91 | 		$idVote = $this->ajouterVote();
 | 
        
           |  |  | 92 | 		if ($idVote) {
 | 
        
           |  |  | 93 | 			self::updateStats($this->bdd, $this->ressources[0], $this->parametres['protocole']);
 | 
        
           |  |  | 94 |   | 
        
           | 1472 | aurelien | 95 | 			$resultat = new ResultatService();
 | 
        
           | 1603 | jpm | 96 | 			$resultat->corps = array('id_vote' => $idVote);
 | 
        
           | 1472 | aurelien | 97 | 			return $resultat;
 | 
        
           | 782 | delphine | 98 | 		}
 | 
        
           | 1827 | jpm | 99 | 		return false;
 | 
        
           | 782 | delphine | 100 | 	}
 | 
        
           | 1603 | jpm | 101 |   | 
        
           | 1827 | jpm | 102 | 	private function ajouterVote() {
 | 
        
           |  |  | 103 | 		$idImgP = $this->bdd->proteger($this->ressources[0]);
 | 
        
           |  |  | 104 | 		$idProtocoleP = $this->bdd->proteger($this->parametres['protocole']);
 | 
        
           |  |  | 105 | 		$idUtilisateurP = $this->bdd->proteger($this->parametres['utilisateur']);
 | 
        
           |  |  | 106 | 		$valeurP = $this->bdd->proteger($this->parametres['valeur']);
 | 
        
           | 1603 | jpm | 107 |   | 
        
           | 1827 | jpm | 108 | 		$requete = 'INSERT INTO del_image_vote (ce_image, ce_protocole, ce_utilisateur, valeur, date) '.
 | 
        
           |  |  | 109 | 			"VALUES ( $idImgP, $idProtocoleP, $idUtilisateurP, $valeurP, NOW()) ".
 | 
        
           |  |  | 110 | 			' -- '.__FILE__.' : '.__LINE__;
 | 
        
           |  |  | 111 |   | 
        
           |  |  | 112 | 		$resultat = $this->bdd->executer($requete);
 | 
        
           |  |  | 113 | 		if ($resultat === false) {
 | 
        
           |  |  | 114 | 			$msg = "Un problème est survenu lors de l'ajout d'un vote.";
 | 
        
           |  |  | 115 | 			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
 | 
        
           |  |  | 116 | 		} else if ($resultat === 0) {
 | 
        
           |  |  | 117 | 			$msg = "Aucun vote ne correspond au critères fournis : ".
 | 
        
           |  |  | 118 | 				"idImg -> $idImgP, id_protocole -> $idProtocoleP et id_utilisateur -> $idUtilisateurP.";
 | 
        
           |  |  | 119 | 			throw new Exception($msg, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
 | 
        
           | 829 | aurelien | 120 | 		}
 | 
        
           | 1827 | jpm | 121 | 		// ATTENTION : idVote doit être récupéré avant toute nouvelle requete !
 | 
        
           |  |  | 122 | 		$idVote = $this->bdd->recupererIdDernierAjout();
 | 
        
           |  |  | 123 | 		return $idVote;
 | 
        
           | 829 | aurelien | 124 | 	}
 | 
        
           | 1603 | jpm | 125 |   | 
        
           | 1827 | jpm | 126 | 	public function verifierParametresAjoutModif() {
 | 
        
           |  |  | 127 | 		$erreurs = array();
 | 
        
           |  |  | 128 | 		if (!is_numeric($this->ressources[0])) {
 | 
        
           |  |  | 129 | 			$erreurs[] = "Le paramètre indiquant l'identifiant de l'image doit être numérique.";
 | 
        
           | 1472 | aurelien | 130 | 		}
 | 
        
           | 1603 | jpm | 131 |   | 
        
           | 1827 | jpm | 132 | 		if (!isset($this->parametres['utilisateur'])) {
 | 
        
           |  |  | 133 | 			$erreurs[] = "Paramètre 'utilisateur' manquant.";
 | 
        
           | 1472 | aurelien | 134 | 		}
 | 
        
           | 1603 | jpm | 135 |   | 
        
           | 1827 | jpm | 136 | 		if (!isset($this->parametres['protocole'])) {
 | 
        
           |  |  | 137 | 			$erreurs[] = "Paramètre 'id_protocole' manquant.";
 | 
        
           | 751 | delphine | 138 | 		} else {
 | 
        
           | 1827 | jpm | 139 | 			if (!is_numeric($this->parametres['protocole'])) {
 | 
        
           |  |  | 140 | 				$erreurs[] = "Le paramètre 'protocole' doit être numérique.";
 | 
        
           | 751 | delphine | 141 | 			}
 | 
        
           |  |  | 142 | 		}
 | 
        
           |  |  | 143 |   | 
        
           | 1827 | jpm | 144 | 		if (!isset($this->parametres['valeur'])) {
 | 
        
           |  |  | 145 | 			$erreurs[] = "Paramètre 'valeur' manquant.";
 | 
        
           | 751 | delphine | 146 | 		} else {
 | 
        
           | 1827 | jpm | 147 | 			if (!is_numeric($this->parametres['valeur'])) {
 | 
        
           |  |  | 148 | 				$erreurs[] = "Le paramètre 'valeur' doit être numérique.";
 | 
        
           | 751 | delphine | 149 | 			}
 | 
        
           |  |  | 150 | 		}
 | 
        
           | 1603 | jpm | 151 |   | 
        
           | 751 | delphine | 152 | 		if (!empty($erreurs)) {
 | 
        
           | 1827 | jpm | 153 | 			$msg = "Erreur lors de la configuration : \n".implode("\n", $erreurs);
 | 
        
           |  |  | 154 | 			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
 | 
        
           | 751 | delphine | 155 | 		}
 | 
        
           |  |  | 156 | 	}
 | 
        
           | 1603 | jpm | 157 |   | 
        
           | 1827 | jpm | 158 | 	public function modifier($ressources, $parametres) {
 | 
        
           |  |  | 159 | 		$this->ressources = $ressources;
 | 
        
           |  |  | 160 | 		$this->parametres = $parametres;
 | 
        
           |  |  | 161 | 		$this->verifierParametresAjoutModif();
 | 
        
           |  |  | 162 | 		$resultat = $this->modifierVote();
 | 
        
           |  |  | 163 | 		if ($resultat > 0) {
 | 
        
           |  |  | 164 | 			self::updateStats($this->bdd, $this->ressources[0],$this->parametres['protocole']);
 | 
        
           |  |  | 165 | 			return 'ok';
 | 
        
           |  |  | 166 | 		}
 | 
        
           |  |  | 167 | 	}
 | 
        
           | 1603 | jpm | 168 |   | 
        
           | 1827 | jpm | 169 | 	public function modifierVote() {
 | 
        
           |  |  | 170 | 		$valeurP = $this->bdd->proteger($this->parametres['valeur']);
 | 
        
           |  |  | 171 | 		$idImgP = $this->bdd->proteger($this->ressources[0]);
 | 
        
           |  |  | 172 | 		$idProtocoleP = $this->bdd->proteger($this->parametres['protocole']);
 | 
        
           |  |  | 173 | 		$idUtilisateurP = $this->bdd->proteger($this->parametres['utilisateur']);
 | 
        
           |  |  | 174 | 		$requete = 'UPDATE del_image_vote '.
 | 
        
           |  |  | 175 | 			"SET valeur = $valeurP, date = NOW() ".
 | 
        
           |  |  | 176 | 			"WHERE ce_image = $idImgP AND ce_protocole = $idProtocoleP AND ce_utilisateur = $idUtilisateurP ".
 | 
        
           |  |  | 177 | 			' -- '.__FILE__.' : '.__LINE__;
 | 
        
           |  |  | 178 |   | 
        
           |  |  | 179 | 		$resultat = $this->bdd->executer($requete);
 | 
        
           |  |  | 180 | 		if ($resultat === false) {
 | 
        
           |  |  | 181 | 			$msg = "Un erreur est survenu lors de la tentative de modification du vote.";
 | 
        
           |  |  | 182 | 			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
 | 
        
           |  |  | 183 | 		} else if ($resultat === 0) {
 | 
        
           |  |  | 184 | 			$msg = "Aucun vote ne correspond au critères fournis : ".
 | 
        
           |  |  | 185 | 				"idImg -> $idImgP, id_protocole -> $idProtocoleP et id_utilisateur -> $idUtilisateurP.";
 | 
        
           |  |  | 186 | 			throw new Exception($msg, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
 | 
        
           | 829 | aurelien | 187 | 		}
 | 
        
           | 1827 | jpm | 188 | 		return $resultat;
 | 
        
           |  |  | 189 | 	}
 | 
        
           | 1603 | jpm | 190 |   | 
        
           | 1827 | jpm | 191 | 	public function supprimer($ressources) {
 | 
        
           |  |  | 192 | 		$this->ressources = $ressources;
 | 
        
           |  |  | 193 | 		$this->verifierParametresSuppression();
 | 
        
           |  |  | 194 | 		$idVoteP = $this->bdd->proteger($this->ressources[2]);
 | 
        
           |  |  | 195 |   | 
        
           |  |  | 196 | 		$voteInfos = $this->recupererInfosVote($idVoteP);
 | 
        
           |  |  | 197 | 		$this->verifierAutorisationSuppression($voteInfos);
 | 
        
           |  |  | 198 |   | 
        
           |  |  | 199 | 		$resultat = $this->supprimerVote($idVoteP);
 | 
        
           |  |  | 200 | 		if ($resultat > 0) {
 | 
        
           |  |  | 201 | 			$idImg = $this->ressources[0];
 | 
        
           |  |  | 202 | 			self::updateStats($this->bdd, $idImg, $voteInfos['id_protocole']);
 | 
        
           |  |  | 203 | 			return 'ok';
 | 
        
           | 829 | aurelien | 204 | 		}
 | 
        
           | 1827 | jpm | 205 | 	}
 | 
        
           | 1603 | jpm | 206 |   | 
        
           | 1827 | jpm | 207 | 	public function verifierParametresSuppression() {
 | 
        
           |  |  | 208 | 		$erreurs = array();
 | 
        
           |  |  | 209 | 		if (!isset($this->ressources[0])) {
 | 
        
           |  |  | 210 | 			$erreurs[] = "Le paramètre indiquant l'identifiant de l'image est obligatoire.";
 | 
        
           | 829 | aurelien | 211 | 		} else {
 | 
        
           | 1827 | jpm | 212 | 			if (!is_numeric($this->ressources[0])) {
 | 
        
           |  |  | 213 | 				$erreurs[] = "Le paramètre indiquant l'identifiant de l'image doit être numérique.";
 | 
        
           | 829 | aurelien | 214 | 			}
 | 
        
           |  |  | 215 | 		}
 | 
        
           | 1827 | jpm | 216 | 		if (!isset($this->ressources[2])) {
 | 
        
           |  |  | 217 | 			$erreurs[] = "Le paramètre indiquant l'identifiant du vote est obligatoire.";
 | 
        
           | 829 | aurelien | 218 | 		} else {
 | 
        
           | 1827 | jpm | 219 | 			if (!is_numeric($this->ressources[2])) {
 | 
        
           |  |  | 220 | 				$erreurs[] = "Le paramètre indiquant l'identifiant du vote doit être numérique.";
 | 
        
           | 829 | aurelien | 221 | 			}
 | 
        
           |  |  | 222 | 		}
 | 
        
           | 1603 | jpm | 223 |   | 
        
           | 829 | aurelien | 224 | 		if (!empty($erreurs)) {
 | 
        
           | 1827 | jpm | 225 | 			$msg = 'Erreur lors de la configuration : '."\n".implode("\n", $erreurs);
 | 
        
           |  |  | 226 | 			throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
 | 
        
           | 829 | aurelien | 227 | 		}
 | 
        
           |  |  | 228 | 	}
 | 
        
           | 1603 | jpm | 229 |   | 
        
           | 1827 | jpm | 230 | 	private function recupererInfosVote($idVoteP) {
 | 
        
           |  |  | 231 | 		$requete = 'SELECT id_vote, ce_protocole AS id_protocole, ce_utilisateur AS id_utilisateur '.
 | 
        
           |  |  | 232 | 			'FROM del_image_vote '.
 | 
        
           |  |  | 233 | 			"WHERE id_vote = $idVoteP ".
 | 
        
           |  |  | 234 | 			' -- '.__FILE__.' : '.__LINE__;
 | 
        
           | 1603 | jpm | 235 |   | 
        
           | 1827 | jpm | 236 | 		$infos = $this->bdd->recuperer($requete);
 | 
        
           |  |  | 237 | 		if ($infos === false) {
 | 
        
           |  |  | 238 | 			$msg = "Aucun vote ne correspond à l'identifiant $idVoteP.";
 | 
        
           |  |  | 239 | 			throw new Exception($msg, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
 | 
        
           | 1472 | aurelien | 240 | 		}
 | 
        
           | 1827 | jpm | 241 | 		return $infos;
 | 
        
           | 1472 | aurelien | 242 | 	}
 | 
        
           | 1603 | jpm | 243 |   | 
        
           | 1827 | jpm | 244 | 	private function verifierAutorisationSuppression($voteInfos) {
 | 
        
           |  |  | 245 | 		$controle_acces = $this->conteneur->getControleAcces();
 | 
        
           |  |  | 246 | 		$utilisateur = $controle_acces->getInfosUtilisateurConnecte();
 | 
        
           |  |  | 247 |   | 
        
           |  |  | 248 | 		if (isset($utilisateur['id_utilisateur']) &&
 | 
        
           |  |  | 249 | 				$utilisateur['id_utilisateur'] != $voteInfos['id_utilisateur'] &&
 | 
        
           |  |  | 250 | 				$controle_acces->getIdAnonymeTemporaire() != $voteInfos['id_utilisateur']) {
 | 
        
           |  |  | 251 | 			$message = "Vous n'êtes pas autorisé à supprimer le vote : {$voteInfos['id_vote']}";
 | 
        
           |  |  | 252 | 			throw new Exception($message, RestServeur::HTTP_CODE_ACCES_NON_AUTORISE);
 | 
        
           | 758 | delphine | 253 | 		}
 | 
        
           | 1603 | jpm | 254 | 	}
 | 
        
           |  |  | 255 |   | 
        
           | 1827 | jpm | 256 | 	private function supprimerVote($idVoteP) {
 | 
        
           |  |  | 257 | 		$requete = "DELETE FROM del_image_vote WHERE id_vote = $idVoteP ".' -- '.__FILE__.' : '.__LINE__;
 | 
        
           |  |  | 258 | 		$resultat = $this->bdd->executer($requete);
 | 
        
           |  |  | 259 | 		if ($resultat === false) {
 | 
        
           |  |  | 260 | 			$msg = "Impossible de supprimer le vote $idVoteP.";
 | 
        
           |  |  | 261 | 			throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
 | 
        
           | 751 | delphine | 262 | 		}
 | 
        
           | 1827 | jpm | 263 | 		return $resultat;
 | 
        
           | 751 | delphine | 264 | 	}
 | 
        
           | 1603 | jpm | 265 |   | 
        
           | 1827 | jpm | 266 | 	// intermédiaire pour la méthode contenue dans "Commun"
 | 
        
           |  |  | 267 | 	static function updateStats($db, $id_image, $id_protocole) {
 | 
        
           |  |  | 268 | 		return TelaBotanica\Del\Commun\Stats::updateStats($db, $id_image, $id_protocole);
 | 
        
           | 751 | delphine | 269 | 	}
 | 
        
           | 1827 | jpm | 270 | }
 |