Subversion Repositories eFlore/Applications.del

Rev

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

Rev Author Line No. Line
755 gduche 1
<?php
1795 jpm 2
// declare(encoding='UTF-8');
755 gduche 3
/**
1684 jpm 4
 * Classe principale de chargement des services Observations.
5
 *
6
 * URLs possibles :
7
 * GET :
8
 * http://localhost/service:del:0.1/observations
9
 * toutes les observations (infos obs, infos images, infos propositions, infos nb commentaires)
10
 *
11
 * http://localhost/service:del:0.1/observations?retour.format=widget
12
 * toutes les infos des observations pour le Widget DEL
13
 *
14
 * http://localhost/service:del:0.1/observations/#idObs
15
 * une observation donnée et ses images, SANS LES propositions & nombre de commentaire*
16
 *
17
 * http://localhost/service:del:0.1/observations/#idObs/#idVote/vote
18
 * toutes les infos sur les votes d'une proposition
19
 *
20
 * PUT :
21
 * http://localhost/service:del:0.1/observations/#idObs/#idCommentaire/vote
22
 * ajoute un vote (+ ou -) pour une obs et une proposition donnée
23
 *
24
 * POST :
25
 * http://localhost/service:del:0.1/observations/#idObs
26
 * utilisé seulement par les admins pour modifier une obs depuis DEL (dépublication des obs)
27
 *
28
 * http://localhost/service:del:0.1/observations/#idObs/#idCommentaire/vote
29
 * modifie un vote (+ ou -) pour une obs et une proposition donnée
30
 *
1795 jpm 31
 * @category   DEL
32
 * @package    Services
33
 * @subpackage Observations
34
 * @version    0.1
35
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
36
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
37
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
38
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
39
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
40
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
1684 jpm 41
 */
1840 jpm 42
 
755 gduche 43
class Observations extends RestService {
44
 
45
	private $parametres = array();
46
	private $ressources = array();
787 delphine 47
	private $methode = null;
1684 jpm 48
	private $serviceNom = 'observations';
49
	private $sousServiceNom = null;
755 gduche 50
	private $cheminCourant = null;
51
 
52
	private $conteneur;
1684 jpm 53
 
755 gduche 54
	/** Indique si oui (true) ou non (false), on veut utiliser les paramètres bruts. */
55
	protected $utilisationParametresBruts = true;
56
 
57
	public function __construct() {
58
		$this->cheminCourant = dirname(__FILE__).DS;
59
	}
60
 
61
	public function consulter($ressources, $parametres) {
787 delphine 62
		$this->methode = 'consulter';
1684 jpm 63
		$this->initialiserRessourcesEtParametres($ressources, $parametres);
64
		return $this->executerService();
755 gduche 65
	}
1684 jpm 66
 
787 delphine 67
	public function ajouter($ressources, $requeteDonnees) {
68
		$this->methode = 'ajouter';
1684 jpm 69
		$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees);
70
		return $this->executerService();
787 delphine 71
	}
1684 jpm 72
 
841 aurelien 73
	public function modifier($ressources, $requeteDonnees) {
74
		$this->methode = 'modifier';
1684 jpm 75
		$this->initialiserRessourcesEtParametres($ressources, $requeteDonnees);
76
		return $this->executerService();
77
	}
78
 
79
	private function executerService() {
841 aurelien 80
		$reponseHttp = new ReponseHttp();
81
		try {
82
			$this->conteneur = new Conteneur($this->parametres);
83
			$resultat = $this->traiterRessources();
1684 jpm 84
			$reponseHttp->setResultatService($resultat);
841 aurelien 85
		} catch (Exception $e) {
86
			$reponseHttp->ajouterErreur($e);
87
		}
1684 jpm 88
		$reponseHttp->emettreLesEntetes();
89
		$corps = $reponseHttp->getCorps();
90
		return $corps;
841 aurelien 91
	}
755 gduche 92
 
1684 jpm 93
	private function initialiserRessourcesEtParametres($ressources, $parametres = array()) {
755 gduche 94
		$this->ressources = $ressources;
95
		$this->parametres = $parametres;
96
	}
97
 
98
	private function traiterRessources() {
1684 jpm 99
		$this->analyserRessources();
100
		$retour = $this->initialiserService();
755 gduche 101
		return $retour;
102
	}
1684 jpm 103
 
104
	private function analyserRessources() {
105
		if ($this->methode == 'consulter') {
106
			$this->analyserRessoucesConsultation();
107
		} else if ($this->methode == 'modifier' || $this->methode == 'ajouter') {
108
			$this->analyserRessoucesModification();
109
		}
755 gduche 110
	}
111
 
1684 jpm 112
	private function analyserRessoucesConsultation() {
113
		if (count($this->ressources) == 0) {
114
			if ($this->verifierParametreValeur('retour.format', 'widget')) {
115
				// http://localhost/service:del:0.1/observations?retour.format=widget
116
				$this->sousServiceNom = 'liste-observations-widget';
117
			} else {
118
				// http://localhost/service:del:0.1/observations
119
				$this->sousServiceNom = 'liste-observations';
120
			}
121
		} else if (count($this->ressources) == 1) {
122
			if ($this->etreRessourceIdentifiant(0)) {
123
				// http://localhost/service:del:0.1/observations/#idObs
1840 jpm 124
				$this->sousServiceNom = 'observation-details';
1684 jpm 125
			}
126
		} else if (count($this->ressources) == 3) {
127
			if ($this->etreRessourceIdentifiant(0) && $this->etreRessourceIdentifiant(1) && $this->verifierRessourceValeur(2, 'vote')) {
128
				// http://localhost/service:del:0.1/observations/#idObs/#idProposition/vote/
129
				$this->sousServiceNom = 'vote-observation';
130
			}
131
		}
755 gduche 132
 
1684 jpm 133
		if ($this->sousServiceNom == null) {
134
			$this->lancerMessageErreurRessource();
135
		}
755 gduche 136
	}
