Subversion Repositories eFlore/Applications.del

Rev

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

<?php
// declare(encoding='UTF-8');
/**
 * Web service permetant d'ajouter ou de modifier les votes associés aux propositions d'une observation.
 *
 * @category   DEL
 * @package    Services
 * @subpackage Observations
 * @version    0.1
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
 */

class VoteObservation extends RestService {
        private $conteneur;
        private $bdd;
        private $navigation;
        private $mapping;
        private $ressources;
        private $parametres;

        public function __construct(Conteneur $conteneur = null) {
                $this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
                $this->bdd = $this->conteneur->getBdd();
                $this->navigation = $conteneur->getNavigation();

                $this->mapping = $this->conteneur->getParametreTableau('votes.mapping');
        }

        public function consulter($ressources, $parametres) {
                $this->ressources = $ressources;
                $this->parametres = $parametres;

                $votes = $this->chargerVotes();
                $this->conteneur->getNavigation()->setTotal(count($votes));
                // Mettre en forme le résultat et l'envoyer pour affichage
                $resultat = new ResultatService();
                $resultat->corps = array('entete' => $this->navigation->getEntete(), 'resultats' => $votes);
                return $resultat;
        }

        private function chargerVotes() {
                $idCommentaireP = $this->bdd->proteger($this->ressources[1]);
                $requete = 'SELECT * '.
                        'FROM del_commentaire_vote '.
                        "WHERE ce_proposition = $idCommentaireP ";
                        ' -- '.__FILE__.':'.__LINE__;
                $resultats = $this->bdd->recupererTous($requete);
                $votes = array();
                foreach ($resultats as $vote) {
                        $votes[$vote['id_vote']] = $this->formaterVotes($vote);
                        $utilisateur = $this->chercherUtilisateur($vote['ce_utilisateur']);
                        if (count($utilisateur) > 0) {
                                $votes[$vote['id_vote']] = array_merge($votes[$vote['id_vote']], $utilisateur);
                        }
                }
                return $votes;
        }

        private function formaterVotes($vote) {
                $retour = array();
                foreach ($vote as $param => $valeur) {
                        $retour[$this->mapping[$param]] = $valeur;
                }
                return $retour;
        }

        private function chercherUtilisateur($id) {
                // par défaut, pas d'info
                $utilisateur = array();
                // Si l'id utilisateur est un hash de session, on ne cherche rien
                if (is_numeric($id)) {
                        $idUtilisateurP = $this->bdd->proteger($id);
                        $requete = "SELECT id_utilisateur AS 'auteur.id', nom AS 'auteur.nom', prenom AS 'auteur.prenom', ".
                                "courriel AS 'auteur.courriel' ".
                                'FROM del_utilisateur '.
                                "WHERE id_utilisateur = $idUtilisateurP ".
                                ' -- '.__FILE__.':'.__LINE__;
                        $utilisateur = $this->bdd->recuperer($requete);
                }
                return $utilisateur;
        }

        public function ajouter($ressources, $parametres) {
                $this->ressources = $ressources;
                $this->parametres = $parametres;
                $this->verifierParametresAjoutModif();

                // Vérifie si la proposition existe, et la crée sinon
                // (cas du vote sur la proposition fabriquée à partir de l'observation originale)
                $idProposition = $this->ressources[1];
                if ($idProposition == 0) {
                        $idProposition = $this->creerPropositionDeterminationInitiale($idProposition);
                }
                $idVote = $this->ajouterVote();
                if ($idVote) {
                        $resultat = new ResultatService();
                        $resultat->corps = array('id_vote' => $idVote);
                        return $resultat;
                }
                return false;
        }

        private function ajouterVote() {
                $idObsP = $this->bdd->proteger($this->ressources[0]);
                $idPropositionP = $this->bdd->proteger($this->ressources[1]);
                $idUtilisateurP = $this->bdd->proteger($this->parametres['utilisateur']);
                $valeurP = $this->bdd->proteger($this->parametres['valeur']);
                $requete = 'INSERT INTO del_commentaire_vote (ce_proposition , ce_utilisateur , valeur , date) '.
                        "VALUES ($idPropositionP, $idUtilisateurP, $valeurP, NOW()) ".
                        ' -- '.__FILE__.' : '.__LINE__;

                $resultat = $this->bdd->executer($requete);
                if ($resultat === false) {
                        $msg = "Un problème est survenu lors de l'ajout d'un vote.";
                        throw new Exception($msg, RestServeur::HTTP_CODE_ERREUR);
                } else if ($resultat === 0) {
                        $msg = "Aucun vote ne correspond au critères fournis : ".
                                "idObs -> $idObsP, idProposition -> $idPropositionP et id_utilisateur -> $idUtilisateurP.";
                        throw new Exception($msg, RestServeur::HTTP_CODE_RESSOURCE_INTROUVABLE);
                }
                // ATTENTION : idVote doit être récupéré avant toute nouvelle requete !
                $idVote = $this->bdd->recupererIdDernierAjout();
                return $idVote;
        }

