Subversion Repositories eFlore/Applications.del

Rev

Rev 855 | Rev 895 | 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;
787 delphine 21
 
22
	public function __construct(Conteneur $conteneur = null) {
23
		$this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
24
		$this->gestionBdd = $conteneur->getGestionBdd();
25
		$this->bdd = $this->gestionBdd->getBdd();
26
	}
27
 
28
	/**
871 aurelien 29
	 * Méthode seulement présente pour interdire proprement l'accès à la consultation
787 delphine 30
	 * */
31
	public function consulter($ressources, $parametres) {
32
		RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_METHODE_NON_AUTORISE);
831 aurelien 33
		RestServeur::ajouterMessage("Le service 'observation/#id/#id_proposition/vote' n'autorise pas la consultation.");
787 delphine 34
	}
35
 
871 aurelien 36
	/**
37
	* Ajoute un vote à une proposition grâce aux informations passées en paramètres
38
	* @param array $ressources tableau des informations contenues dans l'url après le nom du service
39
	* @param array $parametres contenu du post
40
	*
41
	* @return void
42
	*
43
	* */
787 delphine 44
	public function ajouter($ressources, $parametres) {
871 aurelien 45
 
46
		$this->verifierParametresAjoutModif($ressources, $parametres);
47
 
48
		// Vérifie si la proposition existe, et la crée sinon
855 aurelien 49
		// (cas du vote sur la proposition fabriquée à partir de l'observation originale)
871 aurelien 50
		if($ressources[1] == 0) {
51
			$ressources[1] = $this->creerPropositionAPartirObservation($ressources[0]);
52
		}
855 aurelien 53
 
841 aurelien 54
		$insertion = 'INSERT INTO del_commentaire_vote '.
55
							'(ce_proposition , ce_utilisateur , valeur , date) '.
56
							'VALUES ('.$this->proteger($ressources[1]).','.$this->proteger($parametres['utilisateur']).','.
57
							$this->proteger($parametres['valeur']).', NOW());';
787 delphine 58
		$resultatsVotes = $this->bdd->requeter($insertion);
59
		if ($resultatsVotes == false) {
60
			RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
61
		} else {
62
			RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_CREATION_OK);
63
		}
64
	}
841 aurelien 65
 
871 aurelien 66
	private function renvoyerIdPropositionObservation($id_observation) {
67
 
68
		$id_commentaire = null;
69
		// Récupération de l'utilisateur + nom sel de l'observation originale
70
		$requete_selection_obs = 'SELECT ce_utilisateur, nom_sel '.
71
		                           'FROM del_observation '.
72
		                           'WHERE id_observation ='.$this->proteger($id_observation);
73
 
74
		$obs = $this->bdd->recuperer($requete_selection_obs);
75
 
76
		if(is_array($obs) && isset($obs['ce_utilisateur'])) {
77
			// On considère que la proposition faite par le même utilisateur et ayant le même
78
			// nom sélectionné est bien la proposition composée à partir de l'obs originale
79
			$requete_selection_comm = 'SELECT id_commentaire FROM del_commentaire '.
80
			           'WHERE ce_observation = '.$this->proteger($id_observation).' '.
81
			           ' AND nom_sel = '.$this->proteger($obs['nom_sel']).' AND '.
82
					   ' ce_utilisateur = '.$this->proteger($obs['ce_utilisateur']);
83
 
84
			$commentaire = $this->bdd->recuperer($requete_selection_comm);
85
			$id_commentaire = (is_array($commentaire) && $commentaire['id_commentaire'] != null) ? $commentaire['id_commentaire'] : null;
86
		}
87
 
88
		return $id_commentaire;
89
	}
90
 
91
	private function creerPropositionAPartirObservation($id_observation) {
92
 
93
		$insertion = 'INSERT IGNORE INTO del_commentaire '.
94
			'(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
95
			'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel) '.
96
			'SELECT id_observation, ce_utilisateur, prenom, nom, '.
97
			'		courriel, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, '.
98
			'		nt, famille, "bdtfx_v1" '.
99
			'FROM del_observation do '.
100
				' LEFT JOIN del_utilisateur du ON '.
101
				'do.ce_utilisateur = du.id_utilisateur '.
102
			'WHERE id_observation = '.$this->proteger($id_observation);
103
 
104
		$resultat = $this->bdd->requeter($insertion);
105
		// Attention à l'abstraction utilisée, récupérer le dernier id en mysql ou msqli ça marche bien, mais pour d'autres moins
106
		$id = $this->bdd->recupererIdDernierAjout();
107
 
108
		return $id;
109
	}
