Move all api to project

Transactions
= 2017-09-12 21:02:28 -06:00
parent d6ada934ad
commit 9c014d43af
22 changed files with 1339 additions and 141 deletions

View File

@ -26,7 +26,8 @@ export class SharePopupComponent implements OnInit {
private mdDialogRef: MdDialogRef<SharePopupComponent>,
private snackbar: MdSnackBar) {
this.id = data.id;
this.shareUrl = this.document.location.protocol +'//'+ this.document.location.hostname + ":" + this.document.location.port + this.shareBaseUrl + data.prefix + this.id;
let port = this.document.location.port ? ":"+this.document.location.port : "";
this.shareUrl = this.document.location.protocol +'//'+ this.document.location.hostname + port + this.shareBaseUrl + data.prefix + this.id;
this.facebookIframeUrl = this.urlPartA + this.shareUrl + this.urlPartB;
this.twitterUrl = this.twitterPartA + data.title + " - " + data.description + "&url=" + this.shareUrl;
}

View File

@ -1,14 +1,14 @@
export const EVENTS_ADD_URL = "//ofbbutte.com/api/events/a/";
export const EVENTS_BY_PAGE_URL = "//ofbbutte.com/api/events/page/";
export const SERMONS_BY_ID = '//ofbbutte.com/api/sermons/';
export const SERMONS_BY_PAGE_URL = '//ofbbutte.com/api/sermons/page/';
export const SERMONS_BY_SEARCH_URL = '//ofbbutte.com/api/sermons/search';
export const EVENTS_ADD_URL = "/api2/events/a/";
export const EVENTS_BY_PAGE_URL = "/api2/events/page/";
export const SERMONS_BY_ID = '/api2/sermons/';
export const SERMONS_BY_PAGE_URL = '/api2/sermons/page/';
export const SERMONS_BY_SEARCH_URL = '/api2/sermons/search';
export const SERMON_MP3_BASE_URL = '//ofbbutte.com/static/media/';
export const SERMON_ADD_URL = "//ofbbutte.com/api/sermons/a/";
export const SERMON_DELETE_URL = "//ofbbutte.com/api/sermons/a/";
export const SERMON_UPDATE_URL = "//ofbbutte.com/api/sermons/a/";
export const SERMON_DOWNLOAD_URL = "//ofbbutte.com/api/sermons/download/";
export const LOGIN_URL = '//ofbbutte.com/api/login';
export const SERMON_ADD_URL = "/api2/sermons/a/";
export const SERMON_DELETE_URL = "/api2/sermons/a/";
export const SERMON_UPDATE_URL = "/api2/sermons/a/";
export const SERMON_DOWNLOAD_URL = "/api2/sermons/download/";
export const LOGIN_URL = '/api2/login';
export const LOGIN_VALIDATE_TOKEN = '';
export const EMAIL_URL = "//ofbbutte.com/api/email";
export const EMAIL_URL = "/api2/email";
export const RANDOM_VERSE_URL = "//www.kingjamesbibleonline.org/popular-bible-verses-widget.php";

View File

@ -1,3 +0,0 @@
{
"lockfileVersion": 1
}

View File

