Documentation en ligne

Stockage de données JSON

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 utlisateur (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'identitifiant 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/
  • Méthode : DELETE

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}

Possiiblité 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
}

Dernière mise à jour le 26 novembre 2018 17:21 — Éditer