Stockage de données JSON (obsolète)
Attention : l'utilisation d'un « JSON Datastore » est déprécié dans Publik, au profit de l'utilisation des fiches. Aussi, si vous devez créer maintenant une source de données, prévoyez directement une gestion de votre source de données à base de fiches.
Une gestion de la relation usagers n'est pas focalisée sur le stockage durable de données, CNIL et RGPD obligent.
Cependant, il peut arriver, pour les assocations par exemple, que l'on ait besoin de stocker des informations ailleurs que dans la demande. Nous utilisons pour cela ce que nous appelons un « JSON Datastore ». Nous expliquons ici comment enregistrer et réutiliser des données au format JSON, dans ce store.
Création du store
La première chose à faire, pour utiliser cet espace de stockage, et d'aller dans la brique « Services web » (Passerelle) pour créer un nouveau connecteur en cliquant sur « Ajouter un connecteur ».
Dans « Sources des données », vous choisirez « Stockage de données JSON ». En plus du titre et de la description, vous devrez indiquer une valeur qui sera utilisée comme identifiant unique de chaque enregistrement dans la base. Il faut choisir une des variables qui sera systématiquement envoyée lors de la création d'un enregistrement et lui appliquer le filtre |safe ou |slugify pour être sûr que son nom sera informatiquement correct.
Par exemple : {{nom|safe}}
Enregistrement d'informations dans le store
Pour stocker des informations dans le store vous allez utiliser l'action de workflow webservice et la configurer comme suit :
- URL :
{{passerelle_url}}jsondatastore/IDENTIFIANT-DU-CONNECTEUR/data/create
- Méthode : POST
- Données à envoyer dans le corps de la requête : sur chaque ligne, un couple attribut / valeur (par exemple
nom_association / {{form_var_nom_association}}
.
Attention, lorsque vous souhaitez déposer un fichier sur le store, il faut procéder un peu différemment des autres champs. Si votre champ a pour identifiant « fichier » nous n'allez pas juste indiquer {{ form_var_fichier }} comme valeur mais {{ form_var_fichier_url }}
: c'est l'URL de ce fichier que vous devez stocker dans le store et non le fichier lui-même (ce qui est impossible).
Pour lier l'enregistrement à l'utilisateur (connecté) qui a fait la demande, vous pouvez transmettre dans « Données à envoyer en paramètres de l'URL » un paramètre name_id et lui donner pour valeur {{form_user_name_identifier_0}}
Récupération d'informations depuis le store
Dans un formulaire
Pour afficher dans un champ liste, tous les enregistrements correspondant à un utilisateur (lorsque l'on a fait le choix d'associer l'identifiant des utilisateurs aux enregistrement), on pourra configurer la source de données de ce champ liste en indiquant pour « URL du JSON » :
{{passerelle_url}}jsondatastore/IDENTIFIANT-DU-STORE/data/?name_id={% firstof session_user_name_identifier_0 "nc" %}
Après sélection par le demandeur d'un enregistrement dans la liste et après qu'il ait changé de page, tous les attributs de l'enregistrement peuvent être récupérés en utilisant :
form_var_IDENTIFIANT-DE-LA-LISTE_content_NOM-DE-L-ATTRIBUT
Si par exemple mon champ liste a pour identifiant association et que les enregistrements dans le store ont un attribut creation, je peux récupérer ce dernier dans la variable.
form_var_association_content_creation
Via le workflow
On pourra configurer une action de webservice pour récupérer les enregistrements en fonction de leur identifiant
- URL :
{{passerelle_url}}jsondatastore/IDENTIFIANT-DU-CONNECTEUR/data/IDENTIFIANT-ENREGISTREMENT/
- Méthode : GET
Utiliser un attribut
Dans le formulaire ou le workflow, on peut récupérer un enregistrement en interrogeant le store concernant la valeur d'un attribut particulier. Pour un store dont l'identifiant est « test » je peux récupérer les enregistrements dont la valeur pour l'attribut nom est « Strummer », en utilisant l'URL :
{{ passerelle_url }}/jsondatastore/test/data/by/nom/?value=Strummer
Modifier les informations dans le store
Avec l'action webservice on aura le choix entre remplacer, mettre à jour ou supprimer les informations existantes.
Remplacer (enregistrement original effacé)
- URL :
{{passerelle_url}}jsondatastore/IDENTIFIANT-DU-CONNECTEUR/data/IDENTIFIANT-ENREGISTREMENT/
- Méthode : POST
Mettre à jour (enregistrement original modifié)
- URL :
{{passerelle_url}}jsondatastore/IDENTIFIANT-DU-CONNECTEUR/data/IDENTIFIANT-ENREGISTREMENT/
- Méthode : PATCH
Supprimer
- URL :
{{passerelle_url}}jsondatastore/IDENTIFIANT-DU-CONNECTEUR/data/IDENTIFIANT-ENREGISTREMENT/delete
- Méthode : POST
Détails techniques
Si vous ne comprenez pas les informations contenues dans cette partie, c'est que vous n'en avez pas besoin.
Ajout d'informations¶
Un POST d'un objet JSON sur l'adresse …/data/create/
du connecteur stocke l'objet et fournit en retour l'identifiant qui lui a été attribué, exemple :
$ curl -X POST \ -d '{"nom": "Foo Bar 2000", "numero": "123456789"}' \ https:/passerelle.example.net/jsondatastore/associations/data/create {"text": "Foo Bar 2000 (123456789)", "id": "a53cdd0b99ed43a4bf7ddc102f919948", "err": 0}
Dans le paramétrage du connecteur, il est possible de paramétrer le modèle à appliquer pour la valeur de la clé "text", dans cet exemple on aura ainsi mis {{nom}} ({{numero}})
.
Récupération de données¶
Un appel à l'adresse …/data/<identifiant>/
retourne l'objet enregistré :
$ curl https:/passerelle.example.net/jsondatastore/associations/data/a53cdd0b99ed43a4bf7ddc102f919948/ { "content": { "nom": "Foo Bar 2000", "numero": "123456789" }, "text": "Foo Bar 2000 (123456789)", "id": "a53cdd0b99ed43a4bf7ddc102f919948", "err": 0 }
Récupération de l'ensemble des données¶
L'adresse …/data/
seule permet de récupérer toutes les données :
$ curl https:/passerelle.example.net/jsondatastore/associations/data/ { "data": [ { "content": { "nom": "Foo Bar 2000", "numero": "123456789" }, "text": "Foo Bar 2000 (123456789)", "id": "a53cdd0b99ed43a4bf7ddc102f919948" }, { "content": { "nom": "Bzze", "numero": "0234" }, "text": "Bzze (0234)", "id": "1ad86d329ec54ea6b37c9b22473e1395" } ], "err": 0 }
Modification de données¶
Un POST à la même adresse, …/data/<identifiant>/
, permet d'actualiser les données :
$ curl -X POST \ -d '{"nom": "Foo Bar 2001", "numero": "123456789"}' \ https:/passerelle.example.net/jsondatastore/associations/data/a53cdd0b99ed43a4bf7ddc102f919948/ { "content": { "nom": "Foo Bar 2001", "numero": "123456789" }, "text": "Foo Bar 2001 (123456789)", "id": "a53cdd0b99ed43a4bf7ddc102f919948", "err": 0 }
Suppression de données¶
Un POST à l'adresse …/data/<identifiant>/delete
permet de supprimer un objet :
$ curl -X POST \ https:/passerelle.example.net/jsondatastore/associations/data/a53cdd0b99ed43a4bf7ddc102f919948/delete {"err": 0}
Possibilité de lier les données à un compte¶
Les différents appels acceptent un paramètre name_id
qui permet d'associer aux requêtes l'identifiant du « propriétaire » de l'objet JSON.
# enregistrement $ curl -X POST \ -d '{"nom": "Foo Bar 2000", "numero": "123456789"}' \ https:/passerelle.example.net/jsondatastore/associations/data/create?name_id=AZERTY {"text": "Foo Bar 2000 (123456789)", "id": "a53cdd0b99ed43a4bf7ddc102f919948", "err": 0} # liste $ curl https:/passerelle.example.net/jsondatastore/associations/data/?name_id=AZERTY { "data": [ { "content": { "nom": "Foo Bar 2000", "numero": "123456789" }, "text": "Foo Bar 2000 (123456789)", "id": "a53cdd0b99ed43a4bf7ddc102f919948" } ], "err": 0 } # liste pour un autre identifiant $ curl https:/passerelle.example.net/jsondatastore/associations/data/?name_id=QSDFGH { "data": [], "err": 0 } # récupération $ curl https:/passerelle.example.net/jsondatastore/associations/data/a53cdd0b99ed43a4bf7ddc102f919948/?name_id=AZERTY { "content": { "nom": "Foo Bar 2000", "numero": "123456789" }, "text": "Foo Bar 2000 (123456789)", "id": "a53cdd0b99ed43a4bf7ddc102f919948", "err": 0 } # récupération avec un autre identifiant $ curl https:/passerelle.example.net/jsondatastore/associations/data/a53cdd0b99ed43a4bf7ddc102f919948/?name_id=QSDFGH { "err_class": "passerelle.apps.jsondatastore.models.DoesNotExist", "err_desc": "JsonData matching query does not exist.", "data": null, "err": 1 }