@ -4,31 +4,9 @@ const path = require('path');
const { execFile } = require('child_process');
const fs = require('fs');
app.use('/api2/share',require('./routes/share'));
app.use('/api2', require('./routes/api/api'));
app.get('/api2/cim/:month/:day',function(req,res){
console.log(__dirname);
var file = __dirname + '/calendar_image_maker/generated_images/' + req.params.month + '_' + req.params.day + '.png';
if (fs.existsSync(file)){
console.log("already exists");
res.sendFile(file);
return;
}
child = execFile(__dirname + '/calendar_image_maker/bin/phantomjs', [__dirname + '/calendar_image_maker/script.js', req.params.month, req.params.day], (error, stdout, stderr) => {
console.log("MAKE");
if (error) {
throw error;
}
if (fs.existsSync(file)){
res.sendFile(file);
return;
} else {
res.error("Error");
}
});
});
app.use(express.static('www'));
app.get('/*', function (req, res) {

View File

@ -0,0 +1,85 @@
var crypto = require('crypto');
// larger numbers mean better security, less
var config = {
// size of the generated hash
hashBytes: 32,
// larger salt means hashed passwords are more resistant to rainbow table, but
// you get diminishing returns pretty fast
saltBytes: 16,
// more iterations means an attacker has to take longer to brute force an
// individual password, so larger is better. however, larger also means longer
// to hash the password. tune so that hashing the password takes about a
// second
iterations: 872791
};
/**
* Hash a password using Node's asynchronous pbkdf2 (key derivation) function.
*
* Returns a self-contained buffer which can be arbitrarily encoded for storage
* that contains all the data needed to verify a password.
*
* @param {!String} password
* @param {!function(?Error, ?Buffer=)} callback
*/
function hashPassword(password, callback) {
// generate a salt for pbkdf2
crypto.randomBytes(config.saltBytes, function(err, salt) {
if (err) {
return callback(err);
}
crypto.pbkdf2(password, salt, config.iterations, config.hashBytes,
function(err, hash) {
if (err) {
return callback(err);
}
var combined = new Buffer(hash.length + salt.length + 8);
// include the size of the salt so that we can, during verification,
// figure out how much of the hash is salt
combined.writeUInt32BE(salt.length, 0, true);
// similarly, include the iteration count
combined.writeUInt32BE(config.iterations, 4, true);
salt.copy(combined, 8);
hash.copy(combined, salt.length + 8);
callback(null, combined);
});
});
}
/**
* Verify a password using Node's asynchronous pbkdf2 (key derivation) function.
*
* Accepts a hash and salt generated by hashPassword, and returns whether the
* hash matched the password (as a boolean).
*
* @param {!String} password
* @param {!Buffer} combined Buffer containing hash and salt as generated by
* hashPassword.
* @param {!function(?Error, !boolean)}
*/
function verifyPassword(password, combined, callback) {
// extract the salt and hash from the combined buffer
var saltBytes = combined.readUInt32BE(0);
var hashBytes = combined.length - saltBytes - 8;
var iterations = combined.readUInt32BE(4);
var salt = combined.slice(8, saltBytes + 8);
var hash = combined.toString('binary', saltBytes + 8);
// verify the salt and hash against the password
crypto.pbkdf2(password, salt, iterations, hashBytes, function(err, verify) {
if (err) {
return callback(err, false);
}
callback(null, verify.toString('binary') === hash);
});
}
exports.hashPassword = hashPassword;
exports.verifyPassword = verifyPassword;

View File

@ -0,0 +1,69 @@
var async = require("async");
var hash = require("./hash");
var crypto = require("crypto");
var dbUsers = require("../database/users");
var dbTokens = require("../database/tokens");
exports.login = function(userName, password, topCallback){
async.waterfall([
//Get the user
function(callback){
dbUsers.getUser(userName,function(error,user){
if (error){
callback(error);
return;
}
callback(null, user);
});
},
function(user, callback){
if (!user){
callback("user does not exist");
return;
}
//Get Hashed Password
hash.verifyPassword(password,user.password,function(error,isMatch){
if (error){
callback(error);
return;
}
if (!isMatch){
callback("Invalid UserName or Password");
return;
}
callback(null,isMatch, user.id);
});
},
function(isMatch, userId, callback){
//Password is a match so lets generate a token
dbTokens.createToken(userId,function(error,token){
if (error){
callback(error);
return;
}
callback(null, token);
});
}
],function(error,token){
if (error){
topCallback(error);
return;
}
topCallback(null, token);
});
}
exports.verifyToken = function(userId, tokenId, token, callback){
if (typeof userId == 'object' && typeof tokenId == 'function'){
verifyTokenObject(userId,tokenId);
return;
}
dbTokens.verifyToken(userId, tokenId, token, callback);
}
function verifyTokenObject(tokenObj, callback){
dbTokens.verifyToken(tokenObj.userId,tokenObj.id,tokenObj.value,callback);
}

View File

@ -1,101 +1,101 @@
var connection = require("./connection");
var dbEvents = this;
exports.getEvent = function(eventId, callback, includeDeleted){
var query = "SELECT * FROM Events WHERE Id = ? AND DeletedDate IS NULL;";
if (includeDeleted === true){
query = "SELECT * FROM Events WHERE Id = ?;";
}
connection.query(query,[eventId],function(error,rows,fields){
if (error){
console.log(error);
callback(error);
return;
}
var event = null;
if (rows.length > 0){
event = {};
event.id = rows[0].Id;
event.startDate = rows[0].StartDate;
event.endDate = rows[0].EndDate;
event.title = rows[0].Title;
event.description = rows[0].Description;
}
callback(null,event);
});
}
exports.getEvents = function(pageSize, pageNumber,callback){
var cd = new Date();
var offset = (pageNumber - 1) * pageSize;
connection.query("SELECT * FROM Events WHERE DeletedDate IS NULL AND StartDate >= ? ORDER BY StartDate ASC LIMIT ?,?;",[cd,offset,pageSize],function(err,rows,fields){
if (err){
console.log(err);
callback(err);
return;
}
var events = [];
for (var i = 0; i < rows.length; i++){
var event = {};
event.id = rows[i].Id;
event.startDate = rows[i].StartDate;
event.endDate = rows[i].EndDate;
event.title = rows[i].Title;
event.description = rows[i].Description;
events.push(event);
}
console.log(events);
callback(null,events);
});
};
exports.insertEvent = function(titleOrEventObject, startDateOrCallbackFunction, endDate, description, callback){
if (typeof startDateOrCallbackFunction === 'function'){
insertEventFromObject(titleOrEventObject, startDateOrCallbackFunction);
return;
}
//date string needs to be in the following format: yyyy-mm-dd-hh-mm
var startDte = new Date(startDateOrCallbackFunction);
var endDte = new Date(endDate);
connection.query("INSERT INTO Events (CreatedDate,ModifiedDate,Id,Title,StartDate,EndDate,Description) VALUES(CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,NULL,?,?,?,?)",[titleOrEventObject,startDte,endDte,description],function(error,result){
if (error){
console.log(error);
callback(error);
return;
}
dbEvents.getEvent(result.insertId,function(error,event){
if (error){
callback(error);
return;
}
callback(null,event);
});
});
}
function insertEventFromObject(event, callback){
dbSermons.insertSermon(event.title,event.startDate,event.endDate,evvent.description,callback);
}
exports.deleteEvent = function(eventIdOrEventObject, callback){
if (typeof eventIdOrEventObject !== 'number'){
eventIdOrEventObject = eventIdOrEventObject.id;
}
connection.query("UPDATE Events SET DeletedDate = CURRENT_TIMESTAMP WHERE Id = ?;",[eventIdOrEventObject],function(error,result){
if (error){
console.log(error);
callback(error);
return;
}
dbSermons.getEvent(eventIdOrEventObject,function(error,event){
if (error){
callback(error);
return;
}
console.log(event);
callback(null,{"affectedRows":result.affectedRows,"event":event});
},true);
});
var connection = require("./connection");
var dbEvents = this;
exports.getEvent = function(eventId, callback, includeDeleted){
var query = "SELECT * FROM Events WHERE Id = ? AND DeletedDate IS NULL;";
if (includeDeleted === true){
query = "SELECT * FROM Events WHERE Id = ?;";
}
connection.query(query,[eventId],function(error,rows,fields){
if (error){
console.log(error);
callback(error);
return;
}
var event = null;
if (rows.length > 0){
event = {};
event.id = rows[0].Id;
event.startDate = rows[0].StartDate;
event.endDate = rows[0].EndDate;
event.title = rows[0].Title;
event.description = rows[0].Description;
}
callback(null,event);
});
}
exports.getEvents = function(pageSize, pageNumber,callback){
var cd = new Date();
var offset = (pageNumber - 1) * pageSize;
connection.query("SELECT * FROM Events WHERE DeletedDate IS NULL AND StartDate >= ? ORDER BY StartDate ASC LIMIT ?,?;",[cd,offset,pageSize],function(err,rows,fields){
if (err){
console.log(err);
callback(err);
return;
}
var events = [];
for (var i = 0; i < rows.length; i++){
var event = {};
event.id = rows[i].Id;
event.startDate = rows[i].StartDate;
event.endDate = rows[i].EndDate;
event.title = rows[i].Title;
event.description = rows[i].Description;
events.push(event);
}
console.log(events);
callback(null,events);
});
};
exports.insertEvent = function(titleOrEventObject, startDateOrCallbackFunction, endDate, description, callback){
if (typeof startDateOrCallbackFunction === 'function'){
insertEventFromObject(titleOrEventObject, startDateOrCallbackFunction);
return;
}
//date string needs to be in the following format: yyyy-mm-dd-hh-mm
var startDte = new Date(startDateOrCallbackFunction);
var endDte = new Date(endDate);
connection.query("INSERT INTO Events (CreatedDate,ModifiedDate,Id,Title,StartDate,EndDate,Description) VALUES(CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,NULL,?,?,?,?)",[titleOrEventObject,startDte,endDte,description],function(error,result){
if (error){
console.log(error);
callback(error);
return;
}
dbEvents.getEvent(result.insertId,function(error,event){
if (error){
callback(error);
return;
}
callback(null,event);
});
});
}
function insertEventFromObject(event, callback){
dbSermons.insertSermon(event.title,event.startDate,event.endDate,evvent.description,callback);
}
exports.deleteEvent = function(eventIdOrEventObject, callback){
if (typeof eventIdOrEventObject !== 'number'){
eventIdOrEventObject = eventIdOrEventObject.id;
}
connection.query("UPDATE Events SET DeletedDate = CURRENT_TIMESTAMP WHERE Id = ?;",[eventIdOrEventObject],function(error,result){
if (error){
console.log(error);
callback(error);
return;
}
dbSermons.getEvent(eventIdOrEventObject,function(error,event){
if (error){
callback(error);
return;
}
console.log(event);
callback(null,{"affectedRows":result.affectedRows,"event":event});
},true);
});
}

View File

@ -0,0 +1,109 @@
var connection = require("./connection");
var crypto = require("crypto");
var async = require("async");
var dbTokens = this;
exports.createToken = function(userId, topCallback){
async.waterfall([
function(callback){
//Delete existing tokens for user
connection.query("DELETE FROM Tokens WHERE UserId = ?;",[userId],function(error,result){
if (error){
error.step = "deleting";
callback(error);
return;
}
callback(null,result);
});
},
function(deleteResult, callback){
//Create the token
crypto.randomBytes(128, function(error, result){
if (error){
error.step = "crypto-random";
callback(error);
return;
}
callback(null, result);
});
},
function(tokenBytes, callback){
//Insert Token into Database
var now = new Date();
var then = new Date()
//then.setDate(now.getDate() + 1); //Expires date is 1 day
then.setTime(then.getTime() + (1*60*60*1000)); //Expires in 1 hour
console.log("UserID: " + userId + "; Now: " + now + "; Then: " + then);
connection.query("INSERT INTO Tokens (CreatedDate,Id,UserId,Expires,Token) VALUES(NULL,NULL,?,?,?)",[userId,then,tokenBytes],function(error,result){
if (error){
error.step = "inserting";
callback(error);
return;
}
callback(null,result, tokenBytes);
});
},
function(insertResult, tokenBytes, callback){
var token = {
"id": insertResult.insertId,
"value": new Buffer(tokenBytes).toString("hex"),
"userId": userId
};
callback(null, token);
}
],function(error,result){
if (error){
topCallback(error);
return;
}
topCallback(null,result);
});
};
exports.verifyToken = function(userId, tokenId, token, topCallback){
getTokenFromDB(tokenId,userId,function(error,tokenObj){
if (error){
error.step = "getting from db";
topCallback(error);
return;
}
if (!tokenObj){
console.log("No Token with TokenId: " + tokenId + " and UserID: " + userId);
topCallback(null,false);
return;
}
var dbToken = new Buffer(tokenObj.value).toString("hex");
console.log(dbToken);
console.log(token);
if (dbToken == token){
topCallback(null,true);
} else {
topCallback(null,false);
}
});
};
function getTokenFromDB(tokenId,userId,callback){
var now = new Date();
var then = new Date();
then.setTime(then.getTime() + (1*60*60*1000)); //Expires in 1 hour
connection.query("UPDATE Tokens SET Expires = ? WHERE Id = ? AND UserId = ? AND Expires > ?; SELECT * FROM Tokens WHERE Id = ? AND UserId = ? AND Expires > ?",
[then,tokenId,userId,now,tokenId,userId,now],function(error,rows){
if (error){
console.log(error);
callback(error);
return;
}
var token = null;
rows = rows[1]; //First object is information on the update - we only want the rows for the update statement
if (rows && rows.length > 0){
token = {};
token.id = tokenId;
token.userId = userId;
token.value = rows[0].Token;
}
callback(null,token);
});
}

View File

@ -0,0 +1,64 @@
var connection = require("./connection");
var async = require("async");
var dbRights = this;
exports.getRights = function(userId,callback){
connection.query("SELECT * FROM UserRights t1 INNER JOIN UserRightsCodes t2 ON t1.RightId = t2.RightId WHERE t1.UserId = ?;",[userId],function(error,rows,fields){
if (error){
callback(error);
return;
}
var rights = [];
for(var i = 0; i < rows.length; i++){
if (!rights.indexOf(rows[i].Name) > -1){
rights.push(rows[i].Name);
}
}
console.log("rights");
console.log(rights);
callback(null,rights);
});
}
exports.addRight = function(userId, rightIdOrRightName, callback){
connection.query("INSERT IGNORE INTO UserRights (UserId,RightId) VALUES(?,?);",[userId,rightIdOrRightName],function(error,result){
if (error){
callback(error);
return;
}
callback(null,result);
});
}
exports.addRights = function(userId, rightIdArray, topCallback){
async.each(rightIdArray,function(item, callback){
dbRights.addRight(userId,item,function(error,result){
if (error){
callback(error);
} else {
callback();
}
});
},function(error){
if (error){
topCallback(error);
} else {
topCallback();
}
});
}
exports.hasRight = function(userId, rightName, callback){
dbRights.getRights(userId,function(error,rights){
if (error){
callback(error);
} else {
if (rights.indexOf(rightName) > -1){
callback(null,true);
} else {
callback(null,false);
}
}
});
}

View File

@ -0,0 +1,184 @@
var connection = require("./connection");
var hash = require("../authentication/hash");
var dbRights = require("./user-rights");
var async = require("async");
var dbUsers = this;
exports.getUser = function(userIdOrUserName, callback){
console.log(userIdOrUserName + " -- " + typeof userIdOrUserName);
var queryString = "SELECT * FROM Users WHERE UserName = ? AND DeletedDate IS NULL;";
if (typeof userIdOrUserName == "number"){
queryString = "SELECT * FROM Users WHERE Id = ? AND DeletedDate IS NULL;";
}
connection.query(queryString,[userIdOrUserName],function(error,rows,fields){
if (error){
console.log(error);
callback(error);
return;
}
var user = null;
if (rows.length > 0){
user = {};
user.id = rows[0].Id;
user.userName = rows[0].UserName;
user.email = rows[0].Email;
user.password = rows[0].Password;
user.deletedDate = rows[0].deletedDate;
}
console.log(user);
//console.log(fields);
callback(null,user);
});
}
exports.insertUser = function(userNameOrUserObject, passwordOrCallbackFunction, email, topCallback){
if (typeof passwordOrCallbackFunction === 'function'){
insertUserFromObject(userNameOrUserObject,passwordOrCallbackFunction);
return;
}
async.waterfall([
//First step is to check if the user name already exists
function(callback){
dbUsers.getUser(userNameOrUserObject,function(error,user){
if (error){
callback(error);
return;
}
if (user){
callback("user-exists"); //The user exists
return;
} else {
callback(null,false); //The user does not exist
return;
}
});
},
//If the user does not exist - get the hashed version of the password
function(userExists,callback){
//Get the password hash
hash.hashPassword(passwordOrCallbackFunction,function(error,hashedPW){
if (error){
callback(error);
return;
}
callback(null,hashedPW);
});
},
//Insert the user into the database with the hashed password
function(hashedPW,callback){
//User does not exist. Lets add it
connection.query("INSERT INTO Users (CreatedDate,ModifiedDate,Id,UserName,Password,DeletedDate,Email) VALUES(CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,NULL,?,?,NULL,?)",[userNameOrUserObject,hashedPW,email],function(error,result){
if (error){
callback(error);
return;
}
callback(null,result);
});
},
//Get the new user from the database and return it to the final function
function(insertResult,callback){
//Get the inserted user
dbUsers.getUser(insertResult.insertId,function(error,user){
if(error){
callback(error);
return;
}
if (!user){
callback("error retrieving new user");
return;
}
callback(null,user);
});
},
//add the rights for this user
function(user, callback){
var rightIdArray = [1,2];
dbRights.addRights(user.id,rightIdArray,function(error){
if (error){
callback(error);
} else {
callback(null,user);
}
});
}
],function(err,result){
//Complete
if (err == "user-exists"){
topCallback("User already Exists");
return;
}
if (err){
topCallback(err);
return;
}
result.password = "*";
topCallback(null,result);
});
}
function insertUserFromObject(sermon, callback){
dbSermons.insertUser(user.userName,user.password,user.email,callback);
}
exports.updateUser = function(userIdOrUserObject, userNameOrCallbackFunction, password, email, deletedDate, topCallback){
if (typeof userNameOrCallbackFunction == 'function'){
updateUserFromObject(userIdOrUserObject,userNameOrCallbackFunction);
return;
}
async.waterfall([
//First Step: == GET Hashed Password
function(callback){
hash.hashPassword(password,function(error, hashedPW){
if (error){
callback(error);
return;
}
callback(null,hashedPW);
});
},
function(hashedPW, callback){
connection.query("UPDATE Users SET UserName = ?, Password = ?, Email = ?, DeletedDate = ? WHERE Id = ?;",[userNameOrCallbackFunction,hashedPW,email,deletedDate,userIdOrUserObject],function(error,result){
if (error){
callback(error);
return;
}
callback(null, result);
});
},
function(updateResult, callback){
dbUsers.getUser(userIdOrUserObject,function(error,user){
if (error){
callback(error);
return;
}
callback(null, user);
});
}
], function(error, updatedUser){
if (error){
topCallback(error);
return;
}
topCallback(null,updatedUser);
});
}
function updateUserFromObject(user,callback){
dbUsers.updateUser(user.id,user.userName,user.password,user.email,user.deletedDate,callback);
}
exports.deleteUser = function(userIdOrUserObject, callback){
if (typeof userIdOrUserObject !== "number"){
userIdOrUserObject = userIdOrUserObject.id;
}
connection.query("UPDATE Users SET DeletedDate = CURRENT_TIMESTAMP WHERE Id = ?;",[userIdOrUserObject],function(error,result){
if (error){
callback(error);
return;
}
callback(null,result);
});
}

View File

@ -13,16 +13,71 @@
"negotiator": "0.6.1"
}
},
"append-field": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz",
"integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo="
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"async": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz",
"integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==",
"requires": {
"lodash": "4.17.4"
}
},
"bignumber.js": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.2.tgz",
"integrity": "sha1-LR3DfuWWiGfs6pC22k0W5oYI0h0="
},
"busboy": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
"integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
"requires": {
"dicer": "0.2.5",
"readable-stream": "1.1.14"
},
"dependencies": {
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
"isarray": "0.0.1",
"string_decoder": "0.10.31"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
}
}
},
"concat-stream": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
"integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
"requires": {
"inherits": "2.0.3",
"readable-stream": "2.3.3",
"typedarray": "0.0.6"
}
},
"content-disposition": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
@ -48,6 +103,11 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"crypto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
"integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig=="
},
"debug": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
@ -66,6 +126,38 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"dicer": {
"version": "0.2.5",
"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
"integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
"requires": {
"readable-stream": "1.1.14",
"streamsearch": "0.1.2"
},
"dependencies": {
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
},
"readable-stream": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
"isarray": "0.0.1",
"string_decoder": "0.10.31"
}
},
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
}
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@ -171,6 +263,11 @@
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"lodash": {
"version": "4.17.4",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
"integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -204,11 +301,39 @@
"mime-db": "1.30.0"
}
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": {
"minimist": "0.0.8"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"multer": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz",
"integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=",
"requires": {
"append-field": "0.1.0",
"busboy": "0.2.14",
"concat-stream": "1.6.0",
"mkdirp": "0.5.1",
"object-assign": "3.0.0",
"on-finished": "2.3.0",
"type-is": "1.6.15",
"xtend": "4.0.1"
}
},
"mysql": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.14.1.tgz",
@ -225,6 +350,16 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
},
"nodemailer": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-4.1.0.tgz",
"integrity": "sha512-pZg74CNQgnC0gZTfH0btXCxjKj7/2v5pea6hmMJ/iKyT48Z81TXZua7c65clwqKIlWfMfYBQG3OkrKxycIdXTw=="
},
"object-assign": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
"integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@ -332,6 +467,11 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
},
"streamsearch": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
},
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
@ -349,6 +489,11 @@
"mime-types": "2.1.17"
}
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@ -368,6 +513,11 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz",
"integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc="
},
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
}
}
}

