Sommaire |
---|
Introduction
Les webhook webhooks Métier permettent de manipuler une entité (client, contact, ...) à partir de l'extérieur via un appel de type http.
Les webhook webhooks Métier implémente implémentent une structure commune de leur contrat JSON.
Entête
Structure
Le JSON lors de l'appel au webHook devra contenir les éléments suivants :
Bloc de code | ||
---|---|---|
| ||
{ "header": { "caller": how called the webhook ie.: infinity "callerVersion": version of the caller ie. 1.2.3.4 "languageCode": FR, EN, DE, PT, ES, IT, FR-CA, EN-CA "userCode": user how called the webhook "callDateTime": initial call date/time, usefull when retries or whatever network issue "markForExport": value for srvExport of the table, can be 0, 1, 2 (optional, default is 1) "webhookVersion": version of the webhook for top-down compatibility, can be 1 or 2 (optional, default is 2). Today is used for webhook intervention, equipment and contract. }, "action": { "verb": "value", // GET, PUT, DELETE, LIST, DEFINITION "parameters": //depends on the verb { // depends on the {verb } }, "data": { // depends on the webhook (used for verb = PUT to insert/update the data) } } |
Avec les possibilités suivantes selon le verb :
GET : lire un enregistrement
PUT : écrire un enregistrement
DELETE : supprimer un enregistrement
LIST : lister plusieurs enregistrements
DEFINITION : obtenir les propriétés de l'objet métier ainsi que les listes de valeurs possibles associées
...
language | json |
---|
...
verb PUT
Généralités
Permet d'écrire un enregistrement (Ajout/Mise à jour).
Bloc de code | ||
---|---|---|
| ||
"action": { "verb": "PUT" "codeparameters": code { of the record to get (mandatory) // for webhook "resultType":file "simpleentity" : main"value", info of the record (by default) "extendedextension": all"value" columns of the record } } |
Le bloc data contient les données à créer/mettre à jour. Ce bloc est différent pour chaque webhook. Consultez la fiche expert de chaque webhook pour le détail.
Bloc de code | ||
---|---|---|
| ||
"data": { "extendedRelatedxxxxx": all columns of the record{ + given context (one entity per foreign key) "settingscodexxxxx": depends of the webhook (optional) {"value", // optional } } "verbfield1": PUT "parametersvalue":, { // for webhook file "entityfield2": "value", "extension": "value" } "verb": DELETE (V1: delete only record at a time) "parameters": { "code": code of the record to delete (mandatory) "deleteType": .... } } |
Info |
---|
L'initialisation du code d'un enregistrement se fera par ordre de priorité de la manière suivante lors de la création :
|
PUT par lot
La possibilité est donné de faire des PUT par LOT en passant un tableau de data.
La variable Webhook.PUT.MaxElementAtOnce défini le nombre maximum d'éléments qui peuvent être passés à la fois (par défaut : 10). Ceci permet de tenir compte du timeout réseau.
Bloc de code | ||
---|---|---|
| ||
"data":
[{
"xxxxx":
{
"codexxxxx": "value", // optional
"field1": "value",
"field2": "value",
....
}
},
{
"xxxxx":
{
"codexxxxx": "value", // optional
"field1": "value",
"field2": "value",
....
}
},
{
....
}] |
Transcodage
Le champ mémoire “internalcodexxxxx” peut être alimenté lors du passage des données.
Ce champ représente le code original de weavy avant éventuel transcodage.
Il permet donc d’effectuer du transcodage dynamique directement par le webhook.
Syntaxe :
Bloc de code |
---|
"data":
{
"xxxxx":
{
"codexxxxx": "value",
"field1": "value",
"field2": "value",
....
"internalcodexxxxx" : "value"
}
} |
Tableau des possibilités :
"codexxxxx" = "A" | "internalcodexxxxx" = "B" | Résultat |
---|---|---|
"codexxxxx" = "A" existe en base | "codexxxxx" = "B" n’existe pas en base | Mise à jour de l'enregistrement dont "codexxxxx" = "A" |
"codexxxxx" = "A" existe en base | "codexxxxx" = "B" existe en base | Mise à jour de l’enregistrement dont "codexxxxx" = "A" |
"codexxxxx" = "A" n'existe pas en base | "codexxxxx" = "B" n’existe pas en base | Création de l’enregistrement avec "codexxxxx" = "A" |
"codexxxxx" = "" | "codexxxxx" = "B" n’existe pas en base | Création de l’enregistrement avec "codexxxxx" = xxxxx_ID |
"codexxxxx" = "A" n'existe pas en base | "codexxxxx" = "B" existe en base | Recodification de l’enregistrement "codexxxxx" = "B" en "codexxxxx" = "A" + mise à jour |
"codexxxxx" = "" | "codexxxxx" = "B" existe en base | Mise à jour de l’enregistrement dont "codexxxxx" = "B" |
verb DELETE
Permet de supprimer un enregistrement.
Bloc de code | ||
---|---|---|
| ||
"action":
{
"verb": "DELETE"
"parameters":
{
"code": code of the record to delete (mandatory)
"deleteType":
"logical": no real delete in db (by default - not implemented at time)
"physical": real delete, possible if record is not referred to elsewhere
"simulation": simulate the delete (can be used to know in advance if a record can be deleted)
}
} |
verb GET
Permet de lire un enregistrement.
Bloc de code | ||
---|---|---|
| ||
"action":
{
"verb": "GET"
"parameters":
{
"code": code of the record to get (mandatory)
"resultType":
"simple" : main info of the record (by default)
"extended": all columns of the record
"extendedRelated": all columns of the record + given context (one entity per foreign key)
"settings":
{
// depends of the webhook (optional)
}
}
} |
verb LIST
Permet de lister plusieurs enregistrements.
Bloc de code | ||
---|---|---|
| ||
"action": { "verb": "LIST" "parameters": { "listType": "simple": main info of the record (by default), the columns are determined by each webhook "extended": all columns of the record "extendedRelated": not used for verb="LIST" "pageNumber": "xx" // used to read the page of the records list, 1 page = 10 records (optional, default pageNumber is 1) You can read the list page per page until maxPageNumber (result of maxPageNumber given in the "response") "settings": { // depends of the webhook (optional) } "filters": { // depends of the webhook (optional), each filter added will result is an AND in the query // For a filter operator "equal" it is possible to give more values separated by "|" (ie "email": "email1|email2|email3") // For a filter operator "equal" it is possible to give the value "null" who will be transformed in "IS NULL" } "orderBy" : "value" // depends of the webhook (optional), order the returned records (for example webhook event, the value can be "eventDateDesc" to order the records by event date descending) "logicaltopRows": no real delete in db (by default) "xx" // limit the returned records (optional) } } |
verb DEFINITION
Permet d’obtenir les propriétés de l'objet métier ainsi que les listes de valeurs possibles associées.
Bloc de code | ||
---|---|---|
| ||
"action": { "physicalverb": real"DEFINITION" delete, possible if record is not referred to elsewhere "simulationparameters": simulate the delete (can be used to know in{ advance if a record can be deleted) } "verbbaseculture_id": LIST "parametersvalue": { "listType": "simple": main info// (optional) Culture to use to return labels. If not given, the LanguageCode of the recordheader (by default), the columns are determined by each webhook will be used by default. } } |
Réponse
Structure
Bloc de code | ||
---|---|---|
| ||
{ "extendedlabel": all columns "Webhook xxx", //name of the recordcalled webhook "extendedRelatedcodeScript": not used for verb=LIST "Webhookxxx", //script called by the webhook "pageNumberresultType": "xxJSON", // used to"result": read the page of the{ records list, 1 page = 10 records (optional, default pageNumber is 1) "common": { "resultCode": "0", // 0 if ok otherwise specific Youerror canof readthe thewebhook list page per page until maxPageNumber (result of maxPageNumber given in the "responseerrorMessage"): "" // if resultCode <> "settings": depends 0, text of the error webhookin (optional)english { } , "filters": depends of the webhook called here, not mandatory, each filter added will result is an AND in the query (for example intervention) "response": { // depends of the webhook For a filter operator "equal" it is} possible to give more values}, separated by "|" (ie "emailstatistics": "email1|email2|email3") { "codeInterventiondurationMs": "value"xx, filter// isduration equalof execution time "codeCustomer": "value", filter is equal "consumedTimeOnDatabaseMs": xx, // DB "codeContract": "value", filter is equaltime used "startDateselectQueryCount": "value"xx, filter is greater or equal to// number of select query done "endDateinsertQueryCount": "value"xx, filter is lesser or equal to// number of insert query done "interventionTypeupdateQueryCount": "value", filter is equalxx, // number of update query done } "orderBydeleteQueryCount" : "value"xx, // dependsnumber of thedelete webhook (optional), order the returned records (for example webhook event, the value can be "eventDateDesc" to order the records by event date descending)query done "readTokenCount": xx, "topRowsexecutedFunctionCount": "xx", // limitnumber theof returned records (optional) } "verb": DEFINITION "parameters": {function called "baseculture_idtranslatorHitCount": "value"xx, // (optional) Culture to use to return labels. If not given, the LanguageCode of the header will be used by default. } |
...
number of translations done
"languageHitCount": xx
}
} |
verb PUT
La réponse aura 1 section.
Bloc de code | ||
---|---|---|
| ||
"dataresponse": { "xxxxxmaxElementAtOnce": "10" // max elements that can be passed at once "data": [{ "codexxxxxaction": "value", // inserted or optionalupdated "field1": "value",xxxxx_ID": "value", // with xxxxx = table and value is ID created/updated "field2codexxxxx": "value", // with xxxx = table and value is ....code created/updated }] } |
La possibilité est donné de faire des PUT par LOT en passant un tableau de data.
La variable Webhook.PUT.MaxElementAtOnce défini le nombre maximum d'éléments qui peuvent être passés à la fois (par défaut : 10). Ceci permet de tenir compte du timeout réseauS'il s'agit d'un PUT par lot, le détail du résultat sera un tableau dimensionné selon la section "data" passée en entrée.
Bloc de code | ||
---|---|---|
| ||
"data"result": { "results": [{ "xxxxxcommon": { "codexxxxxresultCode": "value0", // optional 0 if ok otherwise specific error of the webhook "field1errorMessage": "value", // if resultCode <> 0, text of the "field2": "value", error in english .... }, } }, { "xxxxxresponse": { "codexxxxxmaxElementAtOnce": "value10", // optional max elements that can be passed at once "field1data": "value", "field2": "value", [{ .... } }, { "action": "value", .... }] |
L'initialisation du code d'un enregistrement se fera par ordre de priorité de la manière suivante lors de la création :
Code fourni dans le json (et qu'il n'existe pas encore sinon on sera en modification)
Utilisation du numbering si existant sur le code de l'entité.
Code = ID de l'enregistrement (codexxxxx = xxxxx_ID)
Réponse
Standard response of a webhook:
Bloc de code | ||
---|---|---|
| ||
{// inserted or updated "xxxxx_ID": "value", // with xxxxx = table and value is ID created/updated "labelcodexxxxx": "Webhook Interventionvalue", //name of the called webhook "codeScript": "WebhookIntervention", //script called by the webhook with xxxx = table and value is code created/updated }] } }, { "resultTypecommon": "JSON", "result": "see below", { "statistics": { "durationMsresultCode": 1360"0", //duration of execution time "consumedTimeOnDatabaseMserrorMessage": 990, //DB time used "" }, "selectQueryCountresponse": 3, //number of select query done { "insertQueryCountmaxElementAtOnce": 0,"10" //number ofmax insertelements querythat donecan be passed at once "updateQueryCount": 0, //number of update query done "data": "deleteQueryCount": 0, //number of delete query done [{ "readTokenCount": 1842, "executedFunctionCountaction": 258"value", //number of function called "translatorHitCountxxxxx_ID": 552"value", //number of translations done "languageHitCount": 0 "codexxxxx": "value" } } |
Détail du résultat :
Bloc de code | ||
---|---|---|
| ||
"result": { "common": { }] "resultCode": "0", //0 if ok} otherwise specific error of the}, webhook { "errorMessage": "" //if resultCode <>0, text of... the error in english (V1) },}] } |
verb DELETE
La réponse aura 1 section.
Bloc de code | ||
---|---|---|
| ||
"response": { "responsedata": [{ depends on the webhook"action": "deleted" }] } |
...
verb GET
La réponse aura 2 sections.
Bloc de code | ||
---|---|---|
| ||
"response": { "data": [{ "action": "value", // inserted or updated depends of the webhook }], "xxxxx_IDfieldList": "value", // with xxxxx = table and value is ID created/updated [{ "codexxxxxentityName": "value", // withname xxxxof =the tableentity and value is code created/updated(ie intervention) }] } |
S'il s'agit d'un PUT par lot, le détail du résultat sera un tableau dimensionné selon la section "data" passée en entrée :
Bloc de code | ||
---|---|---|
| ||
"result": {"fields": "results": [{ [{ "commonfieldName": "value", // name of the field (ie codeintervention, {customer_ID, …) "resultCodefieldType": "0value", //0 if ok otherwise specific error of the webhook type of the field : varchar, text, int, double, bool, datetime, timestamp, foreignkey "errorMessagefieldLength": "value", //if resultCode <>0, text length of the errorfield in: englishinformed (V1)for varchar, text }, "responsefieldLabel": "value" // label of { "data": the field : depends on the value of the languageCode from the header (default : FR) }, [{ { "actionfieldName": "value", // inserted or updated "xxxxx_ID"fieldType": "value", // with xxxxx = table and value is ID created/updated "fieldLength": "value", "codexxxxxfieldLabel": "value" // with xxxx = table and}, value is code created/updated { }] ... } }], { "related": // for listType = "commonextendedRelated": [{ "resultCodeentityName": "0value", "errorMessagefields": "" }, [{ "response": { ... "data": }] [{ }, "action": "value", { "xxxxx_ID"entityName": "value", "fields": "codexxxxx": "value" [{ }] } ... }, { }] ... }] } |
Pour le verb DELETE, la réponse aura 1 section :
Bloc de code | ||
---|---|---|
| ||
"response":, { "data": ... [{ "action": "deleted" }] }] } } |
...
verb LIST
...
La réponse aura 2 sections :.
Bloc de code | ||
---|---|---|
| ||
"response": { "maxPageNumber": xx, // verb=LIST : number of pages of records "pageSize": 10, // verb=LIST : number of records per page "data": [{ [{ // depends of the webhook }], "fieldList": [{ "entityName": "value", // name of the tableentity (ie intervention) "fields": [{ "fieldName": "value", // name of the field (ie codeintervention, customer_ID, …) "fieldType": "value", // type of the field : varchar, text, int, double, bool, datetime, timestamp, foreignkey "fieldLength": "value", // length of the field : informed for varchar, text "fieldLabel": "value" // label of the field : depends on the value of the languageCode from the header (default : FR) }, { { "fieldName": "value", "fieldType": "value", "fieldLength": "value", "fieldLabel": "value" }, { ... }], }] } "related": |
verb DEFINITION
La réponse aura 2 sections.
Bloc de code | ||
---|---|---|
| ||
"response": { "data": [{ "entityNamefieldName1": "value", [{ "fields": [{ "code": "value", ... "label": "value" }] }, { { "entityName": "value", "fieldscode": "value", [{ ..."label": "value" }], }, { { ... }] }] |
Pour le verb DEFINITION, la réponse aura 2 sections :
Bloc de code | ||
---|---|---|
| ||
"response":}], { "datafieldName2": [{ depends of the webhook}], "code": "value", As an example for contact "generictype_ID_civility":label": "value" }, [ { "code": "CIVILITY-MRvalue", "label": "Mistervalue" }, { }, "code": "CIVILITY-MME", { "label": "Madame" ... }, { } "code": "CIVILITY-MRS" }], "label": "Miss" ... }], "fieldList": [{ "entityName": "value", // name of the tableentity (ie intervention) "fields": [{ "fieldName": "value", // name of the field (ie codeintervention, customer_ID, …) "fieldType": "value", // type of the field : varchar, text, int, double, bool, datetime, timestamp, foreignkey "fieldLength": "value", // length of the field : informed for varchar, text "fieldLabel": "value", // label of the field : depends on the value of the languageCode from the header (default : FR)) "fieldNameToShow": "value", // field alias for GET and LIST "alias": "value", // field alias for PUT "canGet": "value", // field can be read (0, 1) "canInsert": "value", // field can be updated for a new record (0, 1) "canUpdate": "value", // field can be updated for a existing record (0, 1) "mandatory": "value", // field is mandatory in sent json (0, 1) "canotBeNullcannotBeNull": "value", // field cannot be null or empty in sent json (0, 1) "dataType": "value" // data type for generictype foreignkey field }, { "fieldName": "value", "fieldType": "value", "fieldLength": "value", "fieldLabel": "value", "fieldNameToShow": "value", "alias": "value", "canGet": "value", "canInsert": "value", "canUpdate": "value", "mandatory": "value", "canotBeNullcannotBeNull": "value", "dataType": "value" }, { ... }], "related": [{ "entityName": "value", "fields": [{ ... }] }, { "entityName": "value", "fields": [{ ... }] }, { ... }] }] } |