Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/config/param-validation.js
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -46,5 +47,12 @@ export default {
params: {
flightname: flightName
}
},

userForFlight: {
params: {
flightname: flightName,
userid: userId
}
}
};
68 changes: 64 additions & 4 deletions src/server/controllers/flight.js
Original file line number Diff line number Diff line change
@@ -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) => {
Expand All @@ -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);
}
});
}
Expand Down Expand Up @@ -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
};
3 changes: 2 additions & 1 deletion src/server/models/flight.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
});
Expand Down
10 changes: 9 additions & 1 deletion src/server/routes/flight.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;