        private function creerPropositionDeterminationInitiale($id_observation) {
                $proposition_existe = $this->propositionInitialeExiste($id_observation);
                if ($proposition_existe === false) {
                        $id_proposition = $this->creerPropositionAPartirObservation($id_observation);
                } else {
                        $requete = 'SELECT id_commentaire '.
                                'FROM del_commentaire '.
                                "WHERE ce_observation = $id_observation ".
                                'AND proposition_initiale = 1 '.
                                ' -- '.__FILE__.' : '.__LINE__;
                        $resultat = $this->bdd->recuperer($requete);
                        $id_proposition = $resultat['id_commentaire'];
                }
                return $id_proposition;
        }

        private function propositionInitialeExiste($id_observation) {
                $requete = 'SELECT COUNT(*) >= 1 AS existe '.
                        'FROM del_commentaire '.
                        "WHERE ce_observation = $id_observation ".
                        'AND proposition_initiale = 1 '.
                        ' -- '.__FILE__.' : '.__LINE__;
                $resultat = $this->bdd->recuperer($requete);
                return $resultat['existe'] == 1;
        }

        private function creerPropositionAPartirObservation($id_observation) {
                $idObservationP = $this->bdd->proteger($id_observation);
                $requete = '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, date, proposition_initiale) '.
                        'SELECT id_observation, ce_utilisateur, prenom, nom, '.
                        '               courriel, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, '.
                        "               nt, famille, 'bdtfx_v1', NOW(), '1' ".
                        'FROM del_observation do '.
                        '       LEFT JOIN del_utilisateur du ON (do.ce_utilisateur = du.id_utilisateur) '.
                        "WHERE id_observation = $idObservationP ".
                        ' -- '.__FILE__.' : '.__LINE__;

                $this->bdd->executer($requete);

                // 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;
        }

        public function modifier($ressources, $parametres) {
                $this->ressources = $ressources;
                $this->parametres = $parametres;
                $this->verifierParametresAjoutModif();

                // 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)
                $idProposition = $this->ressources[1];
                if ($idProposition == 0) {
                        $idProposition = $this->renvoyerIdOuCreerPropositionDeterminationInitiale($idProposition);
                        if ($idProposition == null) {
                                $msg = "Aucun identifiant de proposition n'est lié à cette observation.";
                                throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                        }
                }
                $idPropositionP = $this->bdd->proteger($idProposition);
                $idUtilisateurP = $this->bdd->proteger($parametres['utilisateur']);
                $valeurP = $this->bdd->proteger($parametres['valeur']);
                $requete = 'UPDATE del_commentaire_vote '.
                        "SET valeur = $valeurP, date = NOW() ".
                        "WHERE ce_proposition = $idPropositionP AND ce_utilisateur = $idUtilisateurP ".
                        ' -- '.__FILE__.' : '.__LINE__;

                $resultats = $this->bdd->requeter($requete);
                if ($resultats == false) {
                        RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                } else {
                        RestServeur::envoyerEnteteStatutHttp(RestServeur::HTTP_CODE_OK);
                }
        }

        private function verifierParametresAjoutModif() {
                $erreurs = array();

                if (!isset($this->parametres['utilisateur'])) {
                        $erreurs[] = 'Paramètre "utilisateur" manquant.';
                }

                if (!isset($this->parametres['valeur'])) {
                        $erreurs[] = 'Paramètre "valeur" manquant.';
                } else {
                        if (!is_numeric($this->parametres['valeur'])) {
                                $erreurs[] = 'Le paramètre "valeur" doit être numérique.';
                        } elseif($this->parametres['valeur'] != 0 && $this->parametres['valeur'] != 1) {
                                $erreurs[] = 'Le paramètre "valeur" ne peut prendre que la valeur 0 ou 1.';
                        }
                }

                if (!empty($erreurs)) {
                        $msg = "Erreur lors de la configuration : \n".implode("\n", $erreurs);
                        throw new Exception($msg, RestServeur::HTTP_CODE_MAUVAISE_REQUETE);
                }
        }
}