Skip to content

Commit

Permalink
Changes for supporting websocket and webhook
Browse files Browse the repository at this point in the history
  • Loading branch information
Ike The Coder committed Nov 6, 2019
1 parent 1035d4e commit bddb9b6
Show file tree
Hide file tree
Showing 12 changed files with 260 additions and 30 deletions.
3 changes: 3 additions & 0 deletions microservices/requestApi/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ app.get("/version", function(req, res){
})
});

var websockets = require('./websocket');
var wss = websockets.init();

log.level = config.get('logLevel');
log.addLevel('debug', 2900, { fg: 'green' });

Expand Down
22 changes: 22 additions & 0 deletions microservices/requestApi/auth/webhook_auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const passport = require('passport');
const passJwt = require('passport-jwt');
const passApiKey = require('passport-headerapikey');
const HeaderAPIKeyStrategy = passApiKey.HeaderAPIKeyStrategy;
const config = require('config');
const logger = require('npmlog');

passport.use(new HeaderAPIKeyStrategy(
{ header: 'Authorization', prefix: 'Api-Key ' },
false,
function(apiKey, cb) {
if (config.get("webhookSecret") == apiKey) {
const user = {
}
return cb(null, user);
} else {
return cb(null, false);
}
}
));

module.exports = passport;
3 changes: 3 additions & 0 deletions microservices/requestApi/config/default.json.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"apiPort": 3002,
"wsPort": 2998,
"logLevel": "info",
"morganLogType": "dev",

Expand All @@ -14,6 +15,8 @@
"validationApi": "http://localhost:3003",
"validationApiSecret": "MySecret",

"webhookSecret": "s3cr3t",

