Subversion Repositories eFlore/Applications.del

Rev

Rev 1845 | Rev 1849 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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