Subversion Repositories eFlore/Applications.del

Rev

Rev 855 | Rev 910 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Les web service permet d'ajouter ou de modifier les votes associés aux propositions d'une observation
 *
 * @category    php 5.2
 * @package     del
 * @subpackage images
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @copyright   Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
 * @license     http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
 * @license     http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
 * @version     $Id: Bdd.php 403 2012-02-22 14:35:20Z gduche $
 * @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=ApiIdentiplante01Images
 */

class VoteObservation extends RestService {
        protected $conteneur;
        protected $gestionBdd;
        protected $bdd;
        
        public function __construct(Conteneur $conteneur = null) {
                $this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
                $this->gestionBdd = $conteneur->getGestionBdd();
                $this->bdd = $this->gestionBdd->getBdd();
        }
        
        /**
         * Méthode seulement présente pour interdire proprement l'accès à la consultation
         * */
        public function consulter($ressources, $parametres) {
                RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_METHODE_NON_AUTORISE);
                RestServeur::ajouterMessage("Le service 'observation/#id/#id_proposition/vote' n'autorise pas la consultation.");
        }
        
        /**
        * Ajoute un vote à une proposition grâce aux informations passées en paramètres
        * @param array $ressources tableau des informations contenues dans l'url après le nom du service
        * @param array $parametres contenu du post
        * 
        * @return void
        *
        * */
        public function ajouter($ressources, $parametres) {

                $this->verifierParametresAjoutModif($ressources, $parametres);

                // Vérifie si la proposition existe, et la crée sinon
                // (cas du vote sur la proposition fabriquée à partir de l'observation originale)
                if($ressources[1] == 0) {
                        $ressources[1] = $this->creerPropositionAPartirObservation($ressources[0]);
                }
                
                $insertion = 'INSERT INTO del_commentaire_vote '.
                                                        '(ce_proposition , ce_utilisateur , valeur , date) '.
                                                        'VALUES ('.$this->proteger($ressources[1]).','.$this->proteger($parametres['utilisateur']).','.
                                                        $this->proteger($parametres['valeur']).', NOW());';
                $resultatsVotes = $this->bdd->requeter($insertion);
                if ($resultatsVotes == false) {
                        RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                } else {
                        RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_CREATION_OK);
                }
        }
        
        private function renvoyerIdPropositionObservation($id_observation) {
                
                $id_commentaire = null;
                // Récupération de l'utilisateur + nom sel de l'observation originale
                $requete_selection_obs = 'SELECT ce_utilisateur, nom_sel '.
                                           'FROM del_observation '.
                                           'WHERE id_observation ='.$this->proteger($id_observation);
                
                $obs = $this->bdd->recuperer($requete_selection_obs);
        
                if(is_array($obs) && isset($obs['ce_utilisateur'])) {
                        // On considère que la proposition faite par le même utilisateur et ayant le même
                        // nom sélectionné est bien la proposition composée à partir de l'obs originale 
                        $requete_selection_comm = 'SELECT id_commentaire FROM del_commentaire '.
                                   'WHERE ce_observation = '.$this->proteger($id_observation).' '.
                                   ' AND nom_sel = '.$this->proteger($obs['nom_sel']).' AND '.
                                           ' ce_utilisateur = '.$this->proteger($obs['ce_utilisateur']);
                        
                        $commentaire = $this->bdd->recuperer($requete_selection_comm);
                        $id_commentaire = (is_array($commentaire) && $commentaire['id_commentaire'] != null) ? $commentaire['id_commentaire'] : null;
                }       
                
                return $id_commentaire;
        }
        
        private function creerPropositionAPartirObservation($id_observation) {
                                
                $insertion = 'INSERT IGNORE INTO del_commentaire '.
                        '(ce_observation, ce_utilisateur, utilisateur_prenom, utilisateur_nom, utilisateur_courriel, '.
                        'nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, nom_referentiel) '.
                        'SELECT id_observation, ce_utilisateur, prenom, nom, '.
                        '               courriel, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, '.
                        '               nt, famille, "bdtfx_v1" '.
                        'FROM del_observation do '.
                                ' LEFT JOIN del_utilisateur du ON '.
                                'do.ce_utilisateur = du.id_utilisateur '.
                        'WHERE id_observation = '.$this->proteger($id_observation);
                                
                $resultat = $this->bdd->requeter($insertion);
                // Attention à l'abstraction utilisée, récupérer le dernier id en mysql ou msqli ça marche bien, mais pour d'autres moins
                $id = $this->bdd->recupererIdDernierAjout();
                
                return $id;
        }
        
        /**
        * Modifie un vote associé à une proposition grâce aux informations passées en paramètres
        * @param array $ressources tableau des informations contenues dans l'url après le nom du service
        * @param array $parametres contenu du post
        *
        * @return void
        *
        * */
        public function modifier($ressources, $parametres) {
                
                $this->verifierParametresAjoutModif($ressources, $parametres);
                
                // Si l'identifiant de proposition vaut 0, c'est un vote sur une proposition
                // fabriquée à partir de l'observation originale, dont on doit obtenir l'id
                // (cas où l'on vient de voter pour celle et cela a créé la proposition, puis 
                // on revote pour celle ci en changeant d'avis sans recharger la page)
                if($ressources[1] == 0) {
                        $id_proposition = $this->renvoyerIdPropositionObservation($ressources[0]);
                        if($id_proposition == null) {
                                $this->envoyerMessageErreurIdProposition();
                                exit;
                        } else {
                                $ressources[1] = $id_proposition;
                        }
                }
                
                $modification = 'UPDATE del_commentaire_vote '.
                                                'SET valeur ='.$this->proteger($parametres['valeur']).', '.
                                                'date = NOW() '.
                                                'WHERE '.
                                                        'ce_proposition = '.$this->proteger($ressources[1]).' AND '.
                                                        'ce_utilisateur = '.$this->proteger($parametres['utilisateur']);
                
                $resultatsVotes = $this->bdd->requeter($modification);
                if ($resultatsVotes == false) {
                        RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                } else {
                        RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK);
                }
        }
        
        public function verifierParametresAjoutModif($ressources, $parametres) {
                $erreurs = array();
                if (!is_numeric($ressources[1])) {
                        $erreurs[] = '- le paramètre indiquant l\'identifiant de la proposition doit être numérique ;';
                }
                        
                if (!isset($parametres['utilisateur'])) {
                        $erreurs[] = '- paramètre "utilisateur" manquant ;';
                }
                        
                if (!isset($parametres['valeur'])) {
                        $erreurs[] = '- paramètre "valeur" manquant ;';
                } else {
                        if (!is_numeric($parametres['valeur'])) {
                                $erreurs[] = '- le paramètre "valeur" doit être numérique ;';
                        } elseif($parametres['valeur'] != 0 && $parametres['valeur'] != 1) {
                                $erreurs[] = '- le paramètre "valeur" ne peut prendre que la valeur 0 ou 1 ;';
                        }
                }
                        
                if (!empty($erreurs)) {
                        $e = 'Erreur lors de la configuration : '."\n";
                        $e .= implode("\n", $erreurs);
                        RestServeur::ajouterMessage($e);
                        throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
                }
        }
        
        protected function envoyerMessageErreurIdProposition() {
                $erreurs = array('Aucun identifiant de proposition n\'est lié à cette observation');
                $e = 'Erreur lors de la configuration : '."\n";
                $e .= implode("\n", $erreurs);
                RestServeur::ajouterMessage($e);
                throw new Exception($e, RestServeur::HTTP_CODE_ERREUR);
        }
        
        protected function proteger($valeur) {
                if (is_array($valeur)) {
                        return $this->bdd->protegerTableau($valeur);
                } else {
                        return $this->bdd->proteger($valeur);
                }
        }
}
?>