source: spip-zone/_plugins_/svp_api/trunk/http/svp.php @ 96818

Last change on this file since 96818 was 96818, checked in by eric@…, 5 years ago

Ajout d'une collection depots qui renvoie tous les objets dépôts hébergés par le serveur SVP.
Pour tous les objets renvoyés on désérialise les champs sérialisés et on présente les champs multi comme des tableaux.
Pour la peine on passe en 0.2.0

  • Property svn:eol-style set to native
File size: 8.4 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) {
5        return;
6}
7
8/*
9 * Implémentation d'un serveur REST pour SVP
10 */
11
12/**
13 * Traitement des erreurs directements détectées par le serveur HTTP abstrait.
14 * Elles sont mises au format de l'API SVP et fournie au client en JSON.
15 *
16 * @param int $code
17 *        Le code HTTP de l'erreur à générer
18 *
19 * @return string
20 *        Retourne une chaîne vide
21 */
22function http_svp_erreur_dist($code, $requete, $reponse) {
23
24        include_spip('inc/svpapi_reponse');
25
26        // Construction du contenu de la réponse:
27        // Comme l'erreur est détectée par le serveur HTTP abstrait, le contenu n'est pas initialisé.
28        // Il faut donc l'initialiser selon la structure imposée par l'API.
29        $contenu = reponse_initialiser_contenu($requete);
30
31        // Description de l'erreur : pour les messages, on utilise ceux du plugin serveur HTTP abstrait.
32        $contenu['erreur']['status'] = $code;
33        $contenu['erreur']['type'] = '';
34        $contenu['erreur']['title'] = _T('http:erreur_' . $contenu['erreur']['status'] . '_titre');
35        $contenu['erreur']['detail'] = _T('http:erreur_' . $contenu['erreur']['status'] . '_message');
36
37        // Détermination du format de la réponse. Etant donné que l'on traite déjà une erreur, on ne se préoccupe pas
38        // pas d'une éventuelle erreur sur le format, on utilisera dans ce cas le JSON.
39        $format_reponse = 'json';
40        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
41                // On positionne le format de sortie car on sait que celui demandé est valide
42                $format_reponse = $contenu['requete']['format'];
43        }
44
45        // Finaliser la réponse selon le format demandé.
46        $reponse = reponse_construire($reponse, $contenu, $format_reponse);
47
48        return $reponse;
49}
50
51
52/**
53 * Fait un GET sur une collection de plugins.
54 * La requête est du type /svp/plugins et renvoie les objets plugin contenu dans la base du serveur (hors les plugins
55 * installés). Il est possible de filtrer cette requête par catégorie /svp/plugins&categorie=outil et/ou par
56 * compatibilité SPIP.
57 *
58 * @param object $requete
59 *        Objet matérialisant la requête faite au serveur SVP.
60 * @param object $reponse
61 *        Objet matérialisant la réponse telle qu'initialisée par le serveur HTTP abstrait. Cet objet sera
62 *        complétée avant d'être retourné par la fonction.
63 *
64 * @return object
65 *        Objet réponse complétée (status, contenu de la ressource...).
66 *        La fonction peut lever une erreur sur le format de sortie, la collection et sur les critères de filtre,
67 *        catégorie et compatibilité SPIP.
68 */
69function http_svp_get_collection_dist($requete, $reponse) {
70
71        include_spip('inc/svpapi_requete');
72        include_spip('inc/svpapi_reponse');
73
74        // Initialisation du format de sortie du contenu de la réponse, du bloc d'erreur et du format de sortie en JSON
75        $contenu = reponse_initialiser_contenu($requete);
76        $erreur = array();
77        $format_reponse = 'json';
78
79        // Vérification du format de sortie demandé
80        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
81                // On positionne cette fois le format de sortie car on sait que celui demandé est valide
82                $format_reponse = $contenu['requete']['format'];
83                // Vérification du nom de la collection
84                if (requete_verifier_collection($contenu['requete']['collection'], $erreur)) {
85                        $items = array();
86                        // On vérifie les critères de filtre additionnels si la requête en contient
87                        $where = array();
88                        if (requete_verifier_criteres($contenu['requete']['criteres'], $erreur)) {
89                                // Si il y a des critères additionnels on complète le where en conséquence
90                                if ($contenu['requete']['criteres']) {
91                                        foreach ($contenu['requete']['criteres'] as $_critere => $_valeur) {
92                                                if ($_critere == 'compatible_spip') {
93                                                        $f_critere = charger_fonction('where_compatible_spip', 'inc');
94                                                        $where[] = $f_critere($_valeur, 'spip_plugins', '>');
95                                                } else {
96                                                        $where[] = "spip_plugins.${_critere}=" . sql_quote($_valeur);
97                                                }
98                                        }
99                                }
100
101                                // Récupération de la collection spécifiée en fonction des critères appliqués
102                                $collectionner = 'reponse_collectionner_' . $contenu['requete']['collection'];
103                                $items = $collectionner($where);
104
105                                $contenu['items'] = $items;
106                        }
107                }
108        }
109
110        // Si la réponse est une erreur, on complète le contenu avec les informations issues de la
111        // vérification, le titre et le détail de l'erreur.
112        if ($erreur) {
113                $contenu['erreur'] = array_merge($contenu['erreur'], $erreur);
114                $contenu['erreur'] = array_merge($contenu['erreur'], reponse_expliquer_erreur($contenu['erreur']));
115        }
116
117        // Construction de la réponse finale
118        $reponse = reponse_construire($reponse, $contenu, $format_reponse);
119
120        return $reponse;
121}
122
123
124/**
125 * Fait un GET sur une ressource de type plugin identifié par son préfixe.
126 *
127 * @param object $requete
128 *        Objet matérialisant la requête faite au serveur SVP.
129 * @param object $reponse
130 *        Objet matérialisant la réponse telle qu'initialisée par le serveur HTTP abstrait. Cet objet sera
131 *        complétée avant d'être retourné par la fonction.
132 *
133 * @return object
134 *        Objet réponse complétée (status, contenu de la ressource...).
135 */
136function http_svp_get_ressource_dist($requete, $reponse) {
137
138        include_spip('inc/svpapi_requete');
139        include_spip('inc/svpapi_reponse');
140
141        // Initialisation du format de sortie du contenu de la réponse, du bloc d'erreur et du format de sortie en JSON
142        $contenu = reponse_initialiser_contenu($requete);
143        $erreur = array();
144        $format_reponse = 'json';
145
146        // Vérification du format de sortie demandé
147        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
148                // On positionne le format de sortie qui sera utilisé car on sait que celui demandé est valide
149                $format_reponse = $contenu['requete']['format'];
150                // Vérification du nom de la collection
151                if (requete_verifier_ressource($contenu['requete']['collection'], $erreur)) {
152                        // Vérification du préfixe de la ressource
153                        if (requete_verifier_prefixe($contenu['requete']['ressource'], $erreur)) {
154                                $prefixe = strtoupper($contenu['requete']['ressource']);
155                                $items = array();
156                                // On recherche d'abord le plugin par son préfixe dans la table spip_plugins en vérifiant que
157                                // c'est bien un plugin fourni pas un dépôt et pas un plugin installé sur le serveur uniquement
158                                $from = array('spip_plugins', 'spip_depots_plugins AS dp');
159                                $select = array('*');
160                                $where = array(
161                                        'prefixe=' . sql_quote($prefixe),
162                                        'dp.id_depot>0',
163                                        'dp.id_plugin=spip_plugins.id_plugin'
164                                );
165                                $group_by = array('spip_plugins.id_plugin');
166                                $plugin = sql_fetsel($select, $from, $where, $group_by);
167                                if ($plugin) {
168                                        // On refactore le tableau de sortie du fetsel en supprimant les colonnes id_depot et id_plugin qui ne
169                                        // sont d'aucune utilité pour le service.
170                                        unset($plugin['id_plugin']);
171                                        unset($plugin['id_depot']);
172                                        $items['plugin'] = normaliser_champs('plugin', $plugin);
173
174                                        // On recherche maintenant les paquets du plugin
175                                        $from = array('spip_paquets');
176                                        $select = array('*');
177                                        $where = array(
178                                                'prefixe=' . sql_quote($prefixe),
179                                                'id_depot>0'
180                                        );
181                                        $paquets = sql_allfetsel($select, $from, $where);
182                                        $items['paquets'] = array();
183                                        if ($paquets) {
184                                                // On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par archives zip.
185                                                $champs_inutiles = array(
186                                                        'id_paquet', 'id_plugin', 'id_depot',
187                                                        'actif', 'installe', 'recent', 'maj_version', 'superieur', 'obsolete', 'attente', 'constante', 'signature'
188                                                );
189                                                foreach ($paquets as $_paquet) {
190                                                        foreach ($champs_inutiles as $_champ) {
191                                                                unset($_paquet[$_champ]);
192                                                        }
193                                                        $items['paquets'][$_paquet['nom_archive']] = normaliser_champs('paquet', $_paquet);
194                                                }
195                                        }
196                                } else {
197                                        // On renvoie une erreur 404 pour indiquer que le plugin n'existe pas
198                                        $erreur = array(
199                                                'status'  => 404,
200                                                'type'    => 'plugin_nok',
201                                                'element' => 'plugin',
202                                                'valeur'  => $contenu['requete']['ressource']
203                                        );
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
220        return $reponse;
221}
Note: See TracBrowser for help on using the repository browser.