View File

@ -9,7 +9,11 @@
"author": "",
"license": "ISC",
"dependencies": {
"async": "^2.5.0",
"crypto": "^1.0.1",
"express": "^4.15.4",
"mysql": "^2.14.1"
"multer": "^1.3.0",
"mysql": "^2.14.1",
"nodemailer": "^4.1.0"
}
}

View File

@ -0,0 +1,47 @@
var express = require('express');
var router = express.Router();
const { execFile } = require('child_process');
const fs = require('fs');
// /action/a means that it needs an authenticated user
router.use("/users/a", require("./require-auth"));
router.use("/sermons/a", require("./require-auth"));
router.use("/events/a", require("./require-auth"));
// routes
router.use("/", require("./main"));
router.use("/users", require("./users"));
router.use("/sermons", require("./sermons"));
router.use("/events", require("./events"));
router.use("/login", require("./login"));
router.use("/email", require("./email"));
router.use('/share',require('./share'));
router.get('/cim/:month/:day',function(req,res){
var dir = __dirname.replace('/routes/api','');
console.log(dir);
var file = dir + '/calendar_image_maker/generated_images/' + req.params.month + '_' + req.params.day + '.png';
if (fs.existsSync(file)){
console.log("already exists");
res.sendFile(file);
return;
}
child = execFile(dir + '/calendar_image_maker/bin/phantomjs', [dir + '/calendar_image_maker/script.js', req.params.month, req.params.day], (error, stdout, stderr) => {
console.log("MAKE");
if (error) {
throw error;
}
if (fs.existsSync(file)){
res.sendFile(file);
return;
} else {
res.error("Error");
}
});
});
module.exports = router;

