Move all api to project
parent
d6ada934ad
commit
9c014d43af
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"lockfileVersion": 1
|
||||
}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
|
@ -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="
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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';
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
Loading…
Reference in New Issue