forked from ishaniray/RecentTweets
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
154 lines (125 loc) · 5.26 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
require('dotenv').config();
const express = require('express');
const app = express();
const http = require('http').Server(app);
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const mysql = require('mysql');
const Twitter = require('twitter');
const apiKeys = {
consumer_key: process.env.CONSUMER_KEY,
consumer_secret: process.env.CONSUMER_SECRET,
access_token_key: process.env.ACCESS_TOKEN_KEY,
access_token_secret: process.env.ACCESS_TOKEN_SECRET
}
const T = new Twitter(apiKeys);
var connection = mysql.createConnection({
host: process.env.RDS_HOSTNAME,
port: process.env.RDS_PORT,
database: process.env.RDS_DB_NAME,
user: process.env.RDS_USERNAME,
password: process.env.RDS_PASSWORD
});
app.use(bodyParser.json());
app.use(cookieParser());
app.use(express.static(__dirname + '/resources'));
app.get('/favicon.ico', (req, res) => res.sendStatus(204)); // No content
app.get('/:parameters?', function(req, res) { // '?' indicates parameters are optional
var userParams = req.params.parameters;
if(!isValid(userParams)) {
res.status(404).send('Sorry, we cannot search this term for you due to technological limitations.');
return;
}
const searchParams = {
q: '#Cerner',
count: 10,
lang: 'en',
result_type: 'recent'
}; // defaults
var railsTheme = req.cookies['rails-theme'];
if(railsTheme == undefined) { // no cookie
railsTheme = 'light'; // default theme
}
if(userParams != undefined) {
var splitUserParams = userParams.split("-");
searchParams.q = `#${splitUserParams[0]}`; // first parameter - hashtag - passed; default value to be overridden
if(splitUserParams.length > 1) { // second parameter - result type - passed; default value to be overridden
searchParams.result_type = splitUserParams[1];
}
if(splitUserParams.length > 2) { // third parameter - theme - passed; default value / previous cookie value to be overridden
railsTheme = splitUserParams[2];
}
}
T.get('search/tweets', searchParams, (err, data, response) => {
// In case of an error, return
if(err) {
return console.log(err);
}
// Loop through the returned tweets and extract relevant information
const tweets = data.statuses.map(tweet => ({
id: tweet.id_str,
username: tweet.user.screen_name
}));
var oembedParams = {
theme: railsTheme
};
var embeddedTweets = [];
var count = 0;
for(var i = 0; i < tweets.length; ++i) {
var id = tweets[i].id;
var username = tweets[i].username;
oembedParams.url = `https://twitter.com/${username}/status/${id}`;
T.get('statuses/oembed', oembedParams , (err, oembedData, response) => {
count = count + 1;
if(err) {
return console.log(err);
}
embeddedTweets.push(oembedData.html);
if(count == tweets.length) { // render index.ejs only when all callbacks but the current one have finished executing
const uniqueEmbeddedTweets = new Set(embeddedTweets);
res.cookie('rails-theme', railsTheme, { maxAge: 2592000000 }).render('index.ejs', {
embeddedTweets: uniqueEmbeddedTweets,
searchParams: searchParams,
theme: railsTheme
}); // maxAge = 30 days
if(!/^#Cerner$/i.test(searchParams.q)) { // do not persist the search term 'Cerner' in the database, since it's the default value
var recordSearchedTerms = `insert into SearchedTerms (Hashtag, ResultType, SearchedAt) values ('${searchParams.q}', '${searchParams.result_type}', CURRENT_TIMESTAMP)`;
connection.query(recordSearchedTerms, function (err, result, fields) {
if (err) {
return console.log(err);
};
console.log("Search parameters recorded in the database.");
});
}
}
});
}
});
});
function isValid(userParams) {
if(userParams != undefined) {
if(userParams.includes('.')) {
return false;
}
let regex = /^(ReportServer|HNAP1|nmap|hudson|Dst2|muieblackcat|english|sachinsong|shell|server|wp|solr|phpmyadmin)/i; // requests generated by web scanners
if(regex.test(userParams)) {
return false;
}
}
return true;
}
app.post('/rating', function(req, res) {
var rating = JSON.parse(JSON.stringify(req.body)).rating;
var postRating = `insert into UserRatings (Rating, PostedAt) values (${rating}, CURRENT_TIMESTAMP)`;
connection.query(postRating, function (err, result, fields) {
if (err) {
res.sendStatus(503);
return console.log(err);
};
console.log("User rating recorded in database.");
res.sendStatus(201);
});
});
const server = http.listen(8080, function() {
console.log('listening on *:8080');
});