View File

@ -0,0 +1,50 @@
var express = require('express');
var router = express.Router();
const nodemailer = require('nodemailer');
let transporter = nodemailer.createTransport({
host: 'smtp.webfaction.com',
port: 465,
secure: true,
auth:{
user: 'ofbcontact',
pass: '2014OfbPwd'
}
});
router.get("/",function(req,res){
res.status(200).json({"message":"Hello World"});
return;
});
router.post("/", function(req,res){
console.log(req.body);
if (!req.body.name || !req.body.email || !req.body.phone || !req.body.message){
res.status(400).json({"status":400,"message":"name, email, phone, and message are required fields in the body"});
return;
}
//This is the honeypot field
//If it has something in it then we know it was filled out by a bot
if (!req.body.hp || req.body.hp != '.'){
res.status(200).json({"status":200,"message":"Success!"});
return;
}
let mailOptions = {
from: 'donotreply@oldfashionbaptistbutte.com',
to: 'djmotog3@gmail.com',
subject: 'OFB - ' + req.body.message.substring(0,Math.min(50,req.body.message.length-1)),
html: '<b>Name:</b> ' + req.body.name + '<br><b>Email:</b> ' + req.body.email + '<br><b>Phone:</b> ' + req.body.phone + '<br><br>' + req.body.message
};
transporter.sendMail(mailOptions,(error, info) =>{
if (error){
res.status(400).json({"status":400,"message":"There was an error","error":error.response});
} else {
res.status(200).json({"status":200,"message":"Success"});
}
});
});
module.exports = router;

