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

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

L'index du bloc erreur est status et non statut.

  • Property svn:eol-style set to native
File size: 8.8 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                        // Récupération de la collection en fonction des critères appliqués
87                        $from = array('spip_plugins', 'spip_depots_plugins AS dp');
88                        $select = array('*');
89                        $where = array('dp.id_depot>0', 'dp.id_plugin=spip_plugins.id_plugin');
90                        $group_by = array('spip_plugins.id_plugin');
91                        // On vérifie les critères de filtre additionnels
92                        if (requete_verifier_criteres($contenu['requete']['criteres'], $erreur)) {
93                                // Si il y a des critères additionnels on complète le where en conséquence
94                                if ($contenu['requete']['criteres']) {
95                                        foreach ($contenu['requete']['criteres'] as $_critere => $_valeur) {
96                                                if ($_critere == 'compatible_spip') {
97                                                        $f_critere = charger_fonction('where_compatible_spip', 'inc');
98                                                        $where[] = $f_critere($_valeur, 'spip_plugins', '>');
99                                                } else {
100                                                        $where[] = "spip_plugins.${_critere}=" . sql_quote(${_valeur});
101                                                }
102                                        }
103                                }
104                                $plugins = sql_allfetsel($select, $from, $where, $group_by);
105                                if ($plugins) {
106                                        // On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par les préfixes.
107                                        foreach ($plugins as $_plugin) {
108                                                unset($_plugin['id_plugin']);
109                                                unset($_plugin['id_depot']);
110                                                $items[$_plugin['prefixe']] = $_plugin;
111                                        }
112                                }
113                                $contenu['items'] = $items;
114                                $contenu['nb_plugins'] = count($items);
115                        }
116                }
117        }
118
119        // Si la réponse est une erreur, on complète le contenu avec les informations issues de la
120        // vérification, le titre et le détail de l'erreur.
121        if ($erreur) {
122                $contenu['erreur'] = array_merge($contenu['erreur'], $erreur);
123                $contenu['erreur'] = array_merge($contenu['erreur'], reponse_expliquer_erreur($contenu['erreur']));
124        }
125
126        // Construction de la réponse finale
127        $reponse = reponse_construire($reponse, $contenu, $format_reponse);
128
129        return $reponse;
130}
131
132
133/**
134 * Fait un GET sur une ressource de type plugin identifié par son préfixe.
135 *
136 * @param object $requete
137 *        Objet matérialisant la requête faite au serveur SVP.
138 * @param object $reponse
139 *        Objet matérialisant la réponse telle qu'initialisée par le serveur HTTP abstrait. Cet objet sera
140 *        complétée avant d'être retourné par la fonction.
141 *
142 * @return object
143 *        Objet réponse complétée (status, contenu de la ressource...).
144 */
145function http_svp_get_ressource_dist($requete, $reponse) {
146
147        include_spip('inc/svpapi_requete');
148        include_spip('inc/svpapi_reponse');
149
150        // Initialisation du format de sortie du contenu de la réponse, du bloc d'erreur et du format de sortie en JSON
151        $contenu = reponse_initialiser_contenu($requete);
152        $erreur = array();
153        $format_reponse = 'json';
154
155        // Vérification du format de sortie demandé
156        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
157                // On positionne le format de sortie qui sera utilisé car on sait que celui demandé est valide
158                $format_reponse = $contenu['requete']['format'];
159                // Vérification du nom de la collection
160                if (requete_verifier_ressource($contenu['requete']['collection'], $erreur)) {
161                        // Vérification du préfixe de la ressource
162                        if (requete_verifier_prefixe($contenu['requete']['ressource'], $erreur)) {
163                                $prefixe = strtoupper($contenu['requete']['ressource']);
164                                $items = array();
165                                // On recherche d'abord le plugin par son préfixe dans la table spip_plugins en vérifiant que
166                                // c'est bien un plugin fourni pas un dépôt et pas un plugin installé sur le serveur uniquement
167                                $from = array('spip_plugins', 'spip_depots_plugins AS dp');
168                                $select = array('*');
169                                $where = array(
170                                        'prefixe=' . sql_quote($prefixe),
171                                        'dp.id_depot>0',
172                                        'dp.id_plugin=spip_plugins.id_plugin'
173                                );
174                                $group_by = array('spip_plugins.id_plugin');
175                                $plugin = sql_fetsel($select, $from, $where, $group_by);
176                                if ($plugin) {
177                                        // On refactore le tableau de sortie du fetsel en supprimant les colonnes id_depot et id_plugin qui ne
178                                        // sont d'aucune utilité pour le service.
179                                        unset($plugin['id_plugin']);
180                                        unset($plugin['id_depot']);
181                                        $items['plugin'] = $plugin;
182
183                                        // On recherche maintenant les paquets du plugin
184                                        $from = array('spip_paquets');
185                                        $select = array('*');
186                                        $where = array(
187                                                'prefixe=' . sql_quote($prefixe),
188                                                'id_depot>0'
189                                        );
190                                        $paquets = sql_allfetsel($select, $from, $where);
191                                        $items['paquets'] = array();
192                                        if ($paquets) {
193                                                // On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par archives zip.
194                                                $champs_inutiles = array(
195                                                        'id_paquet', 'id_plugin', 'id_depot',
196                                                        'actif', 'installe', 'recent', 'maj_version', 'superieur', 'obsolete', 'attente', 'constante', 'signature'
197                                                );
198                                                foreach ($paquets as $_paquet) {
199                                                        foreach ($champs_inutiles as $_champ) {
200                                                                unset($_paquet[$_champ]);
201                                                        }
202                                                        $items['paquets'][$_paquet['nom_archive']] = $_paquet;
203                                                }
204                                        }
205                                } else {
206                                        // On renvoie une erreur 404 pour indiquer que le plugin n'existe pas
207                                        $erreur = array(
208                                                'status'  => 404,
209                                                'type'    => 'plugin_nok',
210                                                'element' => 'plugin',
211                                                'valeur'  => $contenu['requete']['ressource']
212                                        );
213                                }
214                                $contenu['items'] = $items;
215                        }
216                }
217        }
218
219        // Si la réponse est une erreur, on complète le contenu avec les informations issues de la
220        // vérification, le titre et le détail de l'erreur.
221        if ($erreur) {
222                $contenu['erreur'] = array_merge($contenu['erreur'], $erreur);
223                $contenu['erreur'] = array_merge($contenu['erreur'], reponse_expliquer_erreur($contenu['erreur']));
224        }
225
226        // Construction de la réponse finale
227        $reponse = reponse_construire($reponse, $contenu, $format_reponse);
228
229        return $reponse;
230}
Note: See TracBrowser for help on using the repository browser.