Subversion Repositories eFlore/Applications.del

Rev

Rev 1794 | Rev 1848 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
787 delphine 1
<?php
2
// declare(encoding='UTF-8');
3
/**
1845 jpm 4
 * Web service permetant d'ajouter ou de modifier les votes associés aux propositions d'une observation.
787 delphine 5
 *
1845 jpm 6
 * @category   DEL
7
 * @package    Services
8
 * @subpackage Observations
9
 * @version    0.1
10
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
11
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
12
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
13
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
14
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
15
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
787 delphine 16
 */
17
 
841 aurelien 18
class VoteObservation extends RestService {
19
	protected $conteneur;
20
	protected $bdd;
895 aurelien 21
	protected $navigation;
1305 jpm 22
 
23
 
787 delphine 24
	public function __construct(Conteneur $conteneur = null) {
25
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
1793 jpm 26
		$this->bdd = $this->conteneur->getBdd();
895 aurelien 27
		$this->navigation = $conteneur->getNavigation();
28
		$this->conteneur->chargerConfiguration('config_mapping_votes.ini');
787 delphine 29
	}
1305 jpm 30
 
787 delphine 31
	/**
895 aurelien 32
	* Configuration du service en fonction du fichier de config config_del.ini
33
	* */
34
	private function configurer() {
35
		$this->mappingVotes = $this->conteneur->getParametre('mapping_votes');
36
	}
1305 jpm 37
 
895 aurelien 38
	/**
871 aurelien 39
	 * Méthode seulement présente pour interdire proprement l'accès à la consultation
787 delphine 40
	 * */
1305 jpm 41
	public function consulter($ressources, $parametres) {
895 aurelien 42
		$this->configurer();
1305 jpm 43
 
895 aurelien 44
		//TODO: faut il vérifier quelque chose, si on n'a pas renseigné les valeurs correctement
45
		// dans ressource, le service n'est même pas appelé
46
		$votes = $this->chargerVotes($ressources[1]);
910 aurelien 47
		$this->conteneur->getNavigation()->setTotal(count($votes));
895 aurelien 48
		// Mettre en forme le résultat et l'envoyer pour affichage
49
		$resultat = new ResultatService();
1794 jpm 50
		$resultat->corps = array('entete' => $this->navigation->getEntete(), 'resultats' => $votes);
895 aurelien 51
		return $resultat;
787 delphine 52
	}
1305 jpm 53
 
895 aurelien 54
	private function chargerVotes($id_commentaire) {
1612 jpm 55
		$id_commentaire = $this->proteger($id_commentaire);
56
		$requeteVotes = 'SELECT * '.
57
			'FROM del_commentaire_vote '.
58
			"WHERE ce_proposition = $id_commentaire ";
895 aurelien 59
		$resultatsVotes = $this->bdd->recupererTous($requeteVotes);
60
		$votes = array();
61
		foreach ($resultatsVotes as $vote) {
62
			$votes[$vote['id_vote']] = $this->formaterVotes($vote);
63
			$utilisateur = $this->chercherUtilisateur($vote['ce_utilisateur']);
1612 jpm 64
			if ($utilisateur) {
895 aurelien 65
				$votes[$vote['id_vote']] = array_merge($votes[$vote['id_vote']], $utilisateur);
66
			}
67
		}
68
		return $votes;
69
	}
1305 jpm 70
 
871 aurelien 71
	/**
895 aurelien 72
	* Trouver l'utilisateur en fonction des paramètres ou de la base de données si le nom, prénom et courriel ne sont pas donnés
73
	* @return le tableau utilisateur
74
	* */
75
	private function chercherUtilisateur($id) {
1763 mathias 76
		// par défaut, pas d'info
77
		$utilisateur = array();
1759 mathias 78
		// Si l'id utilisateur est un hash de session, on ne cherche rien
79
		if (is_numeric($id)) {
80
			$requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
81
				"courriel AS 'auteur.courriel' ".
82
				'FROM del_utilisateur '.
83
				'WHERE id_utilisateur = '.$this->bdd->proteger($id);
84
			$utilisateur = $this->bdd->recuperer($requete);
85
		}
1305 jpm 86
 
895 aurelien 87
		return $utilisateur;
88
	}
1305 jpm 89
 
895 aurelien 90
	/**
91
	*  Formater un vote en fonction du fichier de configuration config_votes.ini
92
	*  @param $votes array()
93
	* */
94
	private function formaterVotes($vote) {
95
		$retour = array();
96
		foreach ($vote as $param => $valeur) {
97
			$retour[$this->mappingVotes[$param]] = $valeur;
98
		}
99
		return $retour;
100
	}
1305 jpm 101
 
895 aurelien 102
	/**
871 aurelien 103
	* Ajoute un vote à une proposition grâce aux informations passées en paramètres
104
	* @param array $ressources tableau des informations contenues dans l'url après le nom du service
105
	* @param array $parametres contenu du post
1305 jpm 106
	*
871 aurelien 107
	* @return void
108
	*
109
	* */
787 delphine 110
	public function ajouter($ressources, $parametres) {
871 aurelien 111
		$this->verifierParametresAjoutModif($ressources, $parametres);
112
 
113
		// Vérifie si la proposition existe, et la crée sinon
855 aurelien 114
		// (cas du vote sur la proposition fabriquée à partir de l'observation originale)
871 aurelien 115
		if($ressources[1] == 0) {
1252 aurelien 116
			$ressources[1] = $this->renvoyerIdOuCreerPropositionDeterminationInitiale($ressources[0]);
871 aurelien 117
		}
1305 jpm 118
 
841 aurelien 119
		$insertion = 'INSERT INTO del_commentaire_vote '.
1612 jpm 120
			'(ce_proposition , ce_utilisateur , valeur , date) '.
121
			'VALUES ('.$this->proteger($ressources[1]).','.$this->proteger($parametres['utilisateur']).','.
122
			$this->proteger($parametres['valeur']).', NOW());';
787 delphine 123
		$resultatsVotes = $this->bdd->requeter($insertion);
124
		if ($resultatsVotes == false) {
125
			RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
126
		} else {
127
			RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_CREATION_OK);
128
		}
129
	}
