copy-cat
Version:
A standalone server to mock various communications services for push messaging, email, and sms.
158 lines (138 loc) • 4.41 kB
JavaScript
'use strict';
require('./validators');
var express = require('express'),
routeValidator = require('express-route-validator'),
validator = require('validator');
module.exports = function (config) {
var router = express.Router(),
router_v1_3 = express.Router();
function unNestBody (req, res, next) {
if (!req.body.request) {
return res.status(400).end();
}
// Move un-nest body.request object to simplify validation
// Use until express-route-validator supports nested validation
req.body = req.body.request;
return next();
}
router_v1_3.post('/createMessage', unNestBody, routeValidator.validate({
body: {
application: { isRequired: true },
auth: { isRequired: true },
notifications: { isRequired: true, arePushwooshNotifications: true, isLength: { min: 1 }}
}
}), function (req, res) {
var unknownDevices, data, i, j, length, count, notification;
if (config.application && !validator.isIn(req.body.application, config.application)) {
return res.status(200).json({
status_code: 210,
status_message: "Application not found",
response: null
});
}
if (config.auth && !validator.isIn(req.body.auth, config.auth)) {
return res.status(200).json({
status_code: 210,
status_message: "Account not found",
response: null
});
}
data = {
status_code: 200,
status_message: 'OK',
response: {
Messages: []
}
};
unknownDevices = [];
for (i = 0, length = req.body.notifications.length; i < length; i++) {
data.response.Messages.push(Math.random().toString());
if (config.devices && req.body.notifications[i].devices) {
notification = req.body.notifications[i];
for (j = 0, count = notification.devices.length; j < count; j++) {
if (config.devices.indexOf(notification.devices[j]) === -1) {
unknownDevices.push(notification.devices[j]);
}
}
}
}
if (unknownDevices.length) {
data.response.UnknownDevices = {
"": unknownDevices
};
}
return res.status(200).json(data);
});
router_v1_3.post('/deleteMessage', unNestBody, routeValidator.validate({
body: {
auth: { isRequired: true },
message: { isRequired: true }
}
}), function (req, res) {
if (config.messages && !validator.isIn(req.body.message, config.messages)) {
return res.status(200).json({
status_code: 210,
status_message: 'Message not found',
response: null
});
}
if (config.auth && !validator.isIn(req.body.auth, config.auth)) {
return res.status(200).json({
status_code: 210,
status_message: "Account not found",
response: null
});
}
return res.status(200).json({
status_code: 200,
status_message: 'OK'
});
});
router_v1_3.post('/registerDevice', unNestBody, routeValidator.validate({
body: {
application: { isRequired: true },
push_token: { isRequired: true },
language: { isRequired: false },
hwid: { isRequired: true },
timezone: { isRequired: false },
device_type: { isRequired: true, isInt: { min: 1, max: 11 }}
}
}), function (req, res) {
if (config.application && !validator.isIn(req.body.application, config.application)) {
return res.status(200).json({
status_code: 210,
status_message: "Application not found",
response: null
});
}
// TODO Validate push_token by device_type?
// Accept config.push_tokens?
// Accept config.hwids?
return res.status(200).json({
status_code: 200,
status_message: 'OK',
response: null
});
});
router_v1_3.post('/unregisterDevice', unNestBody, routeValidator.validate({
body: {
application: { isRequired: true },
hwid: { isRequired: true }
}
}), function (req, res) {
if (config.application && !validator.isIn(req.body.application, config.application)) {
return res.status(200).json({
status_code: 210,
status_message: "Application not found",
response: null
});
}
return res.status(200).json({
status_code: 200,
status_message: 'OK',
response: null
});
});
router.use('/json/1.3', router_v1_3);
return router;
};