ThingWorx Flow > SDK di ThingWorx Flow > Esercitazione B: esercitazione sull'SDK per i connettori di ThingWorx Flow
Esercitazione B: esercitazione sull'SDK per i connettori di ThingWorx Flow
Prerequisiti
Di seguito sono riportati i prerequisiti necessari per questa esercitazione.
La versione LTS di Node.js supportata con la versione di ThingWorx Flow installata
Per conoscere la versione di node.js attualmente in uso, aprire il prompt dei comandi ed eseguire il comando seguente:
node -v
Un ambiente di sviluppo integrato (IDE) in grado di gestire i progetti Node.js.
L'ambiente IDE utilizzato in questa esercitazione è WebStorm.
Una conoscenza di medio livello del codice Node.js
Cartella degli esempi
* 
Si consiglia di utilizzare lo stesso computer in cui è installato ThingWorx Flow per utilizzare i componenti installati.
Introduzione 
L'esercitazione illustra i passi necessari per creare un connettore tradizionale. Viene creato un connettore per Gmail in quanto è probabile che la maggior parte degli sviluppatori abbia familiarità con il funzionamento di Gmail. Durante la creazione del connettore, si familiarizza con gli strumenti, gli elementi e i processi coinvolti e si può creare un connettore per la propria applicazione. La creazione di un nuovo connettore non richiede una distribuzione di ThingWorx Flow. Dopo che il connettore è stato creato e testato in locale, è possibile distribuirlo in un'installazione locale di prova per testarlo.
L'esercitazione illustra quanto segue:
1. Creazione di un progetto di connettore.
2. configurazione OAuth2
3. Creazione di una ricerca che cerca filtri correlati nell'account Gmail.
4. Creazione di un'azione per ottenere l'ID e l'oggetto di messaggi e-mail che corrispondono al filtro selezionato.
5. Creazione di un trigger che consenta l'avvio di un nuovo flusso alla ricezione di una nuova e-mail.
6. aggiunta di icone
7. distribuzione di connettori in un'istanza locale di ThingWorx Flow
Passo 1: creazione di un progetto di connettore 
Un connettore è un package npm specializzato costituito da vari elementi come una configurazione OAuth, un'azione, ricerche e trigger. Il progetto deve seguire i modelli per la creazione di un package npm. Deve contenere un file package.json, una cartella lib, una cartella test e cartelle per ognuno degli elementi e le relative versioni.
Aprire una finestra terminal/cmd e passare a una cartella in cui si desidera creare il progetto di un nuovo connettore. In questa esercitazione, il connettore viene creato nella directory c:\test
1. Passare alla directory di test: cd c:\test
2. Per creare un progetto, eseguire il comando seguente: flow init <projectname>
Risultato:
cd c:\test
[2018-10-21T15:35:11.519] [INFO] default - Project gmail created successfully in .
3. Aprire la directory del progetto in un ambiente IDE per esaminare gli elementi creati per default.
Ogni progetto contiene un file index.js e un file package.json. Non modificare il file index.js in quanto è necessario per caricare i connettori sul server ThingWorx Flow.
* 
Il file package.json fa riferimento a ptc-flow-sdk. Senza questa dipendenza non è possibile testare, distribuire o eseguire il connettore. Il file fornisce inoltre alcune API che rendono lo sviluppo del connettore più semplice e congruente.
1. Seguire la procedura riportata nell'Esercitazione A.
2. Installare il package async utilizzando il comando seguente:
npm install async
3. Installare il modulo request utilizzando i seguenti comandi. Il modulo request contiene un'API per effettuare le richieste HTTP.
npm install request
npm install request-promise
4. Installare il modulo lodash che fornisce molte funzioni utili:
npm install lodash
npm install ptc-flow-sdk@<Versione strumento> -g
Verificare la <Versione strumento> per la versione di ThingWorx Flow in uso qui.
* 
Tutti i comandi nell'esercitazione vengono eseguiti dalla directory del progetto di connettore c:\test\gmail. In questo modo si evita di specificare il percorso completo della directory del connettore utilizzando le opzioni -d/--projectDir.
Passo 2: creazione di una configurazione OAuth2 
* 
Prima di iniziare, assicurarsi di avere seguito i passi descritti nella sezione Configurazione per testare i protocolli OAuth e i trigger.
Gmail utilizza OAuth 2.0 per l'autenticazione. Pertanto il connettore di esempio utilizza OAuth 2.0 come meccanismo di autenticazione. Tutti i provider OAuth2 necessitano di un'applicazione per creare un ID client e un segreto client. L'applicazione può quindi richiedere a un utente di accedere al provider OAuth utilizzando queste credenziali. L'utente può concedere all'applicazione i permessi per accedere ai dati per conto dell'utente. I permessi sono definiti in base agli ambiti. L'utente può fornire all'applicazione l'accesso ai propri dati in modo selettivo. Per i dettagli su come questo meccanismo è implementato per Gmail e altre app Google, visitare i seguenti link:
Fornire un URL di reindirizzamento. L'URL di reindirizzamento:
https://<nomehost>:<porta>//Thingworx/Oauths/oauth/return è analogo al seguente URL:
https://flow.local.rnd.ptc.com/Thingworx/Oauths/oauth/return
Alcuni sistemi consentono più reindirizzamenti.
* 
Assicurarsi che l'host che si utilizza in questa sede sia aggiunto al file .flow\flow.json nella home directory dell'utente. Se non si tratta del nome host effettivo ma di un alias dell'host locale, aggiungerlo al file host del sistema operativo. Di seguito è riportato un esempio di flow.json.
{
"hostname": "localhost",
"port":443
}
Il valore di hostname deve essere localhost.
Il valore di port è il numero di porta ospitata da ThingWorx Flow. Il numero di default è 443.
Ad esempio:
1. In Windows fare clic con il pulsante destro del mouse sull'editor, quindi selezionare Esegui come amministratore.
2. Modificare il file host che si trova in c:\windows\system32\drivers\etc\hosts e aggiungere o aggiornare una voce come segue:
127.0.0.1 flow.local.rnd.ptc.com
dove flow.local.rnd.ptc.com deve essere sostituito con l'alias.
Completando i passi precedenti si creano un'applicazione e un ID client e un segreto client per l'applicazione.
1. Creare una configurazione OAuth utilizzando il comando seguente:
c:\test\gmail>flow add oauth gmail
[2018-10-21T16:26:54.398] [INFO] add-oauth - Oauth configuration gmail added successfully.
Questo comando crea la cartella \auth\oauth\gmail-gmail nella cartella del progetto. La cartella contiene un singolo file config.json.
In questo caso il file config.json è un modello che deve essere personalizzato per funzionare con un provider OAuth specifico come Google.
2. Aprire il file in un editor di testo o nell'ambiente IDE, quindi apportarvi le modifiche descritte di seguito. Assicurarsi di modificare il file nel modo corretto e di non alternarne la validità come file JSON.
3. Impostare categoria, nome, titolo e icone in base alle esigenze. Per informazioni dettagliate sulla creazione e sull'impostazione delle icone, vedere la sezione Aggiunta di icone al connettore di seguito.
4. Cercare la chiave oauth2_params_other e sostituirla con il valore
[
"{\"access_type\":\"offline\"}"
]
5. Cercare la chiave oauth2_params_scope e sostituirne il valore con la seguente matrice JSON:
[
"{\"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\"}"
]
Si noti il valore di env_local_params. Per local si intende un nome dell'ambiente. Esistono cinque possibili ambienti che sono rappresentati dalle chiavi env_production_params, env_pre_prod_params, env_staging_params, env_local_params. Il valore si presenta nel formato {{{local.CLIENT_SECRET}}}. La variabile local.CLIENT_SECRET rappresenta il nome dell'ambiente e deve essere racchiusa tra tre coppie di parentesi graffe. Questi valori vengono sostituiti con i valori immessi dal cliente durante l'esecuzione del servizio LoadOAuthConfiguration in ThingWorx Composer per caricare le configurazioni OAuth sul server ThingWorx Flow. I valori sono forniti tramite un file JSON. Il valore viene sostituito quando si genera una configurazione OAuth solo per l'ambiente in cui è in esecuzione il server ThingWorx Flow. Se il server ha una variabile di ambiente NODE_ENV impostata per la produzione, il valore di produzione CLIENT_SECRET viene completato con i valori forniti nel file di dati OAuth. In questo modo è possibile personalizzare la configurazione OAuth per ogni distribuzione al cliente.
6. Cercare base_url e sostituirne il valore con https://accounts.google.com/o/oauth2.
7. Cercare oauth2_auth_url e sostituirne il valore con /auth.
Passo 3: test di una configurazione OAuth 
È possibile testare una configurazione OAuth prima di distribuirla. A tal fine l'interfaccia della riga di comando di ThingWorx Flow avvia un browser tramite cui è possibile accedere al provider OAuth utilizzando le proprie credenziali. Se l'autenticazione ha esito positivo, il token di accesso viene generato e può essere salvato su disco per un utilizzo successivo. È anche possibile testare ciascuna configurazione di distribuzione selezionando la configurazione appropriata nella finestra del browser Chrome incorporato.
Prima di poter eseguire il comando test, è necessario creare un file di dati di test contenente l'ID client e il segreto effettivi che devono sostituire il parametro env_<nome-ambiente>_params come menzionato sopra. A tal fine creare un nuovo file JSON, testOauthData.json, in c:\test e aggiungervi il contenuto seguente:
{
"gmail-gmail": {
"Test Gmail Oauth": {
"CLIENT_ID": "<your-client-id-here>"
"CLIENT_SECRET": ""<your-client-secret-here>"
}
}
}
Assicurarsi di sostituire <your-client-id-here> e <your-client-secret-here> con i valori precedentemente recuperati dalla console di Google.
Assicurarsi quindi che il file .flow\flow.json presente nella home directory dell'utente contenga il nome host, la porta e la passphrase del certificato corretti. La passphrase è necessaria solo se ne è stata specificata una durante la creazione del certificato autofirmato.
In un prompt dei comandi eseguire il comando seguente: set FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true
Questa variabile è obbligatoria in quanto si sta utilizzando un certificato autofirmato per eseguire lo strumento.
1. Eseguire il comando seguente per testare la configurazione OAuth:
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Selezionare una configurazione da testare e fare clic su Validate OAuth Configuration.
3. Selezionare gli ambiti a cui si desidera che l'applicazione abbia accesso e fare clic su Allow.
4. Immettere il nome utente dell'account Google, che può essere un account Google qualsiasi, non necessariamente quello utilizzato per creare l'ID e il segreto client.
5. Immettere la password. Se l'autenticazione ha esito positivo, viene visualizzato il token di accesso.
6. Fare clic Save and Exit per salvare il token di accesso per un utilizzo futuro.
Nella console viene visualizzato il seguente messaggio:
[2018-10-22T12:51:07.643] [INFO] oauth - Access token saved with ID :664ec37a-9720-460c-8536-fbf372198cb1
L'ID fornito da questo messaggio viene utilizzato per testare altri elementi che dipendono dal token di accesso, ad esempio ricerche, azioni e trigger. L'ID prodotto prima deve essere specificato in tutti i comandi test utilizzando l'opzione -a/--access_token.
* 
Se si verifica un errore di mancata corrispondenza dell'URI di reindirizzamento, assicurarsi che la configurazione flow.json sia corretta e che l'URL utilizzato da Flow corrisponda a quello registrato in Google. L'URL di reindirizzamento utilizzato da Flow viene visualizzato nella console all'inizio del test.
Esempio: [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
* 
I token di accesso OAuth hanno vita breve. Prima di utilizzare il token di accesso per testare un'azione, una ricerca o un trigger, è consigliabile eseguire il comando flow test oauth per rigenerare un nuovo token.
Passo 4: creazione di una ricerca 
Le ricerche sono meccanismi di ricerca. In genere vengono utilizzate per ottenere in modo dinamico un elenco di opzioni per determinati campi di input di azioni o trigger. Ad esempio possono essere associate delle etichette ai messaggi e-mail in Gmail. In questo modo è più semplice cercare rapidamente tutte le e-mail correlate che utilizzano l'etichetta come tag. È tuttavia improbabile che un utente finale si ricordi i nomi di tutte le etichette create nel proprio account. La ricerca che viene creata in questa esercitazione produce coppie ID-valore per le etichette rilevate nell'account Gmail. Una o più di queste coppie possono quindi essere utilizzate per ottenere l'ID e l'oggetto delle e-mail con tali etichette.
Le ricerche non hanno metadati. Sono invece rappresentate da un singolo file index.js. Inoltre non vengono loro assegnate versioni. Nel file index.js può essere presente un numero qualsiasi di metodi di ricerca.
Per creare una ricerca, utilizzare il comando seguente:
c:\test\gmail>flow add lookup
[2018-10-22T14:41:52.298] [INFO] add-lookup - Lookup added successfully
L'esecuzione del comando genera un file index.js nella cartella lookup\gmail.
Aprire il file index.js nell'ambiente IDE e aggiungervi il codice riportato di seguito.
Nella parte iniziale del file importare i moduli seguenti.
const async = require('async')
const request = require('request')
const logger = require('ptc-flow-sdk').getLogger('gmail-lookup')
Copiare il codice sottostante alla fine di tutto il codice presente nel file:

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
}
Per testare la ricerca, eseguire i comandi riportati di seguito.
1. Ottenere un nuovo token di accesso utilizzando il comando seguente:
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Salvare il token e uscire.
3. Testare la ricerca utilizzando il comando seguente:
flow test lookup gmail getLabels -a cecd33a3-8a33-4c0c-b298-178fd80a9261 -l trace. Dovrebbe essere visibile l'output generato dalla ricerca. L'output è una matrice JSON di ID e valori.
Passo 5: creazione e test di un'azione 
Un'azione interagisce con il sistema connesso esterno per eseguire alcune operazioni. In genere si tratta di un'operazione creazione, lettura, aggiornamento o eliminazione. Le azioni accettano input e producono output. Gli input e gli output prodotti da un'azione devono essere specificati nel file action.json. Le proprietà di input e output sono schemi JSON speciali che vengono utilizzati per il rendering del modulo di input e lo schema di output viene utilizzato per eseguire il rendering dell'interfaccia utente di mappatura. Altre proprietà utili includono il tag e l'icona che vengono utilizzati rispettivamente per raggruppare le azioni e visualizzare un'icona per l'azione nell'interfaccia utente.
Per creare una nuova azione, utilizzare il comando seguente:
c:\test\gmail>flow add action get-messages
[2018-10-22T16:26:53.925] [INFO] add-action - Action get-messages, version v1 added successfully
Successivamente aprire il file action.json nella cartella C:\test\gmail\action\gmail-get-messages\v1\action.json nell'ambiente IDE in uso.
Impostare le proprietà input e icon su Gmail. Lo schema JSON della proprietà input è illustrato nel blocco di codice seguente:
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"
]
}
}
}
}
Lo schema di input definisce un singolo campo di input. Si tratta di un elenco dal momento che è stata specificata una ricerca per questo campo. Quando viene utilizzata nel Composer del flusso, la ricerca viene eseguita e i valori restituiti vengono visualizzati nell'elenco. Si noti il modo in cui vengono descritte le dipendenze della ricerca. Questo indica al sistema che il campo auth deve essere compilato prima di richiamare la ricerca.
La proprietà auth descrive il metodo di autenticazione utilizzato da questa azione. In questo caso si utilizza una configurazione OAuth di 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"
}
}
}
}
}
* 
L'output prodotto dall'azione è una matrice JSON di oggetti JSON. Ogni oggetto dispone dei campi messageId e subject.
Aprire il file index.js nell'ambiente IDE. All'inizio del file aggiungere il codice seguente:
const rp = require('request-promise')
const logger = require('ptc-flow-sdk').getLogger('gmail-get-messages')
Sostituire il metodo execute con il codice seguente:
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)
})
}
Aggiungere il seguente nuovo metodo:
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)
}
Assicurarsi che il file sia un file JavaScript valido.
1. Acquisire di nuovo il token di accesso utilizzando i passi descritti di seguito.
Impostare FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true
Eseguire il comando che segue e annotare l'ID restituito.
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
2. Creare un nuovo file JavaScript C:\test\gmail\test\actionTestData.js e aggiungervi il codice riportato di seguito, quindi salvare il file.
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'))
}
}
* 
I parametri -i/--input e -o/--output accettano dati o funzioni che restituiscono una promessa.
Quando questo codice viene eseguito in un server, l'etichetta è disponibile come parte del parametro di input ed è possibile accedervi come input.label. L'utilità di test non esegue una ricerca, quindi l'output della ricerca deve essere passato all'utilità.
3. Eseguire il comando test seguente:
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.
Passo 6: creazione e test di un trigger polling 
1. Per creare un nuovo trigger polling, eseguire il comando seguente:
flow add trigger -p
[2019-02-28T17:03:23.823] [INFO] add-trigger - Trigger gmail, version v1 added successfully
2. Nell'ambiente IDE aprire il file trigger.json che si trova in C:\test\gmail\trigger\poll\gmail \v1\trigger.json.
3. Impostare la proprietà icon per Gmail come segue:
"icon": "gmail",
4. Impostare le proprietà di input e output.

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."
}
}
}
]
}
Lo schema di input definisce un singolo campo di input. L'oggetto oneOf definisce gli eventi supportati dal trigger. Lo schema precedente definisce due eventi trigger:
Nuova e-mail
Nuovo allegato
La proprietà auth descrive il metodo di autenticazione utilizzato da questo trigger. In questo caso si utilizza una configurazione OAuth di 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"
}
}
}
}
}
}
}
Lo schema di output precedente definisce le proprietà di output per due eventi trigger definiti nello schema di input del trigger.
1. Aprire il file index.js nell'ambiente IDE, quindi aggiungere il codice seguente nella parte superiore del file:
const rp = require('request-promise')
const logger = require('ptc-flow-sdk').getLogger('gmail-trigger')
2. Sostituire il metodo execute con il codice seguente:
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. Aggiungere il seguente nuovo metodo:
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)
}
* 
Assicurarsi che il file sia un file JavaScript valido.
Passo 7: acquisizione del token di accesso 
Per acquisire nuovamente il token di accesso, attenersi alla procedura descritta di seguito.
1. Impostare la proprietà seguente: FLOW_ALLOW_UNTRUSTED_CERTIFICATES=true
2. Eseguire il comando che segue e annotare l'ID restituito.
flow test oauth gmail-gmail -f ..\testOauthData.json -t "Test Gmail Oauth"
3. Eseguire il comando test seguente:
flow test trigger gmail execute -p -e new_mail -a e0d56340-2fc4-4618-931c-ad6c983ae0e5 --stopAfter 1 --unixTime 1551312000
Passo 8: aggiunta di icone al connettore 
1. Creare una cartella common nel progetto del connettore.
2. Nella cartella common creare la cartella css.
3. Aggiungere un file JSON con il seguente formato:
{ "name": "connector-name",
"background": "#FFFFFF",
"png128pxBase64": "base64encodedbinarydata"
}
La proprietà name deve essere il nome del connettore e deve corrispondere alla proprietà icon delle azioni nei file json di metadati.
Lo sfondo deve corrispondere a un codice colore esadecimale come mostrato nell'esempio.
Le immagini delle icone devono essere nel formato .png e i dati binari devono essere codificati in base64. Per ulteriori informazioni, cercare in Internet come convertire un file PNG nella relativa rappresentazione binaria codificata base64.
È stato utile?