View File

@ -0,0 +1,74 @@
var express = require('express');
var router = express.Router();
var dbEvents = require('../../database/events');
router.get("/:id",function(req,res){
dbEvents.getEvent(req.params.id,function(error,event){
if (error){
res.status(404).json({"status":404,"message":"Error processing request"});
return;
}
if (event == null){
res.status(404).json({"status":404,"message":"Event does not exist"});
return;
}
res.status(200).json({"status":200,"event":event});
});
});
router.get("/page/:page",function(req,res){
console.log("page");
var pageSize = 5;
if (req.query.pageSize){
pageSize = parseInt(req.query.pageSize);
}
dbEvents.getEvents(pageSize,req.params.page,function(err,events){
if (err){
res.status(500).json({"status":500,"message":"Error processing request","error":err});
return;
}
res.status(200).json({"status":200,"events":events,"page":req.params.page,"pageSize":pageSize > events.length ? events.length : pageSize});
});
});
router.post("/a/", function(req,res){
console.log(req.body);
if (!req.body.title || !req.body.startDate || !req.body.endDate || !req.body.description){
removeFile(req.body.tmpPath);
res.status(400).json({"status":400,"message":"title, startDate, endDate, and description are required fields in the body"});
return;
}
dbEvents.insertEvent(req.body.title,req.body.startDate,req.body.endDate,req.body.description,function(error,event){
if (error){
res.status(500).json({"status":500,"message":"There was an error inserting the event"});
return;
}
if (event == null){
res.status(404).json({"status":404,"message":"Event does not exist"});
return;
}
res.status(201).json({"status":201,"event":event});
return;
});
});
router.delete("/a/",function(req,res){
if (!req.body.id){
res.status(400).json({"status":400,"message":"id of the event needs to be supplied to delete"});
return;
}
dbEvents.deleteEvent(req.body.id,function(error,result){
if (error){
res.status(500).json({"status":500,"message":"There was an error deleting the event"});
return;
}
res.status(200).json({"status":200,"affectedRows":result.affectedRows});
});
});
module.exports = router;

