Subversion Repositories eFlore/Applications.del

Rev

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