1305 jpm 130
 
871 aurelien 131
	private function renvoyerIdPropositionObservation($id_observation) {
132
		$id_commentaire = null;
133
		// Récupération de l'utilisateur + nom sel de l'observation originale
134
		$requete_selection_obs = 'SELECT ce_utilisateur, nom_sel '.
1612 jpm 135
			'FROM del_observation '.
136
			'WHERE id_observation ='.$this->proteger($id_observation);
1305 jpm 137
 
871 aurelien 138
		$obs = $this->bdd->recuperer($requete_selection_obs);
1305 jpm 139
 
1612 jpm 140
		if (is_array($obs) && isset($obs['ce_utilisateur'])) {
871 aurelien 141
			// On considère que la proposition faite par le même utilisateur et ayant le même
1305 jpm 142
			// nom sélectionné est bien la proposition composée à partir de l'obs originale
1612 jpm 143
			$requete_selection_comm = 'SELECT id_commentaire '.
144
				'FROM del_commentaire '.
145
				'WHERE ce_observation = '.$this->proteger($id_observation).' '.
146
				' AND nom_sel = '.$this->proteger($obs['nom_sel']).' AND '.
147
				' ce_utilisateur = '.$this->proteger($obs['ce_utilisateur']);
1305 jpm 148
 
871 aurelien 149
			$commentaire = $this->bdd->recuperer($requete_selection_comm);
1612 jpm 150
			$id_commentaire = null;
151
			if (is_array($commentaire) && $commentaire['id_commentaire'] != null) {
152
				$id_commentaire = $commentaire['id_commentaire'];
153
			}
1305 jpm 154
		}
155
 
871 aurelien 156
		return $id_commentaire;
157
	}
1305 jpm 158
 
1252 aurelien 159
	private function renvoyerIdOuCreerPropositionDeterminationInitiale($id_observation) {
160
		$proposition_existe = $this->propositionInitialeExiste($id_observation);
161
		if(!$proposition_existe) {
162
			$id_proposition = $this->creerPropositionAPartirObservation($id_observation);
163
		} else {
1612 jpm 164
			$requete = 'SELECT id_commentaire '.
165
				'FROM del_commentaire '.
166
				"WHERE ce_observation = $id_observation ".
167
				'AND proposition_initiale = 1 ';
1252 aurelien 168
			$resultat = $this->bdd->recuperer($requete);
169
			$id_proposition = $resultat['id_commentaire'];
170
		}
171
		return $id_proposition;
172
	}
1305 jpm 173
 
1252 aurelien 174
	private function propositionInitialeExiste($id_observation) {
1612 jpm 175
		$requete = 'SELECT COUNT(*) >= 1 AS existe '.
176
			'FROM del_commentaire '.
177
			"WHERE ce_observation = $id_observation ".
178
			'AND proposition_initiale = 1 ';
1252 aurelien 179
		$resultat = $this->bdd->recuperer($requete);
180
		return $resultat['existe'] == 1;
181
	}
1305 jpm 182
 
871 aurelien 183
	private function creerPropositionAPartirObservation($id_observation) {
184
		$insertion = 'INSERT IGNORE INTO del_commentaire '.
185
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
1305 jpm 186
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel, date, proposition_initiale) '.
871 aurelien 187
			'SELECT id_observation, ce_utilisateur, prenom, nom, '.
188
			'		courriel, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, '.
