source: spip-zone/_plugins_/svp_api/trunk/inc/verifier_requete_svp.php @ 115829

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

Ajout d'une option de filtre obligatoire et de sa vérification.

  • Property svn:eol-style set to native
File size: 8.3 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble des constantes et fonctions de vérification des éléments d'une requête à
4 * l'API SVP.
5 *
6 * @package SPIP\SVPAPI\REQUETE
7 */
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12
13/**
14 * Détermine si le serveur est capable de répondre aux requêtes SVP.
15 * Pour cela on vérifie si le serveur est en mode run-time ou pas.
16 * On considère qu'un serveur en mode run-time n'est pas valide pour
17 * traiter les requêtes car la liste des plugins et des paquets n'est
18 * pas complète.
19 *
20 * @param &array    $erreur
21 *        Tableau initialisé avec les index identifiant l'erreur ou vide si pas d'erreur.
22 *        Les index mis à jour sont:
23 *        - `status`  : le code de l'erreur HTTP, soit 501
24 *        - `type`    : chaine identifiant l'erreur plus précisément, soit `serveur_nok`
25 *        - `element` : type d'objet sur lequel porte l'erreur, soit `serveur`
26 *        - `valeur`  : la valeur du mode runtime
27 *
28 * @return bool
29 *        `true` si la valeur est valide, `false` sinon.
30 */
31function requete_verifier_serveur(&$erreur) {
32
33        // Initialise le retour à true par défaut.
34        $est_valide = true;
35
36        include_spip('inc/svp_phraser');
37        if (_SVP_MODE_RUNTIME) {
38                $erreur = array(
39                        'status'  => 501,
40                        'type'    => 'serveur_nok',
41                        'element' => 'runtime',
42                        'valeur'  => _SVP_MODE_RUNTIME
43                );
44                $est_valide = false;
45        }
46
47        return $est_valide;
48}
49
50
51/**
52 * Détermine si la collection demandée est valide.
53 * Le service ne fournit que les collections plugins (`plugins`) et dépôts (`depots`).
54 *
55 * @param string $collection
56 *        La valeur de la collection demandée
57 * @param array  $collections
58 *        Configuration des collections disponibles.
59 * @param &array    $erreur
60 *        Tableau initialisé avec les index identifiant l'erreur ou vide si pas d'erreur.
61 *        Les index mis à jour sont:
62 *        - `status`  : le code de l'erreur HTTP, soit 400
63 *        - `type`    : chaine identifiant l'erreur plus précisément, soit collection_nok
64 *        - `element` : type d'objet sur lequel porte l'erreur, soit collection
65 *        - `valeur`  : la valeur de la collection
66 *
67 * @return bool
68 *        `true` si la valeur est valide, `false` sinon.
69 */
70function requete_verifier_collection($collection, $collections, &$erreur) {
71
72        // Initialise le retour à true par défaut.
73        $est_valide = true;
74
75        // Vérification de la disponibilité de la collection demandée.
76        if (!in_array($collection, array_keys($collections))) {
77                $erreur = array(
78                        'status'  => 400,
79                        'type'    => 'collection_nok',
80                        'element' => 'collection',
81                        'valeur'  => $collection,
82                        'extra'   => implode(', ', array_keys($collections))
83                );
84                $est_valide = false;
85        }
86
87        return $est_valide;
88}
89
90
91/**
92 * Détermine si la valeur de chaque critère de filtre d'une collection est valide.
93 * Si plusieurs critères sont fournis, la fonction s'interromp dès qu'elle trouve un
94 * critère non admis ou dont la valeur est invalide.
95 *
96 * @param array  $filtres
97 *        Tableau associatif des critères de filtre (couple nom du critère, valeur du critère)
98 * @param string $collection
99 *        La collection concernée.
100 * @param array  $configuration
101 *        Configuration de la collection concernée. L'index `filtres` contient la liste des critères admissibles
102 *        et l'index `module` contient le nom du fichier des fonctions de service.
103 * @param &array $erreur
104 *        Tableau initialisé avec les index identifiant l'erreur ou vide si pas d'erreur.
105 *        Les index mis à jour sont:
106 *        - `status`  : le code de l'erreur HTTP, soit 400
107 *        - `type`    : chaine identifiant l'erreur plus précisément, soit critere_nok
108 *        - `element` : nom du critère en erreur
109 *        - `valeur`  : valeur du critère
110 *
111 * @return bool
112 *        `true` si la valeur est valide, `false` sinon.
113 */
114function requete_verifier_filtres($filtres, $collection, $configuration, &$erreur) {
115
116        $est_valide = true;
117        $erreur = array();
118
119        // 1- Vérification de l'absence de critère obligatoire.
120        foreach ($configuration['filtres'] as $_filtre) {
121                if (!empty($_filtre['est_obligatoire'])
122                and (!isset($filtres[$_filtre['critere']]))) {
123                        $erreur = array(
124                                'status'  => 400,
125                                'type'    => 'critere_obligatoire_nok',
126                                'element' => 'critere',
127                                'valeur'  => $_filtre['critere']
128                        );
129                        $est_valide = false;
130                        break;
131                }
132        }
133
134        // 2- Véfification des critères fournis
135        if ($est_valide and $filtres) {
136                // On arrête dès qu'une erreur est trouvée et on la reporte.
137                foreach ($filtres as $_critere => $_valeur) {
138                        $extra = '';
139                        // On vérifie si le critère est admis.
140                        $criteres = array_column($configuration['filtres'], null, 'critere');
141                        if (!in_array($_critere, array_keys($criteres))) {
142                                $erreur = array(
143                                        'status'  => 400,
144                                        'type'    => 'critere_nom_nok',
145                                        'element' => 'critere',
146                                        'valeur'  => $_critere,
147                                        'extra'   => implode(', ', array_keys($criteres))
148                                );
149                                $est_valide = false;
150                                break;
151                        } else {
152                                // On vérifie si la valeur du critère est valide :
153                                // -- le critère est vérifié par une fonction spécifique qui est soit liée au critère soit globale à
154                                //    la fonction. Si cette fonction n'existe pas le critère est réputé valide.
155                                $module = !empty($criteres[$_critere]['module'])
156                                        ? $criteres[$_critere]['module']
157                                        : $configuration['module'];
158                                include_spip("svpapi/${module}");
159                                $verifier = "${collection}_verifier_critere_${_critere}";
160                                if (function_exists($verifier)
161                                and !$verifier($_valeur, $extra)) {
162                                        $erreur = array(
163                                                'status'  => 400,
164                                                'type'    => 'critere_valeur_nok',
165                                                'element' => $_critere,
166                                                'valeur'  => $_valeur,
167                                                'extra'   => $extra
168                                        );
169                                        $est_valide = false;
170                                        break;
171                                }
172                        }
173                }
174        }
175
176        return $est_valide;
177}
178
179
180/**
181 * Détermine si le type de ressource demandée est valide.
182 * Le service ne fournit que des ressources de type plugin (`plugins`).
183 *
184 * @param string $ressource
185 *        La valeur de la ressource demandée. La ressource appartient à une collection.
186 * @param string $collection
187 *        La collection concernée.
188 * @param array  $configuration
189 *        Configuration de la collection de la ressource. L'index `ressource` identifie le champ attendu pour désigner
190 *        la ressource et l'index `module` contient le nom du fichier des fonctions de service.
191 * @param &array    $erreur
192 *        Tableau initialisé avec les index identifiant l'erreur ou vide si pas d'erreur.
193 *        Les index mis à jour sont:
194 *        - `status`  : le code de l'erreur HTTP, soit 400
195 *        - `type`    : chaine identifiant l'erreur plus précisément, soit ressource_nok
196 *        - `element` : type d'objet sur lequel porte l'erreur, soit ressource
197 *        - `valeur`  : la valeur de la ressource
198 *
199 * @return bool
200 *        `true` si la valeur est valide, `false` sinon.
201 */
202function requete_verifier_ressource($ressource, $collection, $configuration, &$erreur) {
203
204        // Initialise le retour à true par défaut.
205        $est_valide = true;
206
207        // Vérification de la disponibilité de l'accès à une ressource pour la collection concernée
208        if (empty($configuration['ressource'])) {
209                // Récupération de la liste des collections disponibles pour lister celles avec ressources dans le message.
210                $declarer = charger_fonction('declarer_collections_svp', 'inc');
211                $collections = $declarer();
212                $ressources = array();
213                foreach ($collections as $_collection => $_config) {
214                        if (!empty($_config['ressource'])) {
215                                $ressources[] = $_collection;
216                        }
217                }
218                $erreur = array(
219                        'status'  => 400,
220                        'type'    => 'ressource_nok',
221                        'element' => 'ressource',
222                        'valeur'  => $ressource,
223                        'extra'   => implode(', ', $ressources)
224                );
225                $est_valide = false;
226        } else {
227                // Vérification de la validité de la ressource demandée.
228                // -- la ressource est vérifiée par une fonction spécifique. Si elle n'existe pas la ressource est
229                //    réputée valide.
230                $module = $configuration['module'];
231                include_spip("svpapi/${module}");
232                $verifier = "${collection}_verifier_ressource_{$configuration['ressource']}";
233                if (function_exists($verifier)
234                and !$verifier($ressource)) {
235                        $erreur = array(
236                                'status'  => 400,
237                                'type'    => "ressource_{$configuration['ressource']}_nok",
238                                'element' => 'ressource',
239                                'valeur'  => $ressource,
240                                'extra'   => $configuration['ressource']
241                        );
242                        $est_valide = false;
243                }
244        }
245
246        return $est_valide;
247}
Note: See TracBrowser for help on using the repository browser.