Changeset 96784 in spip-zone


Ignore:
Timestamp:
Apr 24, 2016, 7:12:56 PM (3 years ago)
Author:
eric@…
Message:

Quelques mises au point de l'api collection de plugins.
Ajout de l'api ressource sur un plugin.
On renvoie le plugin lui-même et ses paquets.
Une première version à tester.

Location:
_plugins_/svp_api/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/svp_api/trunk/http/svp.php

    r96783 r96784  
    1010
    1111/**
    12  * Rien, car en Atom il n'y a malheureusement pas de gestion des erreurs pour l'instant
     12 * Traitement des erreurs directements détectées par le serveur HTTP abstrait.
     13 * Elles sont mises au format de l'API SVP et fournie au client en JSON.
    1314 *
    1415 * @param int $code Le code HTTP de l'erreur à générer
     
    1920        include_spip('inc/svpapi_reponse');
    2021
    21         // Construction du contenu de la réponse. Deux cas possibles:
    22         // -- erreur détectée par le serveur HTTP abstrait : le contenu n'est pas initialisé
    23         //    et on utilise les messages générique du serveur HTTP
     22        // Construction du contenu de la réponse:
     23        // Comme l'erreur est détectée par le serveur HTTP abstrait, le contenu n'est pas initialisé.
     24        // Il faut donc l'initialiser selon la structure imposée par l'API.
    2425        $contenu = reponse_initialiser_contenu($requete);
    2526
     27        // Description de l'erreur : pour les messages, on utilise ceux du plugin serveur HTTP abstrait.
    2628        $contenu['erreur']['statut'] = $code;
    2729        $contenu['erreur']['type'] = '';
     
    2931        $contenu['erreur']['detail'] = _T('http:erreur_' . $contenu['erreur']['statut'] . '_message');
    3032
    31         // Finaliser la réponse
    32         $reponse = reponse_construire($reponse, $contenu);
     33        // Détermination du format de la réponse. Etant donné que l'on traite déjà une erreur, on ne se préoccupe pas
     34        // pas d'une éventuelle erreur sur le format, on utilisera dans ce cas le JSON.
     35        $format_reponse = 'json';
     36        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
     37                // On positionne le format de sortie car on sait que celui demandé est valide
     38                $format_reponse = $contenu['requete']['format'];
     39        }
     40
     41        // Finaliser la réponse selon le format demandé.
     42        $reponse = reponse_construire($reponse, $contenu, $format_reponse);
    3343
    3444        return $reponse;
     
    5767        include_spip('inc/svpapi_reponse');
    5868
    59         // Initialisation du format de sortie du contenu de la réponse
     69        // Initialisation du format de sortie du contenu de la réponse, du bloc d'erreur et du format de sortie en JSON
    6070        $contenu = reponse_initialiser_contenu($requete);
    6171        $erreur = array();
     72        $format_reponse = 'json';
    6273
    6374        // Vérification du format de sortie demandé
    6475        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
    6576                // On positionne cette fois le format de sortie car on sait que celui demandé est valide
    66                 $contenu['format'] = $contenu['requete']['format'];
     77                $format_reponse = $contenu['requete']['format'];
    6778                // Vérification du nom de la collection
    6879                if (requete_verifier_collection($contenu['requete']['collection'], $erreur)) {
     80                        $items = array();
    6981                        // Récupération de la collection en fonction des critères appliqués
    7082                        $from = array('spip_plugins', 'spip_depots_plugins AS dp');
     
    8698                                }
    8799                                $plugins = sql_allfetsel($select, $from, $where, $group_by);
    88                                 $items = array();
    89100                                if ($plugins) {
    90101                                        // On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par les préfixes.
    91102                                        foreach ($plugins as $_plugin) {
    92103                                                unset($_plugin['id_plugin']);
     104                                                unset($_plugin['id_depot']);
    93105                                                $items[$_plugin['prefixe']] = $_plugin;
    94106                                        }
    95107                                }
    96108                                $contenu['items'] = $items;
    97                                 $contenu['nb_items'] = count($items);
     109                                $contenu['nb_plugins'] = count($items);
    98110                        }
    99111                }
    100112        }
    101113
    102         // Si la réponse est une erreur, on complète le contenu avec les information issues de la
     114        // Si la réponse est une erreur, on complète le contenu avec les informations issues de la
    103115        // vérification, le titre et le détail de l'erreur.
    104116        if ($erreur) {
     
    108120
    109121        // Construction de la réponse finale
    110         $reponse = reponse_construire($reponse, $contenu);
     122        $reponse = reponse_construire($reponse, $contenu, $format_reponse);
    111123
    112124        return $reponse;
     
    127139 */
    128140function http_svp_get_ressource_dist($requete, $reponse){
    129         // Pour l'instant on va simplement chercher un squelette du nom de la ressource
    130         // Le squelette prend en contexte les paramètres du GET + l'identifiant de la ressource en essayant de faire au mieux
    131         include_spip('base/objets');
    132         $collection = $requete->attributes->get('collection');
    133         $ressource = $requete->attributes->get('ressource');
    134         $cle = id_table_objet($collection);
    135         $contexte = array(
    136                 $cle => $ressource,
    137                 'ressource' => $ressource,
    138         );
    139         $contexte = array_merge($requete->query->all(), $contexte);
    140        
    141         if ($flux = recuperer_fond("http/atom/$collection-ressource", $contexte)){
    142                 $reponse->setStatusCode(200);
    143                 $reponse->setCharset('utf-8');
    144                 $reponse->headers->set('Content-Type', 'application/atom+xml');
    145                 $reponse->setContent($flux);
    146         }
    147         // Si on ne trouve rien c'est que ça n'existe pas
    148         else{
    149                 $reponse->setStatusCode(404);
    150         }
    151        
     141
     142        include_spip('inc/svpapi_requete');
     143        include_spip('inc/svpapi_reponse');
     144
     145        // Initialisation du format de sortie du contenu de la réponse, du bloc d'erreur et du format de sortie en JSON
     146        $contenu = reponse_initialiser_contenu($requete);
     147        $erreur = array();
     148        $format_reponse = 'json';
     149
     150        // Vérification du format de sortie demandé
     151        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
     152                // On positionne le format de sortie qui sera utilisé car on sait que celui demandé est valide
     153                $format_reponse = $contenu['requete']['format'];
     154                // Vérification du nom de la collection
     155                if (requete_verifier_ressource($contenu['requete']['collection'], $erreur)) {
     156                        // Vérification du préfixe de la ressource
     157                        if (requete_verifier_prefixe($contenu['requete']['ressource'], $erreur)) {
     158                                $prefixe = strtoupper($contenu['requete']['ressource']);
     159                                $items = array();
     160                                // On recherche d'abord le plugin par son préfixe dans la table spip_plugins en vérifiant que
     161                                // c'est bien un plugin fourni pas un dépôt et pas un plugin installé sur le serveur uniquement
     162                                $from = array('spip_plugins', 'spip_depots_plugins AS dp');
     163                                $select = array('*');
     164                                $where = array(
     165                                        'prefixe=' . sql_quote($prefixe),
     166                                        'dp.id_depot>0',
     167                                        'dp.id_plugin=spip_plugins.id_plugin');
     168                                $group_by = array('spip_plugins.id_plugin');
     169                                $plugin = sql_fetsel($select, $from, $where, $group_by);
     170                                if ($plugin) {
     171                                        // On refactore le tableau de sortie du fetsel en supprimant les colonnes id_depot et id_plugin qui ne
     172                                        // sont d'aucune utilité pour le service.
     173                                        unset($plugin['id_plugin']);
     174                                        unset($plugin['id_depot']);
     175                                        $items['plugin'] = $plugin;
     176
     177                                        // On recherche maintenant les paquets du plugin
     178                                        $from = array('spip_paquets');
     179                                        $select = array('*');
     180                                        $where = array(
     181                                                'prefixe=' . sql_quote($prefixe),
     182                                                'id_depot>0');
     183                                        $paquets = sql_allfetsel($select, $from, $where);
     184                                        $items['paquets'] = array();
     185                                        if ($paquets) {
     186                                                // On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par archives zip.
     187                                                $champs_inutiles = array(
     188                                                        'id_paquet', 'id_plugin', 'id_depot',
     189                                                        'actif', 'installe', 'recent', 'maj_version', 'superieur', 'obsolete', 'attente', 'constante', 'signature');
     190                                                foreach ($paquets as $_paquet) {
     191                                                        foreach ($champs_inutiles as $_champ) {
     192                                                                unset($_paquet[$_champ]);
     193                                                        }
     194                                                        $items['paquets'][$_paquet['nom_archive']] = $_paquet;
     195                                                }
     196                                        }
     197                                } else {
     198                                        // On renvoie une erreur 404 pour indiquer que le plugin n'existe pas
     199                                        $erreur = array(
     200                                                'status'        => 404,
     201                                                'type'          => 'plugin_nok',
     202                                                'element'       => 'plugin',
     203                                                'valeur'        => $contenu['requete']['ressource']);
     204                                }
     205                                $contenu['items'] = $items;
     206                        }
     207                }
     208        }
     209
     210        // Si la réponse est une erreur, on complète le contenu avec les informations issues de la
     211        // vérification, le titre et le détail de l'erreur.
     212        if ($erreur) {
     213                $contenu['erreur'] = array_merge($contenu['erreur'], $erreur);
     214                $contenu['erreur'] = array_merge($contenu['erreur'], reponse_expliquer_erreur($contenu['erreur']));
     215        }
     216
     217        // Construction de la réponse finale
     218        $reponse = reponse_construire($reponse, $contenu, $format_reponse);
     219
    152220        return $reponse;
    153221}
  • _plugins_/svp_api/trunk/inc/svpapi_reponse.php

    r96783 r96784  
    3737                'erreur'        => $erreur,
    3838                'schema'        => $schema,
    39                 'items'         => array(),
    40                 'format'        => 'json');
     39                'items'         => array());
    4140
    4241        return $contenu;
     
    7069 * @return mixed
    7170 */
    72 function reponse_construire($reponse, $contenu) {
     71function reponse_construire($reponse, $contenu, $format_reponse) {
    7372
    7473        $reponse->setCharset('utf-8');
    7574        $reponse->setStatusCode($contenu['erreur']['status']);
    76         $reponse->setContent('');
    7775
    78         if ($contenu['format'] == 'json') {
     76        if ($format_reponse == 'json') {
    7977                $reponse->headers->set('Content-Type', 'application/json');
    8078                $reponse->setContent(json_encode($contenu));
  • _plugins_/svp_api/trunk/inc/svpapi_requete.php

    r96783 r96784  
    11<?php
    22
    3 if (!defined("_ECRIRE_INC_VERSION")) return;
     3if (!defined('_ECRIRE_INC_VERSION')) return;
    44
    55
     
    3232
    3333/**
    34  * Détermine si la valeur du crtière compatibilité SPIP est valide.
    35  * La fonction compare uniquement la structure de la chaine passée qui doit être un numéro de version ou de branche.
     34 * Détermine si la collection demandée est valide.
     35 * Le service ne fournit que la collection plugins.
    3636 *
    3737 * @param string $valeur
    38  *              La valeur du critère compatibilite SPIP
     38 *              La valeur de la collection demandée
    3939 *
    4040 * @return boolean
     
    5454
    5555        return $collection_valide;
     56}
     57
     58
     59/**
     60 * Détermine si la collection demandée est valide.
     61 * Le service ne fournit que la collection plugins.
     62 *
     63 * @param string $valeur
     64 *              La valeur de la collection demandée
     65 *
     66 * @return boolean
     67 *              True si la valeur est valide, false sinon.
     68 */
     69function requete_verifier_ressource($valeur, &$erreur) {
     70        $ressource_valide = true;
     71
     72        if (!in_array($valeur, array('plugin'))) {
     73                $erreur = array(
     74                        'status'        => 400,
     75                        'type'          => 'ressource_nok',
     76                        'element'       => 'ressource',
     77                        'valeur'        => $valeur);
     78                $ressource_valide = false;
     79        }
     80
     81        return $ressource_valide;
     82}
     83
     84
     85/**
     86 * Détermine si la valeur du préfixe de plugin est valide.
     87 * La fonction compare uniquement la structure de la chaine passée qui doit être cohérente avec
     88 * celui d'un nom de variable.
     89 *
     90 * @param string $valeur
     91 *              La valeur du préfixe
     92 *
     93 * @return boolean
     94 *              True si la valeur est valide, false sinon.
     95 */
     96function requete_verifier_prefixe($valeur, &$erreur) {
     97        $prefixe_valide = true;
     98
     99        if (!preg_match('#^(\w){2,}$#', strtolower($valeur))) {
     100                $erreur = array(
     101                        'status'        => 400,
     102                        'type'          => 'prefixe_nok',
     103                        'element'       => 'prefixe',
     104                        'valeur'        => $valeur);
     105                $prefixe_valide = false;
     106        }
     107
     108        return $prefixe_valide;
    56109}
    57110
     
    109162/**
    110163 * Détermine si la valeur du critère compatibilité SPIP est valide.
    111  * La fonction compare uniquement la structure de la chaine passée qui doit être cohérent avec
     164 * La fonction compare uniquement la structure de la chaine passée qui doit être cohérente avec
    112165 * un numéro de version ou de branche.
    113166 *
  • _plugins_/svp_api/trunk/lang/svpapi_fr.php

    r96783 r96784  
    99
    1010        // E
    11         'erreur_400_collection_nok_message' => 'Vous avez demandé une collection qui n\'est pas supportée par le service. SVP ne fournit que des collections de plugins.',
    12         'erreur_400_collection_nok_titre' => 'La collection &#171; @valeur@ &#187 n\'est pas fournie par le service',
    13         'erreur_400_format_nok_message' => 'Vous avez demandé de renvoyer les données dans un format qui n\'est pas supportée par le service. SVP n\'utilise que les formats de sortie JSON et XML.',
    14         'erreur_400_format_nok_titre' => 'Le format &#171; @valeur@ &#187 n\'est pas supporté par le service',
     11        'erreur_400_collection_nok_message' => 'Vous avez demandé une collection qui n\'est pas supportée par ce service. SVP ne fournit que des collections de plugins.',
     12        'erreur_400_collection_nok_titre' => 'La collection &#171; @valeur@ &#187 n\'est pas fournie par ce service',
     13        'erreur_400_format_nok_message' => 'Vous avez demandé de renvoyer les données dans un format qui n\'est pas supportée par ce service. SVP n\'utilise que les formats de sortie JSON et XML.',
     14        'erreur_400_format_nok_titre' => 'Le format &#171; @valeur@ &#187 n\'est pas supporté par ce service',
    1515        'erreur_400_critere_nok_message' => 'Vous avez demandé de filtrer une collection avec un critère dont la valeur est invalide. Veuillez consulter la documentation pour spécifier un critère valide.',
    1616        'erreur_400_critere_nok_titre' => 'La valeur &#171; @valeur@ &#187 du critère &#171; @element@ &#187 est invalide',
     17        'erreur_400_prefixe_nok_message' => 'Vous avez demandé un plugin mais le préfixe spécifié &#171; @valeur@ &#187 est invalide. Un préfixe ne peut contenir que des caractères alphanumériques et le souligné.',
     18        'erreur_400_prefixe_nok_titre' => 'La valeur &#171; @valeur@ &#187 du préfixe de plugin est invalide',
     19        'erreur_400_ressource_nok_message' => 'Vous avez demandé un type de ressource qui n\'est pas supporté par ce service. SVP ne fournit que des ressources de type plugin.',
     20        'erreur_400_ressource_nok_titre' => 'Le type de ressource &#171; @valeur@ &#187 n\'est pas fourni par ce service',
     21        'erreur_404_plugin_nok_message' => 'Vous avez demandé un plugin mais le préfixe spécifié ne correspond à aucun plugin enregistré dans la base de données du serveur. Soit vous avez fait une erreur sur le préfixe, soit le plugin spécifié n\'est pas fourni par un des dépôts enregistrés sur le serveur',
     22        'erreur_404_plugin_nok_titre' => 'Le plugin de préfixe &#171; @valeur@ &#187 n\'est pas disponible sur le serveur',
    1723);
    1824
  • _plugins_/svp_api/trunk/paquet.xml

    r96783 r96784  
    33        categorie="outil"
    44        version="0.1.0"
    5         etat="dev"
     5        etat="test"
    66        compatibilite="[3.0.0;3.1.*]"
    77        logo="svpapi_logo-64.png"
     
    1111        <!-- Une API REST pour interroger un serveur de plugins SVP -->
    1212
    13         <auteur>Eric Lupinacci</auteur>
     13        <auteur lien="http://blog.smellup.net/">Eric Lupinacci</auteur>
    1414
    1515        <licence lien="http://www.gnu.org/licenses/gpl-3.0.html">GNU/GPL</licence>
Note: See TracChangeset for help on using the changeset viewer.