View File

@ -0,0 +1,74 @@
var express = require('express');
var router = express.Router();
var auth = require("../../authentication/login");
router.post("/",function(req,res){
console.log(req.method);
if (!req.body.userName || !req.body.password){
res.status(200).json({"status":200,"message":"userName and password is needed to login!"});
return;
}
auth.login(req.body.userName,req.body.password,function(error,token){
if (error){
res.status(400).json({"status":400,"message":"Error logging in","error":error});
return;
}
res.cookie("tokenId",token.id,{ httpOnly: true, secured: true, signed: true });
res.cookie("tokenValue",token.value,{ httpOnly: true, secured: true, signed: true });
res.cookie("tokenUser",token.userId,{ httpOnly: true, secured: true, signed: true});
res.status(200).json({"status":200,"message":"Logged In"});
});
});
router.post("/isloggedin",function(req,res){
var loggedIn = false;
if (!req.signedCookies.tokenUser || !req.signedCookies.tokenId || !req.signedCookies.tokenValue){
res.status(200).json({"status":200,"message":"invalid token cookie. token needs a userId, id, and value","loggedIn":loggedIn});
return;
}
var token = {};
token.userId = req.signedCookies.tokenUser;
token.id = req.signedCookies.tokenId;
token.value = req.signedCookies.tokenValue;
auth.verifyToken(token,function(error,isValid){
if (error){
res.status(400).json({"status":400,"message":"error validating token","loggedIn":loggedIn});
return;
} else {
if (!isValid){
res.status(200).json({"status":200,"message":"invalid token","loggedIn":loggedIn});
return;
} else {
loggedIn = true;
res.status(200).json({"status":200,"message":"valid token","loggedIn":loggedIn});
}
}
});
});
router.post("/validatetoken",function(req,res){
if (!req.body.token){
res.status(200).json({"status":200,"message":"token is needed to login!"});
return;
} else {
if (!req.body.token.id || !req.body.token.userId || !req.body.token.value){
res.status(200).json({"status":200,"message":"token needs to have an id, userId and value"});
return;
}
}
auth.verifyToken(req.body.token.userId, req.body.token.id, req.body.token.value, function(error,isValid){
if (error){
res.status(400).json({"status":400,"message":"Error validating token","error":error});
return;
}
res.status(200).json({"status":200,"message":"validate token","isValid":isValid});
});
});
module.exports = router;