1305 jpm 189
			"		nt, famille, 'bdtfx_v1', NOW(), '1' ".
871 aurelien 190
			'FROM del_observation do '.
1612 jpm 191
			'	LEFT JOIN del_utilisateur du ON (do.ce_utilisateur = du.id_utilisateur) '.
871 aurelien 192
			'WHERE id_observation = '.$this->proteger($id_observation);
1305 jpm 193
 
871 aurelien 194
		$resultat = $this->bdd->requeter($insertion);
1612 jpm 195
 
871 aurelien 196
		// Attention à l'abstraction utilisée, récupérer le dernier id en mysql ou msqli ça marche bien, mais pour d'autres moins
197
		$id = $this->bdd->recupererIdDernierAjout();
198
		return $id;
199
	}
1305 jpm 200
 
871 aurelien 201
	/**
202
	* Modifie un vote associé à une proposition grâce aux informations passées en paramètres
203
	* @param array $ressources tableau des informations contenues dans l'url après le nom du service
204
	* @param array $parametres contenu du post
205
	*
206
	* @return void
207
	*
208
	* */
841 aurelien 209
	public function modifier($ressources, $parametres) {
855 aurelien 210
		$this->verifierParametresAjoutModif($ressources, $parametres);
1305 jpm 211
 
871 aurelien 212
		// Si l'identifiant de proposition vaut 0, c'est un vote sur une proposition
213
		// fabriquée à partir de l'observation originale, dont on doit obtenir l'id
1305 jpm 214
		// (cas où l'on vient de voter pour celle et cela a créé la proposition, puis
871 aurelien 215
		// on revote pour celle ci en changeant d'avis sans recharger la page)
216
		if($ressources[1] == 0) {
1252 aurelien 217
			$id_proposition = $this->renvoyerIdOuCreerPropositionDeterminationInitiale($ressources[0]);
871 aurelien 218
			if($id_proposition == null) {
219
				$this->envoyerMessageErreurIdProposition();
220
				exit;
221
			} else {
222
				$ressources[1] = $id_proposition;
223
			}
224
		}
1305 jpm 225
 
841 aurelien 226
		$modification = 'UPDATE del_commentaire_vote '.
1612 jpm 227
			'SET valeur ='.$this->proteger($parametres['valeur']).', '.
228
			'date = NOW() '.
229
			'WHERE ce_proposition = '.$this->proteger($ressources[1]).' '.
230
			'AND ce_utilisateur = '.$this->proteger($parametres['utilisateur']);
1305 jpm 231
 
841 aurelien 232
		$resultatsVotes = $this->bdd->requeter($modification);
233
		if ($resultatsVotes == false) {
234
			RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
235
		} else {
236
			RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK);
237
		}
238
	}
1305 jpm 239
 
855 aurelien 240
	public function verifierParametresAjoutModif($ressources, $parametres) {
241
		$erreurs = array();
242
		if (!is_numeric($ressources[1])) {
243
			$erreurs[] = '- le paramètre indiquant l\'identifiant de la proposition doit être numérique ;';
244
		}
1305 jpm 245
 
855 aurelien 246
		if (!isset($parametres['utilisateur'])) {
247
			$erreurs[] = '- paramètre "utilisateur" manquant ;';
248
		}
1305 jpm 249
 
855 aurelien 250
		if (!isset($parametres['valeur'])) {
251
			$erreurs[] = '- paramètre "valeur" manquant ;';
252
		} else {
253
			if (!is_numeric($parametres['valeur'])) {
254
				$erreurs[] = '- le paramètre "valeur" doit être numérique ;';
255
			} elseif($parametres['valeur'] != 0 && $parametres['valeur'] != 1) {
871 aurelien 256
				$erreurs[] = '- le paramètre "valeur" ne peut prendre que la valeur 0 ou 1 ;';
855 aurelien 257
			}
258
		}
1305 jpm 259
 
855 aurelien 260
		if (!empty($erreurs)) {
261
			$e = 'Erreur lors de la configuration : '."\n";
262
			$e .= implode("\n", $erreurs);
263
			RestServeur::ajouterMessage($e);
264
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
265
		}
266
	}
1305 jpm 267
 
871 aurelien 268
	protected function envoyerMessageErreurIdProposition() {
269
		$erreurs = array('Aucun identifiant de proposition n\'est lié à cette observation');
270
		$e = 'Erreur lors de la configuration : '."\n";
271
		$e .= implode("\n", $erreurs);
272
		RestServeur::ajouterMessage($e);
273
		throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
274
	}
1305 jpm 275
 
841 aurelien 276
	protected function proteger($valeur) {
277
		if (is_array($valeur)) {
278
			return $this->bdd->protegerTableau($valeur);
279
		} else {
280
			return $this->bdd->proteger($valeur);
281
		}
282
	}
1845 jpm 283
}