"storageApi": {
"uri": "localhost",
"port": 9000,
Expand Down
1 change: 1 addition & 0 deletions microservices/requestApi/config/test.json.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"testJWT": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE1NDA5MTUzMzAsImV4cCI6MTU3MjQ1MTMzMCwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5hbWUiOiJSb2NrZXQiLCJFbWFpbCI6ImphbmVEb2VAZXhhbXBsZS5jb20iLCJHcm91cHMiOlsiZXhwb3J0ZXIiLCJwcm9qZWN0X2EiLCJvYyIsInJlcG9ydHMiXSwiem9uZSI6ImludGVybmFsIn0.TB80qVLtfhlOLm8RmavHUomjBUED8s7A_kPdPxJFx8A",
"testSupervisorExternalJWT": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE1NDA5MTUzMzAsImV4cCI6MTU3MjQ1MTMzMCwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5hbWUiOiJSb2NrZXQiLCJFbWFpbCI6ImphbmVEb2VAZXhhbXBsZS5jb20iLCJHcm91cHMiOlsicmVwb3J0cyJdLCJ6b25lIjoiZXh0ZXJuYWwifQ.swxroVSE_k7tvs9LPtCSov_PPiPJOI6K9bco9B7TKbg",
"testSupervisorInternalJWT": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE1NDA5MTUzMzAsImV4cCI6MTU3MjQ1MTMzMCwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsIkdpdmVuTmFtZSI6IkpvaG5ueSIsIlN1cm5hbWUiOiJSb2NrZXQiLCJFbWFpbCI6ImphbmVEb2VAZXhhbXBsZS5jb20iLCJHcm91cHMiOlsicmVwb3J0cyJdLCJ6b25lIjoiaW50ZXJuYWwifQ.SVSwyj6N32zixRmCYekm0P6moYXcLi0ksc9Ih5mqx8U",
"testWebsocketJWT": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE1NDA5MTUzMzAsImV4cCI6MTY3NDQ2MTMzMCwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoianJvY2tldEBleGFtcGxlLmNvbSIsInByZWZlcnJlZF91c2VybmFtZSI6Impyb2NrZXQiLCJnaXZlbl9uYW1lIjoiSm9obm55IiwiZmFtaWx5X25hbWUiOiJSb2NrZXQiLCJlbWFpbCI6ImphbmVEb2VAZXhhbXBsZS5jb20iLCJncm91cHMiOlsiL2V4cG9ydGVyIiwiL3Byb2plY3RfMSIsIi9wcm9qZWN0X2EiLCIvb2MiXSwiem9uZSI6ImludGVybmFsIn0.HTEyzY9__W2yyJBgczhFItx6hZ8DTZeOSXcnqK_IlNU",
"database": {
"host": "localhost",
"username": "forumUser",
Expand Down
63 changes: 33 additions & 30 deletions microservices/requestApi/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions microservices/requestApi/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
"nodemailer": "^6.3.0",
"npmlog": "^4.1.2",
"passport": "^0.4.0",
"passport-headerapikey": "^1.1.0",
"passport-jwt": "^4.0.0",
"ws": "^7.1.1",
"request": "^2.88.0"
},
"devDependencies": {
Expand Down
1 change: 1 addition & 0 deletions microservices/requestApi/routes/v1/auth/webhook_auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = require('../../../auth/webhook_auth');
48 changes: 48 additions & 0 deletions microservices/requestApi/routes/v1/messages/messages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
var messages = {};
var logger = require('npmlog');

function checkRequestPermissions(user, requestId, fileId, sock, cb){

var db = require('../db/db');

logger.debug('Checking request permission', requestId, fileId);

db.Request.getAll({_id: requestId}, 1, 1, user, function(findErr, findRes){
if (findErr || !findRes || findRes.length === 0){
logger.debug('Request not found.', requestId, findErr);
cb(false, sock);
return;
}
// Verify that the fileId is in the request files list
if (!(fileId in findRes.files)) {
logger.debug('File not found in request.', requestId);
cb(false, sock);
return;
}
cb(true, sock);
});
}

function sendFileStatusMessage(fileStatus){
var websockets = require('../../../websocket');
var conns = websockets.getConnections();
var keys = Object.keys(conns);
for (var i=0; i<keys.length; i++){
// make sure the user has access to the request
var conn = conns[keys[i]];
checkRequestPermissions(conn.user, conn.requestId, fileStatus.fileId, conn, function(send, sock) {
if (send) {
if (websockets.isOpen(sock)) {
sock.send(JSON.stringify({fileStatus: fileStatus}));
}
}
});
}
}

//wrapper to make async
messages.sendFileStatusMessage = function(fileStatus){
setTimeout(sendFileStatusMessage, 0, fileStatus);
};

module.exports = messages;
26 changes: 26 additions & 0 deletions microservices/requestApi/routes/v1/routes/webhook.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
var express = require('express');
var router = express.Router();

var messages = require('../messages/messages')

router.get('/', function(req, res, next) {
res.json({status:'ok'});
});

router.post('/fileStatus', function(req, res, next) {

var json = res.body
var status = {
fileId: json.file_id,
pass: (json.state === 0),
state: json.state,
message: json.message,
name: json.rule_id,
mandatory: json.mandatory
}

messages.sendFileStatusMessage (status);
res.json({status:'ok'});
});

module.exports = router;
3 changes: 3 additions & 0 deletions microservices/requestApi/routes/v1/v1.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ router.use('/api-docs', function(req, res){
res.send(docs.getDocHTML("v1"));
});

// webhook to receive file status updates from validate API
router.use('/webhook', require('./auth/webhook_auth').authenticate('headerapikey', {session: false}), require('./routes/webhook'));

//requests
router.use('/', auth.authenticate('jwt', {session: false}), requestRouter);

Expand Down
24 changes: 24 additions & 0 deletions microservices/requestApi/test/v1/webhook.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@

const WebSocket = require('ws');

var config = require('config');

let token = config.get('testWebsocketJWT')
let wsPort = config.get('wsPort')
let requestId = "5dc30362c8a0710019533ab8"
const ws = new WebSocket('ws://localhost:' + wsPort + '/' + requestId, null, { headers: { "sec-websocket-token": token }});

ws.on('open', function open() {
console.log("Opened");
});

ws.on('close', function open() {
console.log("Closed");
});

ws.on('message', function incoming(data) {
console.log("Received Message");
console.log(data);
});

setTimeout(() => ws.terminate(), 20000);
Loading

0 comments on commit bddb9b6

Please sign in to comment.