View File

@ -0,0 +1,12 @@
var express = require('express');
var router = express.Router();
//Invoked for all requests
router.use(function(req,res,next){
console.log(req.originalUrl);
console.log("API - Main");
next();
});
module.exports = router;

View File

@ -0,0 +1,64 @@
var express = require('express');
var router = express.Router();
var multer = require('multer');
var fs = require('fs');
var tmpStorage = process.env['HOME'] + '/webapps/ofbstatic/media/sermons/tmp/';
var finalStorage = process.env['HOME'] + '/webapps/ofbstatic/media/sermons/';
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, tmpStorage);
},
filename: function (req, file, cb) {
cb(null, file.originalname);
}
})
var upload = multer({ storage:storage });
var auth = require('../../authentication/login')
function removeFile(filename){
if (filename == null)
return;
filepath = tmpStorage + filename;
fs.unlinkSync(filepath);
}
//Invoked for all requests
router.use(upload.single('file'),function(req,res,next){
var filename = req.file ? req.file.filename : null;
if (!req.signedCookies.tokenUser || !req.signedCookies.tokenId || !req.signedCookies.tokenValue){
removeFile(filename);
res.status(400).json({"status":400,"message":"invalid token cookie. token needs a userId, id, and value"});
return;
}
var token = {};
token.userId = req.signedCookies.tokenUser;
token.id = req.signedCookies.tokenId;
token.value = req.signedCookies.tokenValue;
auth.verifyToken(token,function(error,isValid){
if (error){
removeFile(filename);
res.status(400).json({"status":400,"message":"error validating token"});
return;
} else {
if (!isValid){
removeFile(filename);
res.status(400).json({"status":400,"message":"invalid token"});
return;
}
}
});
if (req.file){
req.body.file = req.file.originalname;
req.body.finalPath = finalStorage + req.file.filename;
req.body.tmpPath = req.file.destination + "/" + req.file.filename;
}
next();
});
module.exports = router;

View File

