diff --git a/api-server/development-start.js b/api-server/development-start.js index abc45406a8..e2fc41f0d8 100644 --- a/api-server/development-start.js +++ b/api-server/development-start.js @@ -1,5 +1,31 @@ const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); + const nodemon = require('nodemon'); +const SmeeClient = require('smee-client'); +const createDebugger = require('debug'); + +const log = createDebugger('fcc:start:development'); + +if (process.env.WEBHOOK_PROXY_URL) { + const paypalPayloadHandler = new SmeeClient({ + source: process.env.WEBHOOK_PROXY_URL, + target: process.env.API_LOCATION + '/hooks/update-paypal', + logger: { info: log, error: log } + }); + + const paypalevents = paypalPayloadHandler.start(); + + process.on('exit', () => { + log('Stopping webhook proxy client.'); + paypalevents.close(() => { + log('Webhook proxy client is stopped.'); + }); + }); +} else { + log('Webhook client is not configured.'); + log('This can be ignored when not working with webhooks locally.'); +} nodemon({ ext: 'js json', @@ -13,5 +39,5 @@ nodemon({ }); nodemon.on('restart', function nodemonRestart(files) { - console.log('App restarted due to: ', files); + log('App restarted due to: ', files); }); diff --git a/api-server/package-lock.json b/api-server/package-lock.json index 8d28dd7a57..f2bdb10632 100644 --- a/api-server/package-lock.json +++ b/api-server/package-lock.json @@ -4023,6 +4023,15 @@ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, "exec-sh": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", @@ -4686,7 +4695,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -4707,12 +4717,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4727,17 +4739,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4854,7 +4869,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4866,6 +4882,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4880,6 +4897,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4887,12 +4905,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4911,6 +4931,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4991,7 +5012,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5003,6 +5025,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5088,7 +5111,8 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5124,6 +5148,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5143,6 +5168,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5186,12 +5212,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -9330,6 +9358,15 @@ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -10123,6 +10160,12 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -10600,6 +10643,12 @@ } } }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, "reselect": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz", @@ -10986,6 +11035,27 @@ "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", "dev": true }, + "smee-client": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/smee-client/-/smee-client-1.1.0.tgz", + "integrity": "sha512-5NM7K2qQnglGSIN7A6ndk/ku1Vocnz1k2EzD7IPeE2UTWBufl7vWk/AMP4oKMya5W2c6M8NC3DNHs1Wce9fWUg==", + "dev": true, + "requires": { + "commander": "^2.12.2", + "eventsource": "^1.0.5", + "morgan": "^1.9.0", + "superagent": "^3.8.3", + "validator": "^10.4.0" + }, + "dependencies": { + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", + "dev": true + } + } + }, "smtp-connection": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", @@ -12579,6 +12649,16 @@ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", diff --git a/api-server/package.json b/api-server/package.json index 3a3829e217..5b39dc7f43 100644 --- a/api-server/package.json +++ b/api-server/package.json @@ -88,6 +88,7 @@ "nodemon": "^1.19.4", "passport-mock-strategy": "^2.0.0", "pm2": "^4.1.2", + "smee-client": "^1.1.0", "tap-difflet": "^0.7.2", "tap-spec": "^5.0.0" }, diff --git a/api-server/server/index.js b/api-server/server/index.js index caaa04c057..c53e57a213 100755 --- a/api-server/server/index.js +++ b/api-server/server/index.js @@ -80,10 +80,6 @@ app.start = _.once(function() { module.exports = app; -// start the server if `$ node server.js` -// in production use `$npm start-production` -// or `$node server/production` to start the server -// and wait for DB handshake if (require.main === module) { app.start(); } diff --git a/sample.env b/sample.env index 0f7fd41739..b25f854adc 100644 --- a/sample.env +++ b/sample.env @@ -44,6 +44,9 @@ NEWS_LOCATION='https://localhost/news' FORUM_PROXY='https://forum.localhost' NEWS_PROXY='https://news.localhost' +# You can get a webhook proxy url from smee.io +WEBHOOK_PROXY_URL='' + LOCALE=english TEST_CHALLENGES_FOR_LANGS=english