diff --git a/src/config/param-validation.js b/src/config/param-validation.js index 189283a..3a42607 100644 --- a/src/config/param-validation.js +++ b/src/config/param-validation.js @@ -1,6 +1,7 @@ import Joi from 'joi'; const flightName = Joi.string().regex(/^.*\-[1-9][0-9]{0,2}$/).required(); +const userId = Joi.string().regex(/^\d{21,}$/).required(); export default { // POST /api/users @@ -46,5 +47,12 @@ export default { params: { flightname: flightName } + }, + + userForFlight: { + params: { + flightname: flightName, + userid: userId + } } }; diff --git a/src/server/controllers/flight.js b/src/server/controllers/flight.js index efdb7cc..580d836 100644 --- a/src/server/controllers/flight.js +++ b/src/server/controllers/flight.js @@ -1,12 +1,15 @@ +'use strict'; + import Flight from '../models/flight'; import contentResponse from '../helpers/APIResponse'; const FLIGHT_ERROR = 400; const FLIGHT_SUCCESS = 200; +const DUPLICATE_USER_ERROR = 409; function getFlightInfo(req, res) { const flightName = req.params.flightname.toUpperCase(); - const getFlight = Flight.getFlightFromFlightName(flightName); + const getFlight = getFlightFromFlightName(flightName); getFlight.then((flight) => { res.json(contentResponse(flight)); }, (error) => { @@ -20,9 +23,9 @@ function postFlightInfo(req, res) { const newFlight = new Flight(flightInfo); newFlight.save((err) => { if (err) { - res.sendStatus(FLIGHT_ERROR); + sendFailureStatus(res, err); } else { - res.sendStatus(FLIGHT_SUCCESS); + sendSuccessStatus(res); } }); } @@ -63,7 +66,64 @@ function isValidGeoJson(location) { return !!location.coordinates; } +function putUserInFlight(req, res) { + const flightName = req.params.flightname.toUpperCase(); + const userId = req.params.userid; + const getFlight = getFlightFromFlightName(flightName); + getFlight.then((foundFlight) => { + if (!foundFlight) { + return sendFailureStatus(res); + } + foundFlight = addMissingUserIdsProperty(foundFlight); + if (hasDuplicateUserId(foundFlight, userId)) { + return sendDuplicateFoundStatus(res, userId); + } + foundFlight = addUserIdToFlightInfo(foundFlight, userId); + foundFlight.save(); + return sendSuccessStatus(res); + }, (err) => sendFailureStatus(res, err)); +} + +function getFlightFromFlightName(flightName) { + return Flight.getFlightFromFlightName(flightName); +} + +function addUserIdToFlightInfo(flight, userId) { + flight.userIds.push(userId); + return flight; +} + +function addMissingUserIdsProperty(flight) { + if (!flight) { + return flight; + } + const isFlightMissingUserIds = !flight.userIds; + if (isFlightMissingUserIds) { + flight.userIds = []; + } + return flight; +} + +function hasDuplicateUserId(flight, userId) { + return flight.userIds.indexOf(userId) > -1; +} + +function sendSuccessStatus(res) { + res.sendStatus(FLIGHT_SUCCESS); +} + +function sendFailureStatus(res, err) { + console.log(err); + res.sendStatus(FLIGHT_ERROR); +} + +function sendDuplicateFoundStatus(res, userId) { + res.send(DUPLICATE_USER_ERROR, + contentResponse({ duplicateUserId: userId })); +} + export default { getFlightInfo, - postFlightInfo + postFlightInfo, + putUserInFlight }; 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/flight.js b/src/server/routes/flight.js index 486ac96..996d2c5 100644 --- a/src/server/routes/flight.js +++ b/src/server/routes/flight.js @@ -25,8 +25,16 @@ router.route('/:flightname/telemetry') router.route('/:flightname/telemetry') .post(validate(paramValidation.telemetry), telemetryCtrl.postTelemetry); -/** GET flight telemetry */ +/** GET flight telemetry historical data */ router.route('/:flightname/history') .get(validate(paramValidation.history), historyCtrl.getFlightHistory); +// /** GET flight telemetry historical data */ +// router.route('/:flightname/users') +// .get(validate(paramValidation.usersForFlight), userCtrl.getFlightHistory); + +/** PUT userId in existing flight */ +router.route('/:flightname/user/:userid') + .put(validate(paramValidation.userForFlight), flightInfoCtrl.putUserInFlight); + export default router;