ThingWorx Flow > SDK ThingWorx Flow > Annexe B : Tutoriel sur le SDK des connecteurs ThingWorx Flow
Annexe B : Tutoriel sur le SDK des connecteurs ThingWorx Flow
Prérequis
Les prérequis pour le suivi de ce tutoriel sont les suivants :
Version LTS de Node.js 8.9.0 + programme d'installation
Environnement de développement intégré (IDE) prenant en charge les projets Node.js.
Ce tutoriel utilise WebStorm comme IDE.
Compréhension de niveau intermédiaire du code Node.js
Dossier exemples
Introduction
Ce tutoriel vous accompagne pas à pas dans la création d'un connecteur type. La plupart des développeurs étant au fait du fonctionnement de Gmail, nous vous proposons ici de construire un connecteur pour ce produit. Cet exercice va vous permettre de vous familiariser avec les outils, les artefacts et les processus impliqués dans la mise au point d'un connecteur, et de créer un connecteur pour votre application. La création d'un nouveau connecteur ne nécessite pas de déploiement de ThingWorx Flow. Une fois le connecteur créé et testé localement, il peut être déployé sur une installation de test sur site pour être testé.
Le présent tutoriel couvre les aspects suivants :
1. Création d'un projet de connecteur.
2. Configuration OAuth2.
3. Création d'un lookup recherchant les filtres liés à votre compte Gmail.
4. Création d'une action permettant de récupérer l'ID et l'objet des e-mails répondant au filtre sélectionné.
5. Création d'un déclencheur permettant l'initiation d'un nouveau flux à réception d'un nouvel e-mail.
6. Ajout d'icônes.
7. Déploiement du connecteur sur une instance sur site de ThingWorx Flow.
Création d'un projet de connecteur
Un connecteur est un package npm spécialisé contenant divers artefacts, tels qu'une configuration OAuth, des actions, des lookups ou encore des déclencheurs. Le projet doit suivre les modèles de création d'un package npm. Il doit comporter un fichier package.json, un dossier lib, un dossier test et des dossiers pour chacun des artefacts et leurs versions.
Ouvrez une fenêtre terminal/cmd, puis accédez au dossier dans lequel vous voulez créer votre nouveau projet de connecteur. Dans ce tutoriel, nous allons créer notre connecteur dans le répertoire c:\test.
1. Placez-vous dans le répertoire de test : cd c:\test
2. Exécutez la commande suivante pour créer votre projet : flow init <projectname>
Vous devez obtenir ce qui suit :
cd c:\test
[2018-10-21T15:35:11.519] [INFO] default - Project gmail created successfully in .
3. Accédez au répertoire du projet dans un IDE pour examiner les artefacts créés par défaut.
Chaque projet contient un fichier index.js et un fichier package.json. Ne modifiez pas le fichier index.js car ce dernier est nécessaire au chargement des connecteurs sur le serveur ThingWorx Flow.
* 
Le fichier package.json référence ptc-flow-sdk. Sans cette dépendance, il n'est pas possible de tester, de déployer et d'exécuter le connecteur. Il fournit également certaines API qui facilitent le développement de connecteurs et le rendent plus cohérent.
1. Suivez les étapes indiquées dans l' Annexe A.
2. Installez le package async à l'aide de la commande suivante :
npm install async
3. Installez le module request à l'aide des commandes suivantes. Le module de requête contient une API pour l'exécution de requêtes HTTP.
npm install request
npm install request-promise
4. Installez le module lodash, qui fournit toute une série de fonctions utiles :
npm install lodash
npm install ptc-flow-sdk@<Version d'outil> -g
Vérifiez la <version d'outil> pour votre version de ThingWorx Flow ici.
* 
Toutes les commandes exécutées dans ce tutoriel le sont depuis le répertoire du projet de connecteur c:\test\gmail. Ceci évite d'avoir à fournir le chemin complet du répertoire du connecteur à l'aide des options -d/--projectDir.
Création d'une configuration OAuth2
* 
Avant de commencer, assurez-vous d'avoir suivi les étapes de la rubrique Configuration des tests sur les OAuths et déclencheurs.
Gmail utilise OAuth 2.0 pour l'authentification. Par conséquent, cet exemple de connecteur utilise OAuth 2.0 comme mécanisme d'authentification. Tous les fournisseurs OAuth2 imposent la création par une application d'un ID et d'une clé secrète client. L'application peut ensuite demander à l'utilisateur de se connecter au fournisseur OAuth à l'aide de ses informations d'identification. L'utilisateur peut ensuite accorder à l'application des permissions d'accès à ses données en son nom. Les permissions sont définies par des étendues. L'utilisateur peut configurer un accès sélectif à ses données par l'application. Pour le détail d'une telle mise en oeuvre pour Gmail (et d'autres applications Google), consultez les liens ci-dessous.
Fournissez une URL de redirection. L'URL de redirection
https://<nom_hôte>:<port>//Thingworx/Oauths/oauth/return se présente comme suit :
https://flow.local.rnd.ptc.com/Thingworx/Oauths/oauth/return
Certains systèmes permettent plusieurs redirections.
* 
L'hôte utilisé doit être ajouté au fichier .flow\flow.json présent dans le répertoire de base utilisateur. S'il ne s'agit pas du nom d'hôte réel, mais d'un alias vers l'hôte local, ajoutez-le au fichier des hôtes de votre système d'exploitation.
Par exemple,
1. Sous Windows, cliquez avec le bouton droit de la souris sur l'éditeur, puis sélectionnez Exécuter en tant qu'administrateur.
2. Modifiez le fichier d'hôte situé dans c:\windows\system32\drivers\etc\hosts, puis ajoutez ou mettez à jour une entrée comme suit :
127.0.0.1 flow.local.rnd.ptc.com
où flow.local.rnd.ptc.com doit être remplacé par l'alias.
Une fois les étapes précédentes effectuées, vous avez créé une application ainsi qu'un ID et une clé secrète client pour cette application.
1. Créez une configuration OAuth à l'aide de la commande suivante.
c:\test\gmail>flow add oauth gmail
[2018-10-21T16:26:54.398] [INFO] add-oauth - Oauth configuration gmail added successfully.
Cette commande crée le dossier \auth\oauth\gmail-gmail dans le dossier du projet. Le dossier contient un fichier config.json unique.
En l'espèce, ce fichier config.json est un modèle qui nécessite d'être personnalisé pour fonctionner avec un fournisseur OAuth spécifique tel que Google.
2. Ouvrez-le dans un éditeur de texte ou dans un environnement de développement intégré, puis apportez-lui les modifications indiquées ci-dessous. Veillez à modifier le fichier JSON comme il convient pour qu'il demeure valide.
3. Définissez la catégorie, le nom, le titre et les icônes comme il convient. Consultez la section Ajout d'icônes à votre connecteur pour tous les détails sur la création et la définition d'icônes.
4. Recherchez la clé oauth2_params_other et remplacez sa valeur par
[
"{\"access_type\":\"offline\"}"
]
5. Recherchez la clé oauth2_params_scope et remplacez sa valeur par le tableau JSON suivant :
[
"{\"https://www.googleapis.com/auth/gmail.labels\":\"Manage mailbox labels\"}",
"{\"https://www.googleapis.com/auth/gmail.insert\":\"Insert mail into your mailbox\"}",
"{\"https://www.googleapis.com/auth/gmail.modify\":\"All read/write operations except immediate, permanent deletion of threads and messages, bypassing Trash.\"}",
"{\"https://www.googleapis.com/auth/gmail.readonly\":\"Read all resources and their metadata—no write operations.\"}",
"{\"https://www.googleapis.com/auth/gmail.compose\":\"Create, read, update, and delete drafts. Send messages and drafts.\"}",
"{\"https://www.googleapis.com/auth/gmail.send\":\"Send email on your behalf\"}"
]
Notez la valeur de env_local_params. Ici "local" correspond au nom de l'environnement Il existe cinq environnements possibles, désignés par les clés env_production_params, env_pre_prod_params, env_staging_params, env_local_params. La valeur est de la forme {{{local.CLIENT_SECRET}}}. local.CLIENT_SECRET est une variable qui représente le nom de l'environnement. Elle doit être précédée de trois accolades ouvrantes et suivie de trois accolades fermantes. Ces valeurs sont remplacées par des valeurs fournies par le client lors de l'exécution du service LoadOAuthConfiguration dans ThingWorx Composer pour charger les OAuths sur le serveur ThingWorx Flow. Les valeurs sont fournies via un fichier JSON. La valeur est substituée lors de la génération d'une configuration OAuth uniquement pour l'environnement dans lequel le serveur ThingWorx Flow s'exécute. Si le serveur a une variable d'environnement NODE_ENV définie sur production, la valeur de production CLIENT_SECRET est renseignée avec les valeurs fournies dans le fichier de données OAuth. Ceci permet de personnaliser la configuration OAuth pour chaque déploiement client.
6. Recherchez base_url et remplacez sa valeur par https://accounts.google.com/o/oauth2.
7. Recherchez oauth2_auth_url et remplacez sa valeur par /auth.
Test d'une configuration OAuth
Une configuration OAuth peut être testée avant son déploiement. A cette fin, la CLI ThingWorx Flow lance un navigateur qui vous permet de vous connecter au fournisseur OAuth à l'aide de vos informations d'identification. Si l'authentification aboutit, le jeton d'accès est généré et vous pouvez l'enregistrer sur disque en vue de sa réutilisation ultérieure. Il est également possible de tester chaque configuration de déploiement en sélectionnant la configuration appropriée dans la fenêtre du navigateur Chrome intégré.
Avant de pouvoir exécuter la commande test, nous devons créer un fichier de données de test contenant l'ID et la clé secrète client réels qui seront utilisés dans env_<nom-environnement>_params, comme indiqué ci-dessus. Pour ce faire, créez un nouveau fichier JSON nommé testOauthData.json dans c:\test et ajoutez-y le contenu suivant.
{
"gmail-gmail": {
"Test Gmail Oauth": {
"CLIENT_ID": "<your-client-id-here>"
"CLIENT_SECRET": ""<your-client-secret-here>"
}
}
}
Assurez-vous de remplacer les éléments <your-client-id-here> et <your-client-secret-here> par les valeurs récupérées précédemment depuis la console Google.
Ensuite, assurez-vous que le fichier .flow\flow.json contenu dans le répertoire de base de l'utilisateur contient les bons nom d'hôte, port et mot de passe. Ceci n'est nécessaire que si un certificat a été fourni lors de la création du certificat auto-signé.
Exécutez la commande suivante depuis une invite de commande, set FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true.
Cette variable est requise car nous utilisons un certificat auto-signé pour exécuter l'outil.
1. Exécutez la commande suivante pour tester l'OAuth.
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Sélectionnez une configuration à tester, puis cliquez sur Validate Oauth Configuration.
3. Sélectionnez les étendues à rendre accessibles par l'application, puis cliquez sur Allow.
4. Spécifiez le nom d'utilisateur de votre compte Google. Il peut s'agir de n'importe quel compte Google, pas nécessairement celui utilisé pour créer l'ID et la clé secrète client.
5. Spécifiez votre mot de passe. Si l'authentification aboutit, le jeton d'accès est généré.
6. Cliquez sur Save and Exit pour enregistrer le jeton d'accès en vue de sa réutilisation ultérieure.
Le message suivant s'affiche sur la console.
[2018-10-22T12:51:07.643] [INFO] oauth - Access token saved with ID :664ec37a-9720-460c-8536-fbf372198cb1
L'ID indiqué dans ce message sera utilisé pour tester d'autres artefacts tributaires du jeton d'accès, tels que lookups, actions et déclencheurs. L'ID généré ci-dessus devra être fourni pour toutes les commandes de test à l'aide de l'option -a/--access_token.
* 
Si vous recevez une erreur, de discordance d'URI de redirection par exemple, assurez-vous que votre configuration flow.json est correcte et que l'URL utilisée par le flux correspond à celle enregistrée sur Google. L'URL de redirection utilisée par le flux est affichée sur la console au démarrage du test.
Par exemple, [2018-10-22T11:07:53.868] [INFO] oauthServer- Server started, redirect_uri used for oauth = https://flow.local.rnd.ptc.com:443/Thingworx/Oauths/oauth/return
* 
Les jetons d'accès OAuth ont une courte durée de vie. Avant de tester une action, un lookup ou un déclencheur, vous devrez exécuter la commande flow test oauth pour régénérer un nouveau jeton.
Création d'un lookup
Les lookups sont un mécanisme de recherche. Ils s'utilisent généralement pour récupérer de manière dynamique une liste d'options pour certains champs d'entrée d'actions ou de déclencheurs. Par exemple, les e-mails dans Gmail peuvent posséder des libellés associés. Ceux-ci sont utiles pour retrouver rapidement un jeu d'e-mails liés possédant tous un libellé donné. Le problème, cependant, est qu'il est peu probable que l'utilisateur se souvienne de tous les noms de libellé créés sur son compte. Le lookup que nous allons créer ici produit une paire ID et valeur pour les libellés trouvés sur le compte Gmail. Une ou plusieurs de ces données peuvent ensuite être utilisées pour obtenir les ID et objet des e-mails possédant le ou les libellé(s) concerné(s).
Les lookups n'utilisent pas de métadonnées, ils sont représentés par un fichier index.js unique. Par ailleurs, ils ne sont pas versionnés. Le fichier index.js peut contenir un nombre quelconque de méthodes de lookup.
Pour créer un lookup, exécutez la commande suivante :
c:\test\gmail>flow add lookup
[2018-10-22T14:41:52.298] [INFO] add-lookup - Lookup added successfully
L'exécution de cette commande génère un fichier index.js dans le dossier lookup\gmail.
Ouvrez le fichier index.js dans votre IDE et ajoutez-lui le code ci-dessous.
En haut du fichier, importez les modules suivants.
const async = require('async')
const request = require('request')
const logger = require('ptc-flow-sdk').getLogger('gmail-lookup')
Copiez le code ci-dessous après tout le code existant dans le fichier.

gmailAPIs.getLabels = function (input, options, output) {
logger.debug('Trying to fetch labels')
// Gmail API to fetch th labels in the gmail account
options.url = 'https://www.googleapis.com/gmail/v1/users/me/labels'
// Validating that the authorization is done and we have a access_token to //make a request else throw the error
options.validateDependencies(input.access_token, function (err, status) {
if (err) {
return output({
error: err
})
}
// If the authorization is proper then execute the request
execute(input, options, output)
})
}
// common function for api to execute the request module
function execute (input, options, output) {
async.waterfall([
function (cb) {
// In input we get auth code which we can use to get access token
getAccessToken(input, options, cb)
}
], function (err, accessToken) {
if (err) {
return output({
error: err
})
} else {
// Execute the request to get the labels from the gmail api
requestExecute(input, accessToken, options, output)
}
})
}
// Extract the acces_token from the input and return it
function getAccessToken (input, options, cb) {
options.getAccessToken(input.access_token, function (err, oauth) {
if (err) {
cb(err)
} else {
oauth = JSON.parse(oauth)
cb(null, oauth.access_token)
}
})
}
// Make a request to the gmail url to get the labels
function requestExecute (input, accessToken, options, output) {
request({
method: 'GET',
headers: {
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'application/json'
},
url: options.url
}, function (err, res, body) {
let result = []
if (err) {
return output({
error: err
})
}
if (res.statusCode === 401) {
return output({
error: 'Your access token is Invalid or Expired'
})
}
if (res.statusCode >= 200 && res.statusCode < 400) {
if (typeof (body) === 'string') {
body = JSON.parse(body)
}
result = filterResult(body.messages || body.labels || body, input)
var pageDetails = options.getPage(result, input, options)
var data = {
'results': result.slice(pageDetails.page, (pageDetails.page + options.maxResults))
}
data.next_page = options.getNextPage(data.results.length >= options.maxResults)
return output(null, data)
}
return output({
error: body
})
})
}
// filter result on the basis of output demand
function filterResult (body, input) {
var result = []
if (body && Array.isArray(body)) {
body.forEach(function (item, index) {
result.push({
'id': String(item.name),
'value': item.name
})
})
}
return result
}
Pour tester le lookup, exécutez les commandes suivantes :
1. Procurez-vous un nouveau jeton d'accès à l'aide de la commande suivante :
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Enregistrez le jeton et quittez.
3. Testez le lookup à l'aide de la commande suivante :
flow test lookup gmail getLabels -a cecd33a3-8a33-4c0c-b298-178fd80a9261 -l trace. La sortie générée par le lookup s'affiche. Cette sortie est un tableau JSON d'ID et de valeurs.
Création et test d'une action
Une action interagit avec le système externe connecté pour effectuer une opération donnée. Il s'agit généralement d'une opération de création, de lecture, de mise à jour ou de suppression. Les actions nécessitent des entrées et produisent des sorties. Les entrées et sorties d'une action doivent être spécifiées dans le fichier action.json. Les propriétés d'entrée et de sortie sont des schémas JSON spéciaux utilisés pour rendre le formulaire d'entrée et, en ce qui concerne le schéma de sortie, l'interface utilisateur de mappage. Le tag et l'icône utilisés pour regrouper les actions et afficher une icône pour l'action dans l'interface utilisateur constituent d'autres propriétés utiles.
Pour créer une nouvelle action, exécutez la commande suivante :
c:\test\gmail>flow add action get-messages
[2018-10-22T16:26:53.925] [INFO] add-action - Action get-messages, version v1 added successfully
Ouvrez ensuite le fichier action.json (C:\test\gmail\action\gmail-get-messages\v1\action.json) dans votre IDE.
Définissez la propriété d'entrée et d'icône de Gmail. Le schéma JSON de la propriété d'entrée est illustré dans le code ci-dessous :
Set the input property to {
"title": "Get email messages",
"type": "object",
"properties": {
"auth": {
"title": "Authorize gmail",
"type": "string",
"oauth": "gmail-gmail",
"minLength": 1
},
"label": {
"title": "Label",
"type": "string",
"minLength": 1,
"lookup": {
"id": "getLabels",
"service": "gmail",
"enabled": true,
"searchable": false,
"auth": "oauth",
"dependencies": [
"auth"
]
}
}
}
}
Le schéma d'entrée définit un champ d'entrée unique. Il s'agit d'une liste étant donné qu'un lookup a été spécifié. Lorsqu'il est utilisé dans le composeur de flux, le lookup est exécuté et les valeurs renvoyées s'affichent dans la liste. Notez la manière dont les dépendances du lookup sont décrites. Il est ainsi indiqué au système que le champ d'authentification doit être renseigné pour que le lookup puisse être appelé.
La propriété auth décrit la méthode d'authentification utilisée par cette action. Dans ce cas, nous utilisons une configuration OAuth Gmail.
Set the “output” property to {
"messages": {
"title": "Messages",
"type": "array",
"items": {
"type": "object",
"properties": {
"messageId": {
"type": "string",
"title": "Message Detail ID"
},
"subject": {
"type": "string",
"title": "Message Detail Sub"
}
}
}
}
}
* 
La sortie générée par l'action est un tableau JSON d'objets JSON. Chaque objet possèdera des champs messageId et subject.
Ouvrez le fichier index.js dans votre IDE. En haut du fichier, ajoutez le code suivant :
const rp = require('request-promise')
const logger = require('ptc-flow-sdk').getLogger('gmail-get-messages')
Remplacez la méthode execute par le code ci-dessous :
this.execute = function (input, output) {
// Create a request header to get messages under a label selected from
const options = {
method: 'GET',
url: 'https://www.googleapis.com/gmail/v1/users/me/messages',
useQuerystring: true,
qs: {labelIds: ['STARRED']},
headers:
{
'Authorization': 'Bearer ' + input.auth,
'Content-Type': 'application/json'
}
}
rp(options).then((rawData) => {
const data = JSON.parse(rawData)
let mailRequests = []
if (data && data.messages) {
data.messages.forEach((msg) => {
mailRequests.push(this.fetchMessage(msg.id, input.auth))
})
return Promise.all(mailRequests)
} else {
logger.warn('No messages found')
Promise.resolve()
}
}).then((results) => {
if (results) {
let arr = []
results.forEach((result) => {
let resData = JSON.parse(result)
let msgHeader = resData.payload.headers.find(header => header.name === 'Subject')
arr.push({messageId: resData.id, subject: msgHeader ? msgHeader.value : 'No subject'})
})
return output(null, {messages: arr})
} else {
return output(null)
}
}).catch(err => {
return output(err)
})
}
Ajoutez la nouvelle méthode donnée ci-dessous :
this.fetchMessage = function (msgId, authToken) {
const options = {
method: 'GET',
url: 'https://www.googleapis.com/gmail/v1/users/me/messages/' + msgId,
qs: { format: 'metadata', metadataHeaders: 'Subject' },
headers:
{
'Authorization': 'Bearer ' + authToken,
'Content-Type': 'application/json'
}
}
return rp(options)
}
Assurez-vous que votre fichier est un fichier JavaScript valide.
1. Récupérez à nouveau le jeton d'accès comme suit :
Définissez FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true.
Exécutez la commande suivante, puis notez l'ID renvoyé.
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Créez un nouveau fichier JavaScript C:\test\gmail\test\actionTestData.js, ajoutez-lui le code suivant, puis enregistrez-le.
module.exports = {
testInput: {
label: 'STARRED'//use a label that applies to a few emails.
},
testOutputFn: function (input, actualOutput) {
// validate the actualOutput against expected output
// return a rejected promise to fail the validation or a resolved promise for success
// return Promise.reject(new Error('Validation successful'))
return Promise.reject(new Error('Validation failed'))
}
}
* 
Les paramètres -i/--input et -o/--output acceptent des données ou fonctions qui renvoient un objet promise.
Lorsque ce code est exécuté sur un serveur, l'étiquette est disponible dans le paramètre d'entrée et accessible en tant que input.label. L'utilitaire de test n'exécute pas de lookup. Par conséquent, la sortie du lookup doit lui être transmise.
3. Exécutez la commande test comme suit :
C:\test\gmail>flow test action gmail-get-messages -a 685b7377-7000-
4a92-8679-8630c68a3265 -l debug -i testInput -f
C:\test\gmail\test\actionTestData.js -o testOutput
The test run should succeed.
Création et test d'un déclencheur d'interrogation
1. Pour créer un nouveau déclencheur d'interrogation, exécutez la commande suivante :
flow add trigger -p
[2019-02-28T17:03:23.823] [INFO] add-trigger - Trigger gmail, version v1 added successfully
2. A partir de votre environnement de développement intégré, ouvrez le fichier trigger.json situé dans C:\test\gmail\trigger\poll\gmail \v1\trigger.json.
3. Définissez la propriété d'icône de Gmail comme suit :
"icon": "gmail",
4. Définissez les propriétés d'entrée et de sortie.

Set the input property to
{
"properties": {
"auth": {
"type": "string",
"title": "Authorize gmail",
"minLength": 1,
"oauth": "gmail-gmail",
"propertyOrder": 1
},
"search": {
"type": "string",
"title": "Search Text",
"propertyOrder": 2,
"description": "Enter the search text to search for a specific email. E.g., from:john or subject:Christmas"
},
"customFilters": {
"type": "array",
"propertyOrder": 5,
"title": "Custom Filters",
"items": {
"type": "object",
"title": "Filter",
"properties": {
"input": {
"type": "string",
"title": "Input",
"minLength": 1
},
"operator": {
"type": "string",
"title": "Condition",
"enum": [
"Equals",
"GreaterThan"
],
"enumNames": [
"Equals",
"Greater Than"
]
},
"expected": {
"type": "string",
"title": "Expected",
"minLength": 1
}
}
}
}
},
"oneOf": [
{
"type": "object",
"title": "New Email",
"description": "Triggers when a new email is received",
"properties": {
"event": {
"type": "string",
"readonly": true,
"enum": [
"new_mail"
],
"options": {
"hidden": true
},
"propertyOrder": 3
},
"label": {
"type": "string",
"title": "Label",
"propertyOrder": 4,
"description": "Select a label for which you wish to set a trigger. E.g., If you select label as ‘Trash’, the trigger will fire off every time a new mail is moved to label named ‘Trash’ in your Gmail account."
}
}
},
{
"type": "object",
"title": "New Attachment",
"description": "Triggers when a new attachment is received",
"properties": {
"event": {
"type": "string",
"readonly": true,
"enum": [
"new_attachment"
],
"options": {
"hidden": true
},
"propertyOrder": 3
},
"label": {
"type": "string",
"title": "Label",
"propertyOrder": 4,
"description": "Select a label for which you wish to set a trigger. E.g., If you select label as ‘Trash’, the trigger will fire off every time a new mail is moved to label named ‘Trash’ in your Gmail account."
}
}
}
]
}
Le schéma d'entrée définit un champ d'entrée unique. L'objet oneOf définit les événements pris en charge par le déclencheur. Le schéma ci-dessus définit deux événements déclencheurs :
Nouvel e-mail
Nouvelle pièce jointe
La propriété auth décrit la méthode d'authentification utilisée par ce déclencheur. Dans ce cas, nous utilisons une configuration OAuth Gmail.
Set the “output” property to
{
"new_mail": {
"type": "object",
"properties": {
"messageId": {
"type": "string",
"title": "ID",
"displayTitle": "ID"
},
"subject": {
"title": "Subject",
"displayTitle": "Subject",
"type": "string"
}
}
},
"new_attachment": {
"type": "object",
"properties": {
"attachments": {
"title": "Attachments",
"displayTitle": "Attachments",
"type": "array",
"items": {
"type": "object",
"properties": {
"mimeType": {
"title": "Mime Type",
"displayTitle": "Mime Type",
"type": "string"
},
"filename": {
"title": "File Name",
"displayTitle": "File Name",
"type": "string"
},
"attachmentId": {
"title": "Attachment ID",
"displayTitle": "Attachment ID",
"type": "string"
}
}
}
}
}
}
}
Le schéma de sortie ci-dessus définit les propriétés de sortie pour deux événements déclencheurs définis dans le schéma d'entrée du déclencheur.
1. Ouvrez le fichier index.js dans l'environnement de développement intégré, puis ajoutez le code suivant en haut du fichier :
const rp = require('request-promise')
const logger = require('ptc-flow-sdk').getLogger('gmail-trigger')
2. Remplacez la méthode execute par le code ci-dessous :
Trigger.execute = function (input, options, output) {
// Create a request header to get messages under a label selected from
var date = new Date(options.unixTime * 1000)
const httpOpts = {
method: 'GET',
url: 'https://www.googleapis.com/gmail/v1/users/me/messages',
useQuerystring: true,
qs: { q: 'newer:' + date.getFullYear() + '/' + date.getMonth() + '/' + date.getDay() },
headers:
{
'Authorization': 'Bearer ' + input.auth,
'Content-Type': 'application/json'
}
}
rp(httpOpts).then((rawData) => {
const data = JSON.parse(rawData)
let mailRequests = []
if (data && data.messages) {
data.messages.forEach((msg) => {
mailRequests.push(this.fetchMessage(msg.id, input.auth))
})
return Promise.all(mailRequests)
} else {
logger.warn('No messages found')
Promise.resolve()
}
}).then((results) => {
if (results) {
let arr = []
results.forEach((result) => {
let resData = JSON.parse(result)
let msgHeader = resData.payload.headers.find(header => header.name === 'Subject')
arr.push({ messageId: resData.id, subject: msgHeader ? msgHeader.value : 'No subject' })
})
return output(null, { messages: arr })
} else {
return output(null)
}
}).catch(err => {
return output(err)
})
}
3. Ajoutez la nouvelle méthode donnée ci-dessous :
Trigger.fetchMessage = function (msgId, authToken) {
const options = {
method: 'GET',
url: 'https://www.googleapis.com/gmail/v1/users/me/messages/' + msgId,
qs: { format: 'metadata', metadataHeaders: 'Subject' },
headers:
{
'Authorization': 'Bearer ' + authToken,
'Content-Type': 'application/json'
}
}
return rp(options)
}
* 
Assurez-vous que votre fichier est un fichier JavaScript valide.
Acquisition du jeton d'accès
Pour obtenir de nouveau le jeton d'accès, procédez comme suit :
1. Définissez la propriété suivante : FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true
2. Exécutez la commande suivante, puis notez l'ID renvoyé.
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
3. Exécutez la commande test comme suit :
flow test trigger gmail execute -p -e new_mail -a e0d56340-2fc4-4618-931c-ad6c983ae0e5 --stopAfter 1 --unixTime 1551312000
Ajout d'icônes au connecteur
1. Créez un dossier common dans votre projet de connecteur.
2. Sous le dossier common, créez le dossier nommé css.
3. Ajoutez un fichier JSON avec le format suivant :
{ "name": "connector-name",
"background": "#FFFFFF",
"png128pxBase64": "base64encodedbinarydata"
}
La propriété name doit spécifier le nom du connecteur et doit correspondre à la propriété icon des actions dans leurs fichiers metadata json.
Pour le fond, spécifiez un code couleur HEX, comme illustré dans l'exemple.
Les images des icônes doivent être au format .PNG et les données binaires doivent être codées en base64. Pour plus d'informations, recherchez sur Internet comment convertir un fichier PNG dans sa représentation binaire codée en base64.