Add share routes

Transactions
= 2017-09-11 17:15:24 -06:00
parent 08e6cd06d0
commit 7cd279352e
9 changed files with 370 additions and 20 deletions

View File

@ -66,7 +66,7 @@ export class EventLargeComponent implements AfterContentInit {
var monthNum = this.startDate.getMonth();
var monthName = '';
monthName = MONTHS_FULL[monthNum];
return "/cim/" + monthName + "/" + this.startDate.getDate();
return "/api2/cim/" + monthName + "/" + this.startDate.getDate();
}
constructor(private dialog: MdDialog){
@ -84,7 +84,7 @@ export class EventLargeComponent implements AfterContentInit {
share(){
let opts = new MdDialogConfig;
opts.data = { prefix: 'd', id: this.id, title: this.title, description: this.description };
opts.data = { prefix: 'e', id: this.id, title: this.title, description: this.description };
let dialog = this.dialog.open(SharePopupComponent, opts);
}

View File

@ -17,7 +17,7 @@ export class SharePopupComponent implements OnInit {
public twitterUrl: string;
private id: string;
public facebookIframeUrl: string;
private shareBaseUrl: string = "https://ofbbutte.com/api/share/";
private shareBaseUrl: string = "https://ofbbutte.com/api2/share/";
public shareUrl: string;
constructor(@Inject(MD_DIALOG_DATA) public data: any, private mdDialogRef: MdDialogRef<SharePopupComponent>, private snackbar: MdSnackBar) {

View File

@ -4,14 +4,10 @@ const path = require('path');
const { execFile } = require('child_process');
const fs = require('fs');
app.use('/api/share/*',function(req,res){
console.log(req.originalUrl);
var fullUrl = req.protocol + '://' + req.hostname + req.originalUrl;
res.send(fullUrl);
});
app.use('/api2/share',require('./routes/share'));
app.get('/api/cim/:month/:day',function(req,res){
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)){

View File

@ -0,0 +1,8 @@
var mysql = require("mysql");
module.exports = mysql.createConnection({
user: "ofbapi",
password: "87hjdusiodksyeunsjkdis7",
database: "ofb",
multipleStatements: true
});

View File

@ -0,0 +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);
});
}

View File

@ -0,0 +1,155 @@
var connection = require("./connection");
var dbSermons = this;
exports.getSermon = function(sermonId, callback, includeDeleted){
var query = "SELECT * FROM Sermons WHERE Id = ? AND DeletedDate IS NULL;";
if (includeDeleted === true){
query = "SELECT * FROM Sermons WHERE Id = ?;";
}
connection.query(query,[sermonId],function(error,rows,fields){
if (error){
console.log(error);
callback(error);
return;
}
var sermon = null;
if (rows.length > 0){
sermon = {};
sermon.id = rows[0].Id;
sermon.date = rows[0].Date;
sermon.title = rows[0].Title;
sermon.author = rows[0].Author;
sermon.description = rows[0].Description;
sermon.file = rows[0].File;
}
callback(null,sermon);
});
}
exports.getSermons = function(pageSize, pageNumber,callback){
var offset = (pageNumber - 1) * pageSize;
connection.query("SELECT * FROM Sermons WHERE DeletedDate IS NULL ORDER BY Date DESC LIMIT ?,?;",[offset,pageSize],function(err,rows,fields){
if (err){
console.log(err);
callback(err);
return;
}
var sermons = [];
for (var i = 0; i < rows.length; i++){
var sermon = {};
sermon.id = rows[i].Id;
sermon.date = rows[i].Date;
sermon.title = rows[i].Title;
sermon.author = rows[i].Author;
sermon.description = rows[i].Description;
sermon.file = rows[i].File;
sermons.push(sermon);
}
callback(null,sermons);
});
};
exports.searchSermons = function(pageSize, pageNumber, searchTerm, callback){
var offset = (pageNumber - 1) * pageSize;
searchTerm = '%' + searchTerm + '%';
connection.query("SELECT * FROM Sermons WHERE DeletedDate IS NULL AND (Title LIKE ? OR Author LIKE ? OR Description LIKE ? OR Date LIKE ?) ORDER BY Id DESC LIMIT ?,?;",[searchTerm,searchTerm,searchTerm,searchTerm,offset,pageSize],function(err,rows,fields){
if (err){
console.log(err);
callback(err);
return;
}
var sermons = [];
for (var i = 0; i < rows.length; i++){
var sermon = {};
sermon.id = rows[i].Id;
sermon.date = rows[i].Date;
sermon.title = rows[i].Title;
sermon.author = rows[i].Author;
sermon.description = rows[i].Description;
sermon.file = rows[i].File;
sermons.push(sermon);
}
callback(null,sermons);
});
}
exports.insertSermon = function(dateOrSermonObject, titleOrCallbackFunction, author, description, file, callback){
if (typeof title === 'function'){
insertSermonFromObject(dateOrSermonObject,titleOrCallbackFunction);
return;
}
//date string needs to be in the following format: yyyy-mm-dd-hh-mm
var str = dateOrSermonObject.split(/\D/);
dateOrSermonObject = new Date(str[0],--str[1],str[2],str[3],str[4]);
connection.query("INSERT INTO Sermons (CreatedDate,ModifiedDate,Id,Date,Title,Author,Description,File) VALUES(?,CURRENT_TIMESTAMP,NULL,?,?,?,?,?)",[new Date,dateOrSermonObject,titleOrCallbackFunction,author,description,file],function(error,result){
if (error){
console.log(error);
callback(error);
return;
}
dbSermons.getSermon(result.insertId,function(error,sermon){
if (error){
callback(error);
return;
}
callback(null,sermon);
});
});
}
function insertSermonFromObject(sermon, callback){
dbSermons.insertSermon(sermon.date,sermon.title,sermon.author,sermon.description,sermon.file,callback);
}
exports.updateSermon = function(sermonIdOrSermonObject, dateOrCallbackFunction, title, author, description, callback){
if (typeof dateOrCallbackFunction == 'function'){
updateSermonFromObject(sermonIdOrSermonObject,callback);
return;
}
if (typeof dateOrCallbackFunction != 'date'){
//date string needs to be in the following format: yyyy-mm-dd-hh-mm
var str = dateOrCallbackFunction.split(/\D/);
dateOrCallbackFunction = new Date(str[0],--str[1],str[2],str[3],str[4]);
}
connection.query("UPDATE Sermons SET ModifiedDate = CURRENT_TIMESTAMP, Date = ?, Title = ?, Author = ?, Description = ? WHERE Id = ?",[dateOrCallbackFunction,title,author,description,sermonIdOrSermonObject],function(error,result){
if (error){
console.log(error);
callback(error);
return;
}
dbSermons.getSermon(sermonIdOrSermonObject,function(error,sermon){
if (error){
callback(error);
return;
}
callback(null,{"changedRows":result.changedRows,"sermon":sermon});
});
});
};
function updateSermonFromObject(sermon, callback){
dbSermons.updateSermon(sermon.id,sermon.date,sermon.title,sermon.author,sermon.description,callback);
}
exports.deleteSermon = function(sermonIdOrSermonObject, callback){
if (typeof sermonIdOrSermonObject !== 'number'){
sermonIdOrSermonObject = sermonIdOrSermonObject.id;
}
connection.query("UPDATE Sermons SET DeletedDate = CURRENT_TIMESTAMP WHERE Id = ?;",[sermonIdOrSermonObject],function(error,result){
if (error){
console.log(error);
callback(error);
return;
}
dbSermons.getSermon(sermonIdOrSermonObject,function(error,sermon){
if (error){
callback(error);
return;
}
console.log(sermon);
callback(null,{"affectedRows":result.affectedRows,"sermon":sermon});
},true);
});
}

View File

@ -18,6 +18,11 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"bignumber.js": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.0.2.tgz",
"integrity": "sha1-LR3DfuWWiGfs6pC22k0W5oYI0h0="
},
"content-disposition": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
@ -38,6 +43,11 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"debug": {
"version": "2.6.8",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
@ -156,6 +166,11 @@
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz",
"integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -194,6 +209,17 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"mysql": {
"version": "2.14.1",
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.14.1.tgz",
"integrity": "sha512-ZPXqQeYH7L1QPDyC77Rcp32cNCQnNjz8Y4BbF17tOjm5yhSfjFa3xS4PvuxWJtEEmwVc4ccI7sSntj4eyYRq0A==",
"requires": {
"bignumber.js": "4.0.2",
"readable-stream": "2.3.3",
"safe-buffer": "5.1.1",
"sqlstring": "2.2.0"
}
},
"negotiator": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
@ -217,6 +243,11 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"process-nextick-args": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
},
"proxy-addr": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz",
@ -236,6 +267,25 @@
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
},
"readable-stream": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
"integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
"isarray": "1.0.0",
"process-nextick-args": "1.0.7",
"safe-buffer": "5.1.1",
"string_decoder": "1.0.3",
"util-deprecate": "1.0.2"
}
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"send": {
"version": "0.15.4",
"resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz",
@ -272,11 +322,24 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
"integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
},
"sqlstring": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.2.0.tgz",
"integrity": "sha1-wxNcTqirzX5+50GklmqJHYak8ZE="
},
"statuses": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4="
},
"string_decoder": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
"requires": {
"safe-buffer": "5.1.1"
}
},
"type-is": {
"version": "1.6.15",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
@ -291,6 +354,11 @@
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utils-merge": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",

View File

@ -9,6 +9,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.15.4"
"express": "^4.15.4",
"mysql": "^2.14.1"
}
}