@ -0,0 +1,172 @@
var express = require('express');
var router = express.Router();
var fs = require('fs');
var dbSermons = require('../../database/sermons');
var storage = process.env['HOME'] + '/webapps/ofbstatic/media/sermons/';
var deletedStorage = process.env['HOME'] + '/webapps/ofbstatic/media/sermons/deleted/';
function removeFile(filepath){
fs.unlink(filepath,function(err){
if (err) throw err;
});
}
function renameFile(tempFilePath, finalFilePath,cb){
fs.rename(tempFilePath,finalFilePath,function(err){
cb(err);
});
}
function filenameFromPath(filepath){
return filepath.split('\\').pop().split('/').pop();
}
router.get("/search",function(req,res){
var pageSize = 5;
var page = 1;
var search = '';
if (req.query.pageSize) pageSize = parseInt(req.query.pageSize);
if (req.query.page) page = parseInt(req.query.page);
if (req.query.searchTerm) search = req.query.searchTerm;
dbSermons.searchSermons(pageSize,page,search,function(err,sermons){
if (err){
res.status(500).json({"status":500,"message":"Error processing request","error":err});
return;
}
res.status(200).json({"status":200,"sermons":sermons,"page":page,"pageSize":pageSize > sermons.length ? sermons.length : pageSize, "searchTerm":search});
});
});
router.get("/:id",function(req,res){
dbSermons.getSermon(req.params.id,function(error,sermon){
if (error){
res.status(404).json({"status":404,"message":"Error processing request"});
return;
}
if (sermon == null){
res.status(404).json({"status":404,"message":"Sermon does not exist"});
return;
}
res.status(200).json({"status":200,"sermon":sermon});
});
});
router.get("/download/:id",function(req,res){
var finalStorage = process.env['HOME'] + '/webapps/ofbstatic/media/';
dbSermons.getSermon(req.params.id,function(error,sermon){
if (error){
res.status(404).json({"status":404,"message":"Error processing request"});
return;
}
if (sermon == null){
res.status(404).json({"status":404,"message":"Sermon does not exist"});
return;
}
var file = finalStorage + sermon.file;
res.download(file);
});
});
router.get("/page/:page",function(req,res){
console.log("page");
var pageSize = 5;
if (req.query.pageSize){
pageSize = parseInt(req.query.pageSize);
}
dbSermons.getSermons(pageSize,req.params.page,function(err,sermons){
if (err){
res.status(500).json({"status":500,"message":"Error processing request","error":err});
return;
}
res.status(200).json({"status":200,"sermons":sermons,"page":req.params.page,"pageSize":pageSize > sermons.length ? sermons.length : pageSize});
});
});
router.post("/a/", function(req,res){
console.log(req.body);
if (!req.body.date || !req.body.title || !req.body.author || !req.body.description || !req.body.file){
removeFile(req.body.tmpPath);
res.status(400).json({"status":400,"message":"date, title, author, file, and description are required fields in the body"});
return;
}
req.body.file = "sermons/" + req.body.file;
dbSermons.insertSermon(req.body.date,req.body.title,req.body.author,req.body.description,req.body.file,function(error,sermon){
if (error){
removeFile(req.body.tmpPath);
res.status(500).json({"status":500,"message":"There was an error inserting the sermon"});
return;
}
if (sermon == null){
removeFile(req.body.tmpPath);
res.status(404).json({"status":404,"message":"Sermon does not exist"});
return;
}
/////******************************
/////Add the sermon to the postgres db for the existing site
var pg = require("../database/postgres-for-old-db/addSermon");
pg.addSermon(new Date(),req.body.title,req.body.author,req.body.description,req.body.file,function(error){
renameFile(req.body.tmpPath,req.body.finalPath,function(err){
if (err){
removeFile(req.body.tmpPath);
res.status(500).json({"status":500,"message":"Could not rename the temp file"});
} else {
res.status(201).json({"status":201,"sermon":sermon});
}
});
});
});
});
router.put("/a/",function(req,res){
console.log(req.body);
if (!req.body.id || !req.body.date || !req.body.title || !req.body.author || !req.body.description ){
res.status(400).json({"status":400,"message":"id, date, title, author, and description are required fields in the body"});
return;
}
dbSermons.updateSermon(req.body.id,req.body.date,req.body.title,req.body.author,req.body.description,function(error,result){
if (error){
res.status(500).json({"status":500,"message":"There was an error updating the sermon"});
return;
}
if (result.sermon == null){
res.status(404).json({"status":404,"message":"Sermon does not exist"});
return;
}
res.status(200).json({"status":200,"changedRows":result.changedRows,"sermon":result.sermon});
});
});
router.delete("/a/",function(req,res){
if (!req.body.id){
res.status(400).json({"status":400,"message":"id of the sermon needs to be supplied to delete"});
return;
}
dbSermons.deleteSermon(req.body.id,function(error,result){
if (error){
res.status(500).json({"status":500,"message":"There was an error deleting the sermon"});
return;
}
if (result.affectedRows > 0){
/////******************************
/////Add the sermon to the postgres db for the existing site
var pg = require("../database/postgres-for-old-db/addSermon");
pg.deleteSermon(result.sermon.file,function(error){
console.log(error);
var cPath = storage + filenameFromPath(result.sermon.file);
var dPath = deletedStorage + filenameFromPath(result.sermon.file);
renameFile(cPath,dPath,function(error){
res.status(200).json({"status":200,"affectedRows":result.affectedRows});
});
});
} else {
res.status(200).json({"status":200,"affectedRows":result.affectedRows});
}
});
});
module.exports = router;

View File

@ -1,8 +1,8 @@
var express = require('express');
var router = express.Router();
var dbSermons = require('../database/sermons');
var dbEvents = require('../database/events');
var dbSermons = require('../../database/sermons');
var dbEvents = require('../../database/events');
const calendarImageUrl = '/api2/cim/';
const eventUrl = '/api2/share/e';

View File

@ -0,0 +1,50 @@
var express = require('express');
var router = express.Router();
var dbUsers = require("../../database/users");
router.post("/a/",function(req,res){
console.log("new user");
if (!req.body.userName || !req.body.password || !req.body.email){
res.status(400).json({"status":400,"message":"userName, password, and email are required fields in the body"});
return;
}
dbUsers.insertUser(req.body.userName,req.body.password,req.body.email,function(error,newUser){
if (error){
res.status(400).json({"status":400,"message":"error creating new user","error":error});
return;
}
res.status(201).json({"status":201,"message":"user created","user":newUser});
});
});
router.put("/a/",function(req,res){
if (!req.body.userName || !req.body.password || !req.body.email){
res.status(400).json({"status":400,"message":"id, userName, password, and email are required fields in the body"});
return;
}
dbUsers.updateUser(req.body.token.userId,req.body.userName,req.body.password,req.body.email,null,function(error,updatedUser){
if (error){
res.status(400).json({"status":400,"message":"error updating user","error":error});
return;
}
updatedUser.password = "*";
res.status(200).json({"status":200,"message":"updated user","user":updatedUser});
});
});
router.delete("/a/",function(req,res){
if (!req.body.id){
res.status(400).json({"status":400,"message":"id of user needs to be supplied to perform delete"});
return;
}
dbUsers.deleteUser(req.body.id,function(error,result){
if (error){
res.status(400).json({"status":400,"message":"there was an error deleting the user","error":error});
return;
}
res.status(200).json({"status":200,"message":"user was deleted"});
});
});
module.exports = router;

View File

@ -0,0 +1,14 @@
var express = require('express');
var router = express.Router();
//Invoked for all requests
router.use(function(req,res,next){
console.log(req.protocol);
if (!req.secure){
res.status(403).json({"status":403,"message":"This resource requires a secure connection with SSL through https!"});
}
next();
});
module.exports = router;