diff --git a/data-workflow/abstract-fr.tar.gz b/data-workflow/abstract-fr.tar.gz new file mode 100644 index 0000000..2833087 --- /dev/null +++ b/data-workflow/abstract-fr.tar.gz Binary files differ diff --git a/data-workflow/examples.http b/data-workflow/examples.http new file mode 100644 index 0000000..985ab59 --- /dev/null +++ b/data-workflow/examples.http @@ -0,0 +1,46 @@ +# File Global Variables: Variables defined in Region without name or request +@baseUrl = http://localhost:31976 +#@baseUrl = https://data-workflow.services.istex.fr/ + +### +# @name v1Retrieve +# @save +POST {{baseUrl}}/v1/retrieve HTTP/1.1 +Content-Type: application/json + +[ + { + "value":"8RjaJDej5" + } +] + +### +# @name v1collect +POST {{baseUrl}}/v1/collect?indent=true HTTP/1.1 +Content-Type: application/json + +[ + { + "value":"8RjaJDej5" + } +] + +### +# @name v1baseLine +POST {{baseUrl}}/v1/base-line HTTP/1.1 +Content-Type: application/x-tar +X-Webhook-Success: https://webhook.site/69300b22-a251-4c16-9905-f7ba218ae7e9 +X-Webhook-Failure: https://webhook.site/69300b22-a251-4c16-9905-f7ba218ae7e9 + +< ./example-json.tar.gz + +### +## @name v1tagCloudFr +POST {{baseUrl}}/v1/tag-cloud-fr HTTP/1.1 +Content-Type: application/x-tar +X-Webhook-Success: https://webhook.site/46d41346-6919-410f-a635-ae78146c2782 +X-Webhook-Failure: https://webhook.site/46d41346-6919-410f-a635-ae78146c2782 + +< ./abstract-fr.tar.gz + +### diff --git a/data-workflow/swagger.json b/data-workflow/swagger.json new file mode 100644 index 0000000..445c983 --- /dev/null +++ b/data-workflow/swagger.json @@ -0,0 +1,33 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "data-workflow - Enchainement de traitements asynchrones", + "summary": "Les worflows permettent de traiter des fichiers corpus compressés en appelant des webservices d'enrichissement par documents (webservices synchrones)", + "version": "1.0.0", + "termsOfService": "https://services.istex.fr/", + "contact": { + "name": "Inist-CNRS", + "url": "https://www.inist.fr/nous-contacter/" + } + }, + "servers": [ + { + "x-comment": "Will be automatically completed by the ezs server." + }, + { + "url": "http://vptdmjobs.intra.inist.fr:49155/", + "description": "production release", + "x-profil": "Standard" + } + ], + "tags": [ + { + "name": "data-workflow", + "description": "Conversions en fichier corpus compressé", + "externalDocs": { + "description": "Plus de documentation", + "url": "https://gitbucket.inist.fr/tdm/web-services/tree/master/data-workflow" + } + } + ] +} diff --git a/data-workflow/v1/base-line.ini b/data-workflow/v1/base-line.ini new file mode 100644 index 0000000..1998896 --- /dev/null +++ b/data-workflow/v1/base-line.ini @@ -0,0 +1,60 @@ +# Entrypoint output format +mimeType = application/json + +# OpenAPI Documentation - JSON format (dot notation) +post.operationId = post-v1-base-line +post.description = Chargement et analyse d'un fichier corpus +post.summary = Le corpus est analysé et restitué sans modification des données +post.tags.0 = data-workflow +post.requestBody.content.application/x-tar.schema.type = string +post.requestBody.content.application/x-tar.schema.format = binary +post.requestBody.required = true +post.responses.default.description = Informations permettant de récupérer les données le moment venu +post.parameters.0.description = Indenter le JSON résultant +post.parameters.0.in = query +post.parameters.0.name = indent +post.parameters.0.schema.type = boolean +post.parameters.1.description = URL pour signaler que le traitement est terminé +post.parameters.1.in = header +post.parameters.1.name = X-Webhook-Success +post.parameters.1.schema.type = string +post.parameters.1.schema.format = uri +post.parameters.1.required = false +post.parameters.2.description = URL pour signaler que le traitement a échoué +post.parameters.2.in = header +post.parameters.2.name = X-Webhook-Failure +post.parameters.2.schema.type = string +post.parameters.2.schema.format = uri +post.parameters.2.required = false + +[use] +plugin = basics +plugin = analytics + +# Step 1 (générique): Charger le fichier corpus +[delegate] +file = charger.cfg + +# Step 2 (générique): Traiter de manière asynchnore les items reçus +[fork] +standalone = true +logger = logger.cfg + +# Step 2.1 (spécifique): Lancer un calcul sur tous les items reçus +[fork/exchange] +value = self().omit('uri') + +# Step 2.2 (générique): Enregister le résulat et signaler que le traitment est fini +[fork/delegate] +file = recorder.cfg + +# Step 3 : Renvoyer immédiatement un seul élément indiquant comment récupérer le résulat quand il sera prêt +[shift] +[replace] +path = id +value = base-line +path = value +value = env('identifier') + +[JSONString] +indent = env('indent') diff --git a/data-workflow/v1/charger.cfg b/data-workflow/v1/charger.cfg new file mode 100644 index 0000000..c1f8093 --- /dev/null +++ b/data-workflow/v1/charger.cfg @@ -0,0 +1,16 @@ +[use] +plugin = basics +plugin = analytics + +# Step 0 (générique) : Lire le fichier standard tar.gz +[TARExtract] +compress = true +path = */*.json + +# Step 1 (générique) : Créer un identifiant unique pour le corpus reçu +[singleton] +[singleton/identify] +[singleton/env] +path = identifier +value = get('uri').replace('uid:/', '') + diff --git a/data-workflow/v1/logger.cfg b/data-workflow/v1/logger.cfg new file mode 100644 index 0000000..49db973 --- /dev/null +++ b/data-workflow/v1/logger.cfg @@ -0,0 +1,44 @@ +; [use] +plugin = basics +plugin = analytics + +# On ne garde que la première erreur déclénchée +[shift] + +[debug] +text = Error trapped + +[assign] +path = body.error.type +value = get('type') + +path = body.error.scope +value = get('scope') + +path = body.error.message +value = get('message') + +path = env +value = env() + +[swing] +test = env('headers.x-webhook-failure').startsWith('http') + +[swing/URLFetch] +url = env('headers.x-webhook-failure').trim() +path = body +headers = Content-Type:application/json +target = result + +# On enregistre uniqument quelques informations (à supprimer pour avoir la trace complète) +[exchange] +value = get('body') + +[FILESave] +location = /tmp/retrieve +identifier = env('identifier') +jsonl = true +compress = false + +[debug] +text = Error was saved diff --git a/data-workflow/v1/recorder.cfg b/data-workflow/v1/recorder.cfg new file mode 100644 index 0000000..f768491 --- /dev/null +++ b/data-workflow/v1/recorder.cfg @@ -0,0 +1,43 @@ +[use] +plugin = basics +plugin = analytics + +# Step 2.2 (générique): Création d'un fichier résulat standard +[TARDump] +compress = true +manifest = fix({version: '1'}) +manifest = fix({identifier: env('identifier')}) +manifest = fix({generator: env('generator')}) + +# Step 2.3 (générique): Sauvegarder sur disque le résulat +[FILESave] +location = /tmp/retrieve +identifier = env('identifier') +jsonl = false +compress = false + +# Step 2.4 (générique): Signaler le fin du traitement via un appel à un webhook (si il a été précisé) +[swing] +test = env('headers.x-webhook-success').startsWith('http') + +# Step 2.4.1 (générique): Séléctionner les informations à envoyer au webhook +[swing/replace] +path = body +value = self().pick(['size', 'atime', 'mtime', 'ctime']).set('identifier', env('identifier')).set('generator', env('generator')).set('state', 'ready') + +# Step 2.4.2 (générique): Envoyer la requète HTTP +[swing/URLFetch] +url = env('headers.x-webhook-success').trim() +path = body +headers = Content-Type:application/json +retries = 1 + +# Step 2.4.3 (faculatif) : Ajouter une trace dans log +[swing/debug] +text = webhook triggered + +# Step 2.5 (faculatif) : Ajouter une trace dans log +[debug] +text = process completed + + diff --git a/data-workflow/v1/tag-cloud-en.ini b/data-workflow/v1/tag-cloud-en.ini new file mode 100644 index 0000000..462f6a3 --- /dev/null +++ b/data-workflow/v1/tag-cloud-en.ini @@ -0,0 +1,64 @@ +# Entrypoint output format +mimeType = application/json + +# OpenAPI Documentation - JSON format (dot notation) +post.operationId = post-v1-tag-cloud-en +post.description = Chargement et analyse d'un fichier corpus pour compter le nombre de termes ANGLAIS pertients identiques dans chaque document +post.summary = Le résulat produit une liste de terme associé à sa fréquence +post.tags.0 = data-workflow +post.requestBody.content.application/x-tar.schema.type = string +post.requestBody.content.application/x-tar.schema.format = binary +post.requestBody.required = true +post.responses.default.description = Informations permettant de récupérer les données le moment venu +post.parameters.0.description = Indenter le JSON résultant +post.parameters.0.in = query +post.parameters.0.name = indent +post.parameters.0.schema.type = boolean +post.parameters.1.description = URL pour signaler que le traitement est terminé +post.parameters.1.in = header +post.parameters.1.name = X-Webhook-Success +post.parameters.1.schema.type = string +post.parameters.1.schema.format = uri +post.parameters.1.required = false +post.parameters.2.description = URL pour signaler que le traitement a échoué +post.parameters.2.in = header +post.parameters.2.name = X-Webhook-Failure +post.parameters.2.schema.type = string +post.parameters.2.schema.format = uri +post.parameters.2.required = false + +[env] +path = language +value = en + +[use] +plugin = basics +plugin = analytics + +# Step 1 (générique): Charger le fichier corpus +[delegate] +file = charger.cfg + +# Step 2 (générique): Traiter de manière asynchnore les items reçus +[fork] +standalone = true +logger = logger.cfg + +# Step 2.1 (spécifique): Lancer un calcul sur tous les items reçus +[fork/delegate] +file = tag-cloud.cfg + +# Step 2.2 (générique): Enregister le résulat et signaler que le traitment est fini +[fork/delegate] +file = recorder.cfg + +# Step 3 : Renvoyer immédiatement un seul élément indiquant comment récupérer le résulat quand il sera prêt +[shift] +[replace] +path = id +value = tag-cloud-en +path = value +value = env('identifier') + +[JSONString] +indent = env('indent') diff --git a/data-workflow/v1/tag-cloud-fr.ini b/data-workflow/v1/tag-cloud-fr.ini new file mode 100644 index 0000000..0d77643 --- /dev/null +++ b/data-workflow/v1/tag-cloud-fr.ini @@ -0,0 +1,64 @@ +# Entrypoint output format +mimeType = application/json + +# OpenAPI Documentation - JSON format (dot notation) +post.operationId = post-v1-tag-cloud-fr +post.description = Chargement et analyse d'un fichier corpus pour compter le nombre de termes FRANCAIS pertients identiques dans chaque document +post.summary = Le résulat produit une liste de terme associé à sa fréquence +post.tags.0 = data-workflow +post.requestBody.content.application/x-tar.schema.type = string +post.requestBody.content.application/x-tar.schema.format = binary +post.requestBody.required = true +post.responses.default.description = Informations permettant de récupérer les données le moment venu +post.parameters.0.description = Indenter le JSON résultant +post.parameters.0.in = query +post.parameters.0.name = indent +post.parameters.0.schema.type = boolean +post.parameters.1.description = URL pour signaler que le traitement est terminé +post.parameters.1.in = header +post.parameters.1.name = X-Webhook-Success +post.parameters.1.schema.type = string +post.parameters.1.schema.format = uri +post.parameters.1.required = false +post.parameters.2.description = URL pour signaler que le traitement a échoué +post.parameters.2.in = header +post.parameters.2.name = X-Webhook-Failure +post.parameters.2.schema.type = string +post.parameters.2.schema.format = uri +post.parameters.2.required = false + +[env] +path = language +value = fr + +[use] +plugin = basics +plugin = analytics + +# Step 1 (générique): Charger le fichier corpus +[delegate] +file = charger.cfg + +# Step 2 (générique): Traiter de manière asynchnore les items reçus +[fork] +standalone = true +logger = logger.cfg + +# Step 2.1 (spécifique): Lancer un calcul sur tous les items reçus +[fork/delegate] +file = tag-cloud.cfg + +# Step 2.2 (générique): Enregister le résulat et signaler que le traitment est fini +[fork/delegate] +file = recorder.cfg + +# Step 3 : Renvoyer immédiatement un seul élément indiquant comment récupérer le résulat quand il sera prêt +[shift] +[replace] +path = id +value = tag-cloud-fr +path = value +value = env('identifier') + +[JSONString] +indent = env('indent') diff --git a/data-workflow/v1/tag-cloud.cfg b/data-workflow/v1/tag-cloud.cfg new file mode 100644 index 0000000..96e72cc --- /dev/null +++ b/data-workflow/v1/tag-cloud.cfg @@ -0,0 +1,30 @@ +[use] +plugin = analytics + +[expand] +path = value +size = 100 +[expand/URLConnect] +url = fix(`https://terms-extraction.services.istex.fr/v1/teeft/${env('language', 'en')}?nb=10`) + +[exploding] +[replace] +path = id +value = get('value') + +path = value +value = 1 + +[groupingByEquality] + +[summing] + +[greater] +than = 1 +strict = true + +[replace] +path = id +value = get('id.0') +path = value +value = get('value')