From db8e35c02500cee17677a17391b99f042efd106e Mon Sep 17 00:00:00 2001 From: Jonathan Barton Date: Thu, 9 Feb 2017 19:03:09 -0500 Subject: [PATCH 1/2] add group channel for flight --- package.json | 1 + src/config/param-validation.js | 6 ++++ src/index.js | 3 +- src/server/controllers/chat.js | 53 ++++++++++++++++++++++++++++++++++ src/server/models/flight.js | 3 +- src/server/routes/chat.js | 29 +++++++++++++++++++ src/server/routes/flight.js | 6 ++++ src/server/routes/history.js | 0 8 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/server/controllers/chat.js create mode 100644 src/server/routes/chat.js create mode 100644 src/server/routes/history.js diff --git a/package.json b/package.json index ed2a5dc..e6486e4 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "passport": "^0.3.2", "passport-auth0": "^0.6.0", "path": "^0.12.7", + "sendbird-nodejs": "^1.0.0", "serve-static": "^1.11.1", "winston": "^2.1.1" }, diff --git a/src/config/param-validation.js b/src/config/param-validation.js index 189283a..b7105d9 100644 --- a/src/config/param-validation.js +++ b/src/config/param-validation.js @@ -46,5 +46,11 @@ export default { params: { flightname: flightName } + }, + + chat: { + params: { + flightname: flightName + } } }; diff --git a/src/index.js b/src/index.js index bbf5e88..a7f90d5 100644 --- a/src/index.js +++ b/src/index.js @@ -9,7 +9,8 @@ const path = require('path'); Promise.promisifyAll(mongoose); // connect to mongo db -winston.log('info', 'starting api service.'); +winston.log('info', 'gomake-api service started'); + mongoose.connect(config.db, { server: { socketOptions: { keepAlive: 1 } } }); mongoose.connection.on('error', () => { winston.log('error', `Timestamp: ${new Date()} | ` + diff --git a/src/server/controllers/chat.js b/src/server/controllers/chat.js new file mode 100644 index 0000000..7c35646 --- /dev/null +++ b/src/server/controllers/chat.js @@ -0,0 +1,53 @@ +'use strict'; + +import Flight from '../models/flight'; +import contentResponse from '../helpers/APIResponse'; +import SendBird from 'sendbird-nodejs'; + +const API_TOKEN = process.env.GM_SENDBIRD_API_TOKEN; +const CREATE_ERROR = 405; +const CREATE_SUCCESS = 200; + +function createFlightChannel(req, res) { + const flightName = req.params.flightname.toUpperCase(); + const getFlight = Flight.getFlightFromFlightName(flightName); + const sb = getSendBirdInstance(); + + getFlight + .then(getUsersForFlight) + .then((userIds) => { + const options = { + name: flightName, + user_ids: userIds, + is_distinct: true + }; + return sb.groupChannels.create(options); + }) + .then((response) => { + if (response) { + const channelUrl = response.channel_url; + res.send(CREATE_SUCCESS, contentResponse({ channel_url: channelUrl })); + } else { + res.sendStatus(CREATE_ERROR); + } + }, (err) => { + console.log(err); + res.sendStatus(CREATE_ERROR); + }); +} + +function getSendBirdInstance() { + return new SendBird(API_TOKEN); +} + +function getUsersForFlight(foundFlight) { + if (foundFlight) { + const userIds = foundFlight.userIds || []; + return Promise.resolve(userIds); + } + return Promise.reject(); +} + +export default { + createFlightChannel +}; diff --git a/src/server/models/flight.js b/src/server/models/flight.js index d57e270..55ba58a 100644 --- a/src/server/models/flight.js +++ b/src/server/models/flight.js @@ -9,7 +9,8 @@ const FlightSchema = new mongoose.Schema({ launchLocation: mongoose.Schema.Types.GeoJSON, launchAltitude: Number, registeredTrackers: Array, - deviceIds: Array + deviceIds: Array, + userIds: Array }, { timestamps: true }); diff --git a/src/server/routes/chat.js b/src/server/routes/chat.js new file mode 100644 index 0000000..b5b7135 --- /dev/null +++ b/src/server/routes/chat.js @@ -0,0 +1,29 @@ +import express from 'express'; +import validate from 'express-validation'; +import chat from '../controllers/chat'; +import paramValidation from '../../config/param-validation'; +// import authentication from '../middleware/authentication'; + +const router = express.Router(); // eslint-disable-line new-cap + +/** POST flight chat: create group_channel for flight if does not exist */ +router.route('/:flightname/chat') + .post(validate(paramValidation.chat), chat.createFlightChannel); + +// /** DELETE flight chat: remove group_channel for flight if does not exist */ +// router.route('/:flightname/chat') +// .delete(validate(paramValidation.history), historyCtrl.getFlightHistory); +// +// /** GET users for chat for flight */ +// router.route('/:flightname/chat/users') +// .get(validate(paramValidation.history), historyCtrl.getFlightHistory); +// +// /** GET user for user_id in chat for flight */ +// router.route('/:flightname/chat/users/:userId') +// .get(validate(paramValidation.history), historyCtrl.getFlightHistory); +// +// /** GET users for chat for flight */ +// router.route('/:flightname/chat/users') +// .get(validate(paramValidation.history), historyCtrl.getFlightHistory); + +export default router; diff --git a/src/server/routes/flight.js b/src/server/routes/flight.js index 486ac96..3360469 100644 --- a/src/server/routes/flight.js +++ b/src/server/routes/flight.js @@ -3,6 +3,7 @@ import validate from 'express-validation'; import telemetryCtrl from '../controllers/telemetry'; import flightInfoCtrl from '../controllers/flight'; import historyCtrl from '../controllers/history'; +import chat from '../controllers/chat'; import paramValidation from '../../config/param-validation'; import authentication from '../middleware/authentication'; @@ -29,4 +30,9 @@ router.route('/:flightname/telemetry') router.route('/:flightname/history') .get(validate(paramValidation.history), historyCtrl.getFlightHistory); +/** POST flight chat: create group_channel for flight if does not exist */ +router.route('/:flightname/chat') + .post(validate(paramValidation.chat), chat.createFlightChannel); + + export default router; diff --git a/src/server/routes/history.js b/src/server/routes/history.js new file mode 100644 index 0000000..e69de29 From 16ede390ad70e61b0a851f0b0150d1e964f9acb0 Mon Sep 17 00:00:00 2001 From: Jonathan Barton Date: Thu, 9 Feb 2017 21:27:54 -0500 Subject: [PATCH 2/2] add user endpoints and channel get --- src/server/controllers/chat.js | 35 ++++++++++++++++++++++++++++++---- src/server/routes/chat.js | 29 ---------------------------- src/server/routes/flight.js | 12 +++++++++++- 3 files changed, 42 insertions(+), 34 deletions(-) delete mode 100644 src/server/routes/chat.js diff --git a/src/server/controllers/chat.js b/src/server/controllers/chat.js index 7c35646..00eaaba 100644 --- a/src/server/controllers/chat.js +++ b/src/server/controllers/chat.js @@ -6,11 +6,12 @@ import SendBird from 'sendbird-nodejs'; const API_TOKEN = process.env.GM_SENDBIRD_API_TOKEN; const CREATE_ERROR = 405; +const CREATE_USERS_NOT_FOUND = 404; const CREATE_SUCCESS = 200; function createFlightChannel(req, res) { const flightName = req.params.flightname.toUpperCase(); - const getFlight = Flight.getFlightFromFlightName(flightName); + const getFlight = getFlightFromFlightName(flightName); const sb = getSendBirdInstance(); getFlight @@ -18,6 +19,7 @@ function createFlightChannel(req, res) { .then((userIds) => { const options = { name: flightName, + custom_type: flightName, user_ids: userIds, is_distinct: true }; @@ -32,10 +34,14 @@ function createFlightChannel(req, res) { } }, (err) => { console.log(err); - res.sendStatus(CREATE_ERROR); + res.sendStatus(err); }); } +function getFlightFromFlightName(flightName) { + return Flight.getFlightFromFlightName(flightName); +} + function getSendBirdInstance() { return new SendBird(API_TOKEN); } @@ -43,11 +49,32 @@ function getSendBirdInstance() { function getUsersForFlight(foundFlight) { if (foundFlight) { const userIds = foundFlight.userIds || []; + if (!!!userIds.length) { + return Promise.reject(CREATE_USERS_NOT_FOUND); + } return Promise.resolve(userIds); } - return Promise.reject(); + return Promise.reject(CREATE_ERROR); +} + +function getFlightChannel(req, res) { + const flightName = req.params.flightname.toUpperCase(); + getChannelForFlight(flightName) + .then((response) => { + const channels = response.channels; + res.json(contentResponse(channels)); + }); +} + +function getChannelForFlight(flightName) { + const sb = getSendBirdInstance(); + const options = { + custom_type: flightName + }; + return sb.groupChannels.list(options); } export default { - createFlightChannel + createFlightChannel, + getFlightChannel }; diff --git a/src/server/routes/chat.js b/src/server/routes/chat.js deleted file mode 100644 index b5b7135..0000000 --- a/src/server/routes/chat.js +++ /dev/null @@ -1,29 +0,0 @@ -import express from 'express'; -import validate from 'express-validation'; -import chat from '../controllers/chat'; -import paramValidation from '../../config/param-validation'; -// import authentication from '../middleware/authentication'; - -const router = express.Router(); // eslint-disable-line new-cap - -/** POST flight chat: create group_channel for flight if does not exist */ -router.route('/:flightname/chat') - .post(validate(paramValidation.chat), chat.createFlightChannel); - -// /** DELETE flight chat: remove group_channel for flight if does not exist */ -// router.route('/:flightname/chat') -// .delete(validate(paramValidation.history), historyCtrl.getFlightHistory); -// -// /** GET users for chat for flight */ -// router.route('/:flightname/chat/users') -// .get(validate(paramValidation.history), historyCtrl.getFlightHistory); -// -// /** GET user for user_id in chat for flight */ -// router.route('/:flightname/chat/users/:userId') -// .get(validate(paramValidation.history), historyCtrl.getFlightHistory); -// -// /** GET users for chat for flight */ -// router.route('/:flightname/chat/users') -// .get(validate(paramValidation.history), historyCtrl.getFlightHistory); - -export default router; diff --git a/src/server/routes/flight.js b/src/server/routes/flight.js index 3360469..14fc9bd 100644 --- a/src/server/routes/flight.js +++ b/src/server/routes/flight.js @@ -17,7 +17,6 @@ router.route('/:flightname') router.route('/:flightname') .post(validate(paramValidation.flightInfo), flightInfoCtrl.postFlightInfo); - /** GET flight telemetry */ router.route('/:flightname/telemetry') .get(validate(paramValidation.telemetry), telemetryCtrl.getTelemetry); @@ -34,5 +33,16 @@ router.route('/:flightname/history') router.route('/:flightname/chat') .post(validate(paramValidation.chat), chat.createFlightChannel); +/** GET flight chat: get group_channel for flight */ +router.route('/:flightname/chat') + .get(validate(paramValidation.chat), chat.getFlightChannel); + +/** POST flight user ids: create group_channel for flight if does not exist */ +router.route('/:flightname/users/:userId') + .post(validate(paramValidation.chat), chat.createFlightChannel); + +/** GET flight user ids: get group_channel for flight */ +router.route('/:flightname/users/:userId') + .get(validate(paramValidation.chat), chat.getFlightChannel); export default router;