110
 
111
	/**
112
	* Modifie un vote associé à une proposition grâce aux informations passées en paramètres
113
	* @param array $ressources tableau des informations contenues dans l'url après le nom du service
114
	* @param array $parametres contenu du post
115
	*
116
	* @return void
117
	*
118
	* */
841 aurelien 119
	public function modifier($ressources, $parametres) {
855 aurelien 120
 
121
		$this->verifierParametresAjoutModif($ressources, $parametres);
122
 
871 aurelien 123
		// Si l'identifiant de proposition vaut 0, c'est un vote sur une proposition
124
		// fabriquée à partir de l'observation originale, dont on doit obtenir l'id
125
		// (cas où l'on vient de voter pour celle et cela a créé la proposition, puis
126
		// on revote pour celle ci en changeant d'avis sans recharger la page)
127
		if($ressources[1] == 0) {
128
			$id_proposition = $this->renvoyerIdPropositionObservation($ressources[0]);
129
			if($id_proposition == null) {
130
				$this->envoyerMessageErreurIdProposition();
131
				exit;
132
			} else {
133
				$ressources[1] = $id_proposition;
134
			}
135
		}
136
 
841 aurelien 137
		$modification = 'UPDATE del_commentaire_vote '.
138
						'SET valeur ='.$this->proteger($parametres['valeur']).', '.
139
						'date = NOW() '.
140
						'WHERE '.
141
							'ce_proposition = '.$this->proteger($ressources[1]).' AND '.
142
							'ce_utilisateur = '.$this->proteger($parametres['utilisateur']);
871 aurelien 143
 
841 aurelien 144
		$resultatsVotes = $this->bdd->requeter($modification);
145
		if ($resultatsVotes == false) {
146
			RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
147
		} else {
148
			RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK);
149
		}
150
	}
151
 
855 aurelien 152
	public function verifierParametresAjoutModif($ressources, $parametres) {
153
		$erreurs = array();
154
		if (!is_numeric($ressources[1])) {
155
			$erreurs[] = '- le paramètre indiquant l\'identifiant de la proposition doit être numérique ;';
156
		}
157
 
158
		if (!isset($parametres['utilisateur'])) {
159
			$erreurs[] = '- paramètre "utilisateur" manquant ;';
160
		}
161
 
162
		if (!isset($parametres['valeur'])) {
163
			$erreurs[] = '- paramètre "valeur" manquant ;';
164
		} else {
165
			if (!is_numeric($parametres['valeur'])) {
166
				$erreurs[] = '- le paramètre "valeur" doit être numérique ;';
167
			} elseif($parametres['valeur'] != 0 && $parametres['valeur'] != 1) {
871 aurelien 168
				$erreurs[] = '- le paramètre "valeur" ne peut prendre que la valeur 0 ou 1 ;';
855 aurelien 169
			}
170
		}
171
 
172
		if (!empty($erreurs)) {
173
			$e = 'Erreur lors de la configuration : '."\n";
174
			$e .= implode("\n", $erreurs);
175
			RestServeur::ajouterMessage($e);
176
			throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
177
		}
178
	}
179
 
871 aurelien 180
	protected function envoyerMessageErreurIdProposition() {
181
		$erreurs = array('Aucun identifiant de proposition n\'est lié à cette observation');
182
		$e = 'Erreur lors de la configuration : '."\n";
183
		$e .= implode("\n", $erreurs);
184
		RestServeur::ajouterMessage($e);
185
		throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
186
	}
187
 
841 aurelien 188
	protected function proteger($valeur) {
189
		if (is_array($valeur)) {
190
			return $this->bdd->protegerTableau($valeur);
191
		} else {
192
			return $this->bdd->proteger($valeur);
193
		}
194
	}
787 delphine 195
}
196
?>