From f5648fd6e10dd51c33d83b35cf9d66e074eadf4d Mon Sep 17 00:00:00 2001 From: Ricardo Espinoza Date: Tue, 5 Nov 2019 10:17:06 -0500 Subject: [PATCH] node-setup --- .../credentials/TodoistApi.credentials.ts | 18 ++++ .../nodes/Todoist/GenericFunctions.ts | 101 ++++++++++++++++++ .../nodes-base/nodes/Todoist/Todoist.node.ts | 90 ++++++++++++++++ packages/nodes-base/nodes/Todoist/todoist.png | Bin 0 -> 4475 bytes packages/nodes-base/package.json | 6 +- 5 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 packages/nodes-base/credentials/TodoistApi.credentials.ts create mode 100644 packages/nodes-base/nodes/Todoist/GenericFunctions.ts create mode 100644 packages/nodes-base/nodes/Todoist/Todoist.node.ts create mode 100644 packages/nodes-base/nodes/Todoist/todoist.png diff --git a/packages/nodes-base/credentials/TodoistApi.credentials.ts b/packages/nodes-base/credentials/TodoistApi.credentials.ts new file mode 100644 index 0000000000..cec053e40e --- /dev/null +++ b/packages/nodes-base/credentials/TodoistApi.credentials.ts @@ -0,0 +1,18 @@ +import { + ICredentialType, + NodePropertyTypes, +} from 'n8n-workflow'; + + +export class TodoistApi implements ICredentialType { + name = 'todoistApi'; + displayName = 'Todoist API'; + properties = [ + { + displayName: 'API Key', + name: 'apiKey', + type: 'string' as NodePropertyTypes, + default: '', + }, + ]; +} diff --git a/packages/nodes-base/nodes/Todoist/GenericFunctions.ts b/packages/nodes-base/nodes/Todoist/GenericFunctions.ts new file mode 100644 index 0000000000..f98b54f1c7 --- /dev/null +++ b/packages/nodes-base/nodes/Todoist/GenericFunctions.ts @@ -0,0 +1,101 @@ +import { OptionsWithUri } from 'request'; + +import { + IExecuteFunctions, + IHookFunctions, + ILoadOptionsFunctions, + IExecuteSingleFunctions +} from 'n8n-core'; + +import * as _ from 'lodash'; +import { IDataObject } from 'n8n-workflow'; + +export async function mandrillApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, resource: string, method: string, action: string, body: any = {}, headers?: object): Promise { // tslint:disable-line:no-any + const credentials = this.getCredentials('mandrillApi'); + + if (credentials === undefined) { + throw new Error('No credentials got returned!'); + } + + const data = Object.assign({}, body, { key: credentials.apiKey }); + + const endpoint = 'mandrillapp.com/api/1.0'; + + const options: OptionsWithUri = { + headers, + method, + uri: `https://${endpoint}${resource}${action}.json`, + body: data, + json: true + }; + + + try { + return await this.helpers.request!(options); + } catch (error) { + console.error(error); + + const errorMessage = error.response.body.message || error.response.body.Message; + if (error.name === 'Invalid_Key') { + throw new Error('The provided API key is not a valid Mandrill API key'); + } else if (error.name === 'ValidationError') { + throw new Error('The parameters passed to the API call are invalid or not provided when required'); + } else if (error.name === 'GeneralError') { + throw new Error('An unexpected error occurred processing the request. Mandrill developers will be notified.'); + } + + if (errorMessage !== undefined) { + throw errorMessage; + } + throw error.response.body; + } +} + +export function getToEmailArray(toEmail: string): any { // tslint:disable-line:no-any + let toEmailArray; + if (toEmail.split(',').length > 0) { + const array = toEmail.split(','); + toEmailArray = _.map(array, (email) => { + return { + email, + type: 'to' + }; + }); + } else { + toEmailArray = [{ + email: toEmail, + type: 'to' + }]; + } + return toEmailArray; +} + +export function getGoogleAnalyticsDomainsArray(s: string): string[] { + let array: string[] = []; + if (s.split(',').length > 0) { + array = s.split(','); + } else { + array = [s]; + } + return array; +} + +export function getTags(s: string): any[] { // tslint:disable-line:no-any + let array = []; + if (s.split(',').length > 0) { + array = s.split(','); + } else { + array = [s]; + } + return array; +} + +export function validateJSON(json: string | undefined): any { // tslint:disable-line:no-any + let result; + try { + result = JSON.parse(json!); + } catch (exception) { + result = []; + } + return result; +} diff --git a/packages/nodes-base/nodes/Todoist/Todoist.node.ts b/packages/nodes-base/nodes/Todoist/Todoist.node.ts new file mode 100644 index 0000000000..b2f6b7dd22 --- /dev/null +++ b/packages/nodes-base/nodes/Todoist/Todoist.node.ts @@ -0,0 +1,90 @@ +import { + IExecuteSingleFunctions, +} from 'n8n-core'; +import { + IDataObject, + INodeTypeDescription, + INodeExecutionData, + INodeType, + ILoadOptionsFunctions, + INodePropertyOptions, +} from 'n8n-workflow'; +import { + mandrillApiRequest, + getToEmailArray, + getGoogleAnalyticsDomainsArray, + getTags, + validateJSON +} from './GenericFunctions'; + +export class Todoist implements INodeType { + + //https://mandrillapp.com/api/docs/messages.JSON.html#method=send-template + + description: INodeTypeDescription = { + displayName: 'Todoist', + name: 'todoist', + icon: 'file:todoist.png', + group: ['output'], + version: 1, + subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}', + description: 'Consume Todoist API', + defaults: { + name: 'Todoist', + color: '#c02428', + }, + inputs: ['main'], + outputs: ['main'], + credentials: [ + { + name: 'todoistApi', + required: true, + } + ], + //multiOptions + properties: [ + { + displayName: 'Testing', + name: 'testing', + placeholder: 'blabla', + type: 'fixedCollection', + default: '', + typeOptions: { + multipleValues: true, + }, + options: [ + { + name: 'label', + displayName: 'label', + values: [ + { + displayName: 'Name', + name: 'name', + type: 'options', + default: '', + options: [ + { + name: 'Message', + value: 'message', + description: 'Send a message.', + }, + ], + }, + { + displayName: 'Content', + name: 'content', + type: 'string', + default: '', + }, + ], + }, + ], + }, + ], + }; + + async executeSingle(this: IExecuteSingleFunctions): Promise { + + + } +} diff --git a/packages/nodes-base/nodes/Todoist/todoist.png b/packages/nodes-base/nodes/Todoist/todoist.png new file mode 100644 index 0000000000000000000000000000000000000000..44691b2e49ded88dcdc5e60c893304c6d2643598 GIT binary patch literal 4475 zcmY*dXIK;3vJJf-dI>dv6s05(1c6Y6(0fOu2SabsAVsRw0E!q9q)JCAhmMV2rG^fn zg(9Me^v=a|@4N54{e83d%*8m%Lb8D2ffxd!^ueYR=tFJRcGRWKS z8hy2kV(P*?J8Y<}<@Bl0&FE0;gi2t8v{yphG+3Qi2sbS#% zKASSNe!GYb06_miM?=jVNrt~i<7YkrRNnafNNz?*H7J9f{-s*7#41r~y3`GAMBPIa zreW;$>}-u$-Fs>QP!}jM&v6sw@sPZPUXRbMc-C~w`bBm2EtVTZUS{55GQ`WQX@JMu z3q6}hczhD2LLwft-0JpgA!Jzo3Vqpga(T6_8(HiTBkUQ|LkP1d3iOAt$Gs?Ic>9t; z!MBZuZ}|KA044u@Ztj@E4>J6+t5b5`dE-QIAoq`|4A{`b+OGhKK#wuAg2la<6soPG2C3%itrqn05U2fDaQ*>mz0^soki;;lFAz4)r40${>uRJ9+dM z(?g>%7Ko1H_knth_JgsL%x-{Yt|k;ofqW3+r>k?)cgZB4rH1L$tdql!xR!(T zt;<;=L%1|}g*6k?6SjBZtEo8+Y4IpDU5wV#Vi-kU0`ZziNm8zeAyPkQ&3Q&*w=yZ0 z%}4WAFe6FP+3`BolBeaRkj~!cx|8EkOFi<9(l%%b2+aOI2i*a ztP3af)XoZ}V8{fAIrb%uZk3Z|p!*o^@-1uxLzFc0XAFDNwK>xzi@rnvW?dAwQ@zl= ziNAjbsTed0**hgC^)P=-jcy#uF3| zcSr@cEJVMI&Gs*%dn3qoRtgV9Io7kCo1^3_BNmk^P`>V?1B#2zB_y>fxk@c~{r+ya zL&f=z;BMG_qgNpUK9?rj^Q{NQ|20q{>Fcu5hras^j$;n?znq4{YWqJg-K>Wd_UY18 z`~|2Bq-eJe3Io}#gfeZ=ia%RdKeeBlqfOjj%4jKmbzbw?9NTqto}BzC^ugRc8%qfj z7a&j?90@0r&hWvw1XQd%#4sZtw?^pci_#nA@+zf=-!QS8`%1-cz4?A;^(^+=sV2mq z$jqpIP6L|e{y$~_6yHut?!TR?zz0 zUDmGA7~V{gq9)H6_f`KIUX8y2#Vf2$? z$T5Ejm{Rvch3@A9s%C~fU5;c1ii{f&g&u~&8xgaBQ|9@-j`NmoJa-(8Fb`PqR~L`> zIi{JHk5PJ?{GxCY%30r6H=kczdC-x1s&s@f>ScBLo^{!s05myyVy{s8`wmjXVNS7P zU%F}8lr+!t?;45@Bd0zlH67p%E}mo`UwHOh=d800PKhc9yv(SUpW#bE zUgPB<)25MMT$Zbza;T^_$V?cOfB-%NrSgIHGjb1Z8D!ogZY*Yqkaz5S^dYyb^|jpW+L?)~>761GcNdM_2Rd}O1w2tfQk7u^UNDv}r*Zos?v~E$A+uYr zs4ANa^YYyV6|3uq#83WC+g;8mbD*vzG?4MLo}247#jSbHm>J!P4MooDC7;bufaA~q+Yf1PP_GzTt8thBS*)ZImMrB#jyEa9jpES{utqYs>x1L-?`ts;MFPcp%jizu zR>`hSygmM#Y{ib8CPR}N?uh*OHEd@0W&vT`GsiAtab&tPsY#e?p#S_$18lItwxZuR z8myAx^6lhPnU(@KW#eDm#{KQ<%=EoOeVv#6Y4Vlnp3n0fzP=}2D)S$q$%pni0%P0a z#+iALRJ`w67hgH?Nc28uW0RGc3=k)N|Gsjvd~UW-U+WZaQ3Qod+8&>#KWPFmodZN) z@xD4w2{qz56Olgaq2R769l7F64Y^$=V^Y^H#~6cEBatFDihj#760XZp>cB^gCB2IC z?SDz;^MjF?@G!;7gz?CgPRHz)2}9+Xw)NDyKwDn!X&-re6PvnQ7lp&Oo==(dzk_;Z zL3ye4Cn<4JeLu{~O>p7(TC4Cc!qtbBl5#sH zDP0|@tQD^D`;XsHPXal>vg-pdA3 z`*Uh+ppNPtQHTgyouAc9B*g6{o_NV>X$)Jie|Noc-HwBr4_HQ))bZp@Y@j4KvyoT^ zCEIW_z}ZbN{zTxbcN`|DHPc(_SsrnK{s&}}H-b7Q&dAmzZDa1MQ%u-6)n-qN_< zx>FlFmrjG=?O-eSif$R1&mGIpjXAsvB)Fepm`iRrEZ|uUNp0~~Hqw(X0{BBwyrF!q z9VJg$?$9(#^Uj`7shK7A6(yqW##5|Q*$PXzbFq=erx58HsvURoZj6tKt1U}8z1|&H zR4)s~3lL3?ZT5Jb2)NV}rpw=(sPN&mUR-J{!J4OqUD`tRxUaon`P)zH98Jg~<5K^R z0NUq0>aRtrQHHG)%ImtmM_$344hs>Mdb^u(=B_XQu8A zO29_-|?9Bl{ng8qq1$7|7QQr&+Z+XDMYuGUpS{$ki-I zZBiX(0j(5TO>@Kzc*HDaq!p{ok9qE|IfmcZU7RY{uxW0{x-`mMVLu|Z+quvs-p6!v zjWv9Oa-O9R){FOkx@qj^XHPcPpojT7AD-+Yk(v=?*1|V{OSvI$oDnh;!M)H}D^b^)* zO(=E;`(1sZRREA9X7YSG{C5#o|I*d4orZAbi>y^FM1dm2In!@xPjm|UiyYU&u6j%x ze}yIJuwpyCJ zT8MXm#0rR~zS;a8TS(kf;;JO_*R}|k2<${~5OX5{8zoc|@jz;zeN3&H_A?1rykYtl zAtkz}h?iu{nB?BGpWLmu$TRA#N9SqTRCb`M1BzRf7RHUfDQd6dHhy=muo-K?PN0cn zMwju}Fl8vN$c}H4k|X0BPN(R^GJ8Ur2X+6FI3BL%bRV}EopKux$$o##H*}Z6;R&r> zD7l_YF9J9U#0)9qxj#3-1@l#dg;b$JfogOT@Ci~T>NVSeXo)zUqoLQ9qA&U=)H5$7 zwuiM3dV6$sp}PC>R>gA^fLxh7NA@HWS{KG+%H(rTxaH5>ygFW~MIJ@H>GaE)b!%8s zp;auqvN`!JNQ4v4cRyzj%fr~X!o|Bx-_mN2C?Bmswq0H$M`TX9)|9$7N)@8o#AsB# zA(E5%v@my<1bB~FdrCBwc-KWQfJF6)ASmXZvM^#T^0q|UyEgLio+uS2@=O8tw%7C_ zDr!lW3U78!I($?-hZ)7b4Ea4faH}KC4cdtPE@A&F2zM5epYFQBo9w!5=k3EukW|OF zcJd@6SR2|rYHn_-98X;xiW|yzYQIx9P1kJvOKz}C`}E{t%(v#KjHQUDD!cKIrVkt1 zPkC^mMZ0Jvz}yf`Q{iTWI*!T%K_p3bNqS3&MlAtS+{fUo-zW)$W E0tIwB)&Kwi literal 0 HcmV?d00001 diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index 2b6ddeca77..6af0a99a5c 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -56,7 +56,8 @@ "dist/credentials/TrelloApi.credentials.js", "dist/credentials/TwilioApi.credentials.js", "dist/credentials/TypeformApi.credentials.js", - "dist/credentials/MandrillApi.credentials.js" + "dist/credentials/MandrillApi.credentials.js", + "dist/credentials/TodoistApi.credentials.js" ], "nodes": [ "dist/nodes/ActiveCampaign/ActiveCampaign.node.js", @@ -122,7 +123,8 @@ "dist/nodes/WriteBinaryFile.node.js", "dist/nodes/Webhook.node.js", "dist/nodes/Xml.node.js", - "dist/nodes/Mandrill/Mandrill.node.js" + "dist/nodes/Mandrill/Mandrill.node.js", + "dist/nodes/Todoist/Todoist.node.js" ] }, "devDependencies": {