From 815b455dbb80477a85db7cfd40ca2fddbd7c93d2 Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Mon, 13 Jan 2020 08:09:37 +0000 Subject: [PATCH] fix(core): update --- package-lock.json | 64 +++++++++++++++++------------------ package.json | 5 +-- test/test.ts | 7 ++++ ts/interfaces/index.ts | 1 + ts/interfaces/message.ts | 30 ++++++++++++++++ ts/mailgun.classes.account.ts | 41 ++++++++++++++++++---- ts/mailgun.plugins.ts | 3 +- 7 files changed, 109 insertions(+), 42 deletions(-) create mode 100644 ts/interfaces/index.ts create mode 100644 ts/interfaces/message.ts diff --git a/package-lock.json b/package-lock.json index f6e374a..fb89752 100644 --- a/package-lock.json +++ b/package-lock.json @@ -199,23 +199,23 @@ } }, "@pushrocks/smarthash": { - "version": "2.0.6", - "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmarthash/-/smarthash-2.0.6.tgz", - "integrity": "sha512-jHk9srgRLkszk/oPCUOkxTX2Fqu7qKwx13aEeSIBx8UCtFbXPLecJAqEaGEVk1mw9e4Oq0iC6O0jEnxKo5NQwA==", + "version": "2.1.6", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmarthash/-/smarthash-2.1.6.tgz", + "integrity": "sha512-TYa3wECYkeDoE8SomxcCJFg5Kt4+G4MtNMu3yATJCCoPLJIbyV1CwUvYuFYkkce2W4ZvH9h/N6dsHc69oI5Jcw==", "requires": { - "@pushrocks/smartjson": "^3.0.5", - "@pushrocks/smartpromise": "^3.0.2", + "@pushrocks/smartjson": "^3.0.10", + "@pushrocks/smartpromise": "^3.0.6", "@types/through2": "^2.0.34", "through2": "^3.0.1" } }, "@pushrocks/smartjson": { - "version": "3.0.8", - "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartjson/-/smartjson-3.0.8.tgz", - "integrity": "sha512-EjC3611RSZaZmK+nXxXrYDBxdxYWtrxjOrZtQzbYn0yM33KSCH0sLIAG8B2wYZVAOj4A2pC8mVxFSJ1w3iRFHg==", + "version": "3.0.10", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartjson/-/smartjson-3.0.10.tgz", + "integrity": "sha512-0tBkET2yjmSSIf4DlgeyU8U/J2EshTmQGuMY28EjPq9VvuCFXLh72WmETpA4QqKRMqhWp1+P+RZgnQupW3GQxQ==", "requires": { "@types/fast-json-stable-stringify": "^2.0.0", - "fast-json-stable-stringify": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", "lodash.clonedeep": "^4.5.0" } }, @@ -248,20 +248,20 @@ } }, "@pushrocks/smartmail": { - "version": "1.0.6", - "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartmail/-/smartmail-1.0.6.tgz", - "integrity": "sha512-dQZi8FOLVfX6qo7b73HQ5SgdMHpS1mHNJTbwpgVT/XlhVCdreXfrAbFLVXECH4EZ8WYt9KoSUo4zHSw31g97sw==", + "version": "1.0.8", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartmail/-/smartmail-1.0.8.tgz", + "integrity": "sha512-ILUmtrJ0TlBe183/LXmJYAq268NueB6A0vA75qqR9+DeZjBAuYOcIAJxLOXyxtMcG/pSnr+AKTDBzsRn/RMz1g==", "requires": { "@pushrocks/smartfile": "^7.0.6", - "@pushrocks/smartmustache": "^2.0.8" + "@pushrocks/smartmustache": "^2.0.9" } }, "@pushrocks/smartmustache": { - "version": "2.0.8", - "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartmustache/-/smartmustache-2.0.8.tgz", - "integrity": "sha512-bnOST5zKPKSpCUiYqSHRdJ4NpO3/xz3LLtNE+xfWLS9Eyor/dIapqOpqwmZXNYr8QZuZWC//dlTIiQcv02D8Rg==", + "version": "2.0.9", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartmustache/-/smartmustache-2.0.9.tgz", + "integrity": "sha512-Wumikw03se8/hpPDyBUt0o/JynkNLhuv667jUYyXmTbs4DLnlRAwTpLTYDUoaJpNWsCN3Jg9AgVSrteRozbFig==", "requires": { - "handlebars": "^4.4.5" + "handlebars": "^4.7.1" } }, "@pushrocks/smartparam": { @@ -294,9 +294,9 @@ "integrity": "sha512-vlQlBGNVIjfClgnsfgQBU6GIKcskYSFzEcKLt18ngPzPEcjKklXcxaqzLXpnoxR+KBh30QPE8255ncYHXuPPOg==" }, "@pushrocks/smartrequest": { - "version": "1.1.43", - "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartrequest/-/smartrequest-1.1.43.tgz", - "integrity": "sha512-bgzzKN9SxJaYhh+BN3tuLSgdphWsxAOHgNjWWay3o/ib8/c2RwRlmjoxzxXrIhKFEwJjGIo7w04045VgkoWkMQ==", + "version": "1.1.47", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartrequest/-/smartrequest-1.1.47.tgz", + "integrity": "sha512-0AuqtAI14VeWeXl2WpJbgCybVlG03rOjdGchAqy5k5lg9ACLhN3Z4kmoLgpBysWO/L2SjlAKB489SRyV3acykg==", "requires": { "@pushrocks/smartpromise": "^3.0.5", "@types/form-data": "^2.5.0", @@ -793,9 +793,9 @@ } }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://verdaccio.lossless.one/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "version": "2.1.0", + "resolved": "https://verdaccio.lossless.one/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "figures": { "version": "3.1.0", @@ -875,14 +875,14 @@ } }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://verdaccio.lossless.one/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + "version": "4.2.3", + "resolved": "https://verdaccio.lossless.one/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "handlebars": { - "version": "4.4.5", - "resolved": "https://verdaccio.lossless.one/handlebars/-/handlebars-4.4.5.tgz", - "integrity": "sha512-0Ce31oWVB7YidkaTq33ZxEbN+UDxMMgThvCe8ptgQViymL5DPis9uLdTA13MiRPhgvqyxIegugrP97iK3JeBHg==", + "version": "4.7.1", + "resolved": "https://verdaccio.lossless.one/handlebars/-/handlebars-4.7.1.tgz", + "integrity": "sha512-2dd6soo60cwKNJ90VewNLIzdZPR/E2YhszOTgHpN9V0YuwZk7x33/iZoIBnASwDFVHMY7iJ6NPL8d9f/DWYCTA==", "requires": { "neo-async": "^2.6.0", "optimist": "^0.6.1", @@ -1579,9 +1579,9 @@ "dev": true }, "uglify-js": { - "version": "3.6.4", - "resolved": "https://verdaccio.lossless.one/uglify-js/-/uglify-js-3.6.4.tgz", - "integrity": "sha512-9Yc2i881pF4BPGhjteCXQNaXx1DCwm3dtOyBaG2hitHjLWOczw/ki8vD1bqyT3u6K0Ms/FpCShkmfg+FtlOfYA==", + "version": "3.7.5", + "resolved": "https://verdaccio.lossless.one/uglify-js/-/uglify-js-3.7.5.tgz", + "integrity": "sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg==", "optional": true, "requires": { "commander": "~2.20.3", diff --git a/package.json b/package.json index d0d6528..e06b82d 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,9 @@ "tslint-config-prettier": "^1.15.0" }, "dependencies": { - "@pushrocks/smartmail": "^1.0.6", - "@pushrocks/smartrequest": "^1.1.43", + "@pushrocks/smartfile": "^7.0.6", + "@pushrocks/smartmail": "^1.0.8", + "@pushrocks/smartrequest": "^1.1.47", "@pushrocks/smartstring": "^3.0.17" }, "files": [ diff --git a/test/test.ts b/test/test.ts index d757a5b..6cc73f3 100644 --- a/test/test.ts +++ b/test/test.ts @@ -28,4 +28,11 @@ tap.test('should send a smartmail', async () => { testMailgunAccount.sendSmartMail(testSmartmail, 'sandbox@mail.git.zone'); }); +tap.test('should retrieve a mail using a retrieval url', async () => { + const result = await testMailgunAccount.retrieveSmartMailFromMessageUrl('https://sw.api.mailgun.net/v3/domains/mail.lossless.one/messages/AgMFnnnAKC8xp_dDa79LyoxhloxtaVmnRA=='); + result.options.subject = 'hi there. This is a testmail with attachment'; + result.options.from = 'noreply@mail.lossless.com'; + testMailgunAccount.sendSmartMail(result, 'sandbox@mail.git.zone'); +}); + tap.start(); diff --git a/ts/interfaces/index.ts b/ts/interfaces/index.ts new file mode 100644 index 0000000..f545587 --- /dev/null +++ b/ts/interfaces/index.ts @@ -0,0 +1 @@ +export * from './message'; diff --git a/ts/interfaces/message.ts b/ts/interfaces/message.ts new file mode 100644 index 0000000..1fb8e47 --- /dev/null +++ b/ts/interfaces/message.ts @@ -0,0 +1,30 @@ +export interface IMailgunMessage { + Received: string; + From: string; + 'X-Envelope-From': string; + recipients: string; + 'X-Google-Dkim-Signature': string; + To: string; + 'message-headers': [[string, string]]; + 'Dkim-Signature': string; + 'content-id-map': any; + subject: 'test2'; + 'stripped-html': string; + 'X-Mailgun-Incoming': 'Yes'; + 'X-Received': string; + 'X-Gm-Message-State': string; + 'body-plain': string; + attachments: Array<{ + url: string, + 'content-type': string, + name: string, + size: number + }>; + 'body-html': string; + 'Mime-Version': string; + Date: string, + 'Message-Id': string; + 'Content-Type': string; + 'X-Google-Smtp-Source': string; + Subject: string; +} diff --git a/ts/mailgun.classes.account.ts b/ts/mailgun.classes.account.ts index d0e776b..be2befc 100644 --- a/ts/mailgun.classes.account.ts +++ b/ts/mailgun.classes.account.ts @@ -1,19 +1,20 @@ import * as plugins from './mailgun.plugins'; +import * as interfaces from './interfaces'; export class MailgunAccount { public baseUrl = 'https://api.mailgun.net/v3'; - public baseUrlSe = 'https://se.api.mailgun.net/v3'; public apiToken: string; constructor(apiTokenArg: string) { this.apiToken = apiTokenArg; } - public getRequest(routeArg: string) { + public async getRequest(routeArg: string, binaryArg: boolean = false) { let requestUrl = routeArg; - const needsBaseUrlPrefix = (routeArg.startsWith(this.baseUrl)) || routeArg.startsWith(this.baseUrlSe); + const needsBaseUrlPrefix = !routeArg.startsWith('https://'); needsBaseUrlPrefix ? requestUrl = `${this.baseUrl}${routeArg}` : null; - const response = plugins.smartrequest.request(requestUrl, { + console.log(requestUrl); + const requestOptions: plugins.smartrequest.ISmartRequestOptions = { method: 'GET', headers: { Authorization: `Basic ${plugins.smartstring.base64.encode( @@ -21,7 +22,13 @@ export class MailgunAccount { )}`, 'Content-Type': 'application/json' } - }); + }; + let response: plugins.smartrequest.IExtendedIncomingMessage; + if (!binaryArg) { + response = await plugins.smartrequest.request(requestUrl, requestOptions); + } else { + response = await plugins.smartrequest.getBinary(requestUrl, requestOptions); + } return response; } @@ -69,6 +76,8 @@ export class MailgunAccount { } ]; + console.log(smartmailArg.attachments); + for (const attachment of smartmailArg.attachments) { formFields.push({ name: 'attachment', @@ -89,9 +98,27 @@ export class MailgunAccount { public async retrieveSmartMailFromMessageUrl(messageUrlArg: string) { const response = await this.getRequest(messageUrlArg); - return response.body; - } + const responseBody: interfaces.IMailgunMessage = response.body; + const smartmail = new plugins.smartmail.Smartmail({ + from: responseBody.From, + body: responseBody["body-html"], + subject: responseBody.Subject, + }); + // lets care about attachments + for (const attachmentInfo of responseBody.attachments) { + const attachmentName = attachmentInfo.name; + const attachmentContents = await this.getRequest(attachmentInfo.url, true); + smartmail.addAttachment(new plugins.smartfile.Smartfile({ + path: `./${attachmentName}`, + base: `./${attachmentName}`, + contentBuffer: attachmentContents.body + })); + } + + return smartmail; + } + public async retrieveSmartMailFromNotifyPayload(notifyPayloadArg: any) { return await this.retrieveSmartMailFromMessageUrl(notifyPayloadArg['message-url']); } diff --git a/ts/mailgun.plugins.ts b/ts/mailgun.plugins.ts index 8888001..bf2b6c2 100644 --- a/ts/mailgun.plugins.ts +++ b/ts/mailgun.plugins.ts @@ -1,6 +1,7 @@ // @pushrocks scope +import * as smartfile from '@pushrocks/smartfile'; import * as smartmail from '@pushrocks/smartmail'; import * as smartrequest from '@pushrocks/smartrequest'; import * as smartstring from '@pushrocks/smartstring'; -export { smartmail, smartrequest, smartstring }; +export { smartfile, smartmail, smartrequest, smartstring };