137
 
1684 jpm 138
	private function analyserRessoucesModification() {
139
		if (count($this->ressources) == 1) {
140
			if ($this->methode == 'modifier' && $this->etreRessourceIdentifiant(0)) {
141
				// http://localhost/service:del:0.1/observations/#idObs
142
				$this->sousServiceNom = 'observation';
985 aurelien 143
			}
1684 jpm 144
		} else if (count($this->ressources) == 3) {
145
			if ($this->etreRessourceIdentifiant(0) && $this->etreRessourceIdentifiant(1) && $this->verifierRessourceValeur(2, 'vote')) {
146
				// http://localhost/service:del:0.1/observations/#idObs/#idProposition/vote/
147
				$this->sousServiceNom = 'vote-observation';
985 aurelien 148
			}
755 gduche 149
		}
1684 jpm 150
 
151
		if ($this->sousServiceNom == null) {
152
			$this->lancerMessageErreurRessource();
153
		}
755 gduche 154
	}
1684 jpm 155
 
156
	private function etreRessourceIdentifiant($num) {
157
		$presenceId = false;
158
		if (isset($this->ressources[$num]) && is_numeric($this->ressources[$num])) {
159
			$presenceId = true;
755 gduche 160
		}
1684 jpm 161
		return $presenceId;
755 gduche 162
	}
163
 
1684 jpm 164
	private function verifierRessourceValeur($num, $valeur) {
165
		$ok = false;
166
		if (isset($this->ressources[$num]) && $this->ressources[$num] == $valeur) {
167
			$ok = true;
168
		}
169
		return $ok;
170
	}
171
 
172
	private function verifierParametreValeur($cle, $valeur) {
173
		$ok = false;
174
		if (isset($this->parametres[$cle]) && $this->ressources[$cle] == $valeur) {
175
			$ok = true;
176
		}
177
		return $ok;
178
	}
179
 
180
	private function lancerMessageErreurRessource() {
181
		$ressource = $this->sousServiceNom.'/'.implode('/', $this->ressources);
182
		$message = "La ressource demandée '$ressource' ".
183
			"n'est pas disponible pour le service ".$this->serviceNom." !\n".
184
			"Les URLs disponibles sont : \n".
185
			" - en GET : observations, observations/#idObs/#idProposition/vote \n".
186
			" - en POST : observations/#id, observations/#idObs/#idProposition/vote \n".
187
			" - en PUT : observations/#idObs/#idProposition/vote \n";
188
		$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
189
		throw new Exception($message, $code);
190
	}
191
 
755 gduche 192
	private function initialiserService() {
1684 jpm 193
		$classe = $this->obtenirNomClasseService($this->sousServiceNom);
755 gduche 194
		$chemins = array();
1684 jpm 195
		$chemins[] = $this->cheminCourant.$this->serviceNom.DS.$classe.'.php';
755 gduche 196
		$chemins[] = $this->cheminCourant.'commun'.DS.$classe.'.php';
197
		$retour = '';
198
		$service = null;
199
		foreach ($chemins as $chemin) {
200
			if (file_exists($chemin)) {
201
				require_once $chemin;
202
				$service = new $classe($this->conteneur);
787 delphine 203
				if ($this->methode == 'consulter') {
204
					$retour = $service->consulter($this->ressources, $this->parametres);
205
				} elseif ($this->methode == 'ajouter') {
206
					$retour = $service->ajouter($this->ressources, $this->parametres);
841 aurelien 207
				} elseif ($this->methode == 'modifier') {
208
					$retour = $service->modifier($this->ressources, $this->parametres);
1706 jpm 209
				} else {
210
					$message = "Le sous-service '{$this->sousServiceNom}' du service '{$this->serviceNom}' ".
211
						"ne possède pas de méthode '{$this->methode}' !";
212
					$code = RestServeur::HTTP_NON_IMPLEMENTE;
213
					throw new Exception($message, $code);
787 delphine 214
				}
755 gduche 215
			}
216
		}
1684 jpm 217
 
755 gduche 218
		if (is_null($service)) {
1684 jpm 219
			$ressource = $this->sousServiceNom.'/'.implode('/', $this->ressources);
220
			$message = "Le classe '$classe' correspondant à la ressource '$ressource' ".
221
				"n'existe pas dans le service '{$this->serviceNom}' !";
755 gduche 222
			$code = RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE;
223
			throw new Exception($message, $code);
224
		}
225
		return $retour;
226
	}
227
 
228
	private function obtenirNomClasseService($mot) {
229
		$classeNom = str_replace(' ', '', ucwords(strtolower(str_replace('-', ' ', $mot))));
230
		return $classeNom;
231
	}
1684 jpm 232
}