View File

@ -2,9 +2,18 @@ var express = require('express');
var router = express.Router();
var dbSermons = require('../database/sermons');
var dbEvents = require('../database/events');
const calendarImageUrl = '/api2/cim/';
const eventUrl = '/api2/share/e';
const sermonImageUrl = '/assets/images/facebookplay.png';
const sermonUrl = '/sermons/s';
router.get("/:shareCode",function(req,res){
var fullUrl = req.protocol + '://' + req.hostname + ':' + req.socket.localPort + req.originalUrl;
console.log("Full");
console.log(fullUrl);
var sharecode = req.params.shareCode;
var type = sharecode.substring(0,1);
var param = sharecode.substring(1);
@ -20,16 +29,18 @@ router.get("/:shareCode",function(req,res){
function getSermon(req, res, id){
var userAgent = req.headers['user-agent'];
var userAgentOverride = req.headers['user-agent-override'];
userAgent = userAgentOverride || userAgent;
if (userAgent.startsWith('facebookexternalhit/1.1') ||
userAgent === 'Facebot' ||
userAgent.startsWith('Twitterbot')) {
getSermonMeta(res, id);
getSermonMeta(req, res, id);
} else {
res.redirect("https://ofbbutte.com/sermons/" + id);
}
}
function getSermonMeta(res, id){
function getSermonMeta(req, res, id){
dbSermons.getSermon(id,function(error,sermon){
if (error){
res.status(404).json({"status":404,"message":"Error processing request"});
@ -40,16 +51,20 @@ function getSermonMeta(res, id){
return;
}
var port = req.socket.localPort;
var imageUrl = req.protocol + "://" + req.hostname + ":" + port + sermonImageUrl;
var srmnUrl = req.protocol + "://" + req.hostname + ":" + port + sermonUrl + sermon.id;
var result = `<html>
<head>
<title>Old Fashion Baptist Church</title>
<!-- You can use Open Graph tags to customize link previews.
Learn more: https://developers.facebook.com/docs/sharing/webmasters -->
<meta property="og:url" content="https://ofbbutte.com/api/share/s`+ sermon.id +`"/>
<meta property="og:url" content="`+ srmnUrl +`"/>
<meta property="og:type" content="website" />
<meta property="og:title" content="` + sermon.title + `" />
<meta property="og:description" content="` + sermon.description + `" />
<meta property="og:image" content="https://ofbbutte.com/static/ofbmain/images/facebookplay.png" />
<meta property="og:image" content="` + imageUrl + `" />
</head>
<body>
</body>
@ -62,22 +77,24 @@ function getSermonMeta(res, id){
function getEvent(req, res, id){
var userAgent = req.headers['user-agent'];
var userAgentOverride = req.headers['user-agent-override'];
userAgent = userAgentOverride || userAgent;
if (userAgent.startsWith('facebookexternalhit/1.1') ||
userAgent === 'Facebot' ||
userAgent.startsWith('Twitterbot')) {
getEventMeta(res, id);
getEventMeta(req, res, id);
} else {
res.redirect("https://ofbbutte.com/events/" + id);
}
}
function getEventMeta(res, id){
dbSermons.getEvent(id,function(error,event){
function getEventMeta(req, res, id){
dbEvents.getEvent(id,function(error,event){
if (error){
res.status(404).json({"status":404,"message":"Error processing request"});
return;
}
if (sermon == null){
if (event == null){
res.status(404).json({"status":404,"message":"Event does not exist"});
return;
}
@ -86,16 +103,20 @@ function getEventMeta(res, id){
var monthName = MONTHS_FULL[monthNum];
var day = event.startDate.getDate();
var port = req.socket.localPort;
var imageUrl = req.protocol + "://" + req.hostname + ":" + port + calendarImageUrl + monthName + "/" + day;
var evntUrl = req.protocol + "://" + req.hostname + ":" + port + eventUrl + event.id;
var result = `<html>
<head>
<title>Old Fashion Baptist Church</title>
<!-- You can use Open Graph tags to customize link previews.
Learn more: https://developers.facebook.com/docs/sharing/webmasters -->
<meta property="og:url" content="https/share/e`+ event.id +`"/>
<meta property="og:url" content="`+ evntUrl +`"/>
<meta property="og:type" content="website" />
<meta property="og:title" content="` + event.title + `" />
<meta property="og:description" content="` + event.description + `" />
<meta property="og:image" content="/cim/` + monthName + `/` + day + `"/>
<meta property="og:image" content="` + imageUrl + `"/>
</head>
<body>
</body>