Advertisement
Guest User

Untitled

a guest
Feb 5th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.58 KB | None | 0 0
  1. /*
  2. Author: Ben Gerard
  3. Date: 17/3/17
  4. Purpose: Provides an API that powers the Campus Chase app.
  5. */
  6. var express = require('express');
  7. var bodyParser = require('body-parser')
  8. var mysql = require('mysql')
  9. var jwt = require('jsonwebtoken');
  10. var app = express();
  11. var FastMap = require("collections/fast-map");
  12. var multer = require('multer')
  13. var upload = multer({
  14. dest: 'uploads/'
  15. })
  16.  
  17. multer({
  18. limits: { fieldSize: 25 * 1024 * 1024 }
  19. })
  20.  
  21. app.use(bodyParser.json())
  22.  
  23. // Database details
  24. var connection = mysql.createConnection({
  25. host: 'localhost',
  26. user: 'treasurehuntbackend',
  27. password: 'nu123',
  28. database: 'treasurehunt'
  29. });
  30.  
  31. connection.connect(function(err) {
  32. if (err) {
  33. console.error('error connecting: ' + err.stack);
  34. return;
  35. }
  36. console.log('connected as id ' + connection.threadId);
  37. });
  38.  
  39. // Error Reporting
  40. /*
  41. process.on('uncaughtException', function (err) {
  42. console.error(err);
  43. console.log("Node NOT Exiting...");
  44. // Report errors here, with request to stats server
  45. });
  46. */
  47.  
  48. app.post('/uploadpicture', upload.single('profilepic'), function(req, res, next) {
  49. addPictureToPlayer(req.body.playername, req.body.teamid, req.file.filename);
  50. res.send("uploaded");
  51. })
  52.  
  53. function addPictureToPlayer(playername, teamid, filename) {
  54. connection.query('UPDATE players SET profilepicture = ? WHERE playername = ? and teamid = ?', [filename, playername, teamid], function(error, results, fields) {
  55. });
  56. }
  57.  
  58.  
  59. app.post('/createteam', function(req, res) {
  60. // Generate 4 digit id
  61. var id = generateID();
  62. addIDToDatabase(id);
  63. //gamePlayed();
  64. selectTeamColour(function(colour) {
  65. connection.query('UPDATE teams SET colour = ? WHERE teamid = ?', [colour,id], function(error, results, fields) {
  66.  
  67. });
  68. });
  69. addTeamName(req.body.teamname, id.toString());
  70. updateTeamQuestionNumber(0, id.toString());
  71. res.send(id.toString());
  72. });
  73.  
  74. function addTeamName(teamname, teamid) {
  75. connection.query('UPDATE teams SET teamname = ? WHERE teamid = ?', [teamname, teamid], function(error, results, fields) {
  76.  
  77. });
  78. }
  79.  
  80. app.post('/assignteamleader', function(req, res) {
  81. // Get team id from request
  82. var teamid = req.body.teamid;
  83. // get player name from request
  84. var playerName = req.body.playername;
  85.  
  86. createPlayer(teamid, playerName, function(result) {
  87. console.log(result);
  88. if (result) {
  89. var token = jwt.sign({
  90. "team_id": teamid
  91. }, 'secret');
  92. addTeamleader(teamid, playerName);
  93. updateTeamScore(teamid, 0);
  94. res.send(token);
  95. } else {
  96. res.send('error');
  97. }
  98. });
  99. });
  100.  
  101. app.post('/jointeam', function(req, res) {
  102. // Get team id from request
  103. var teamid = req.body.teamid;
  104. var playerName = req.body.playername;
  105.  
  106. // get player name from request
  107. // assign team id to player name
  108. createPlayer(teamid, playerName, function(result) {
  109. console.log(result);
  110. if (result == true) {
  111. var token = jwt.sign({
  112. "team_id": teamid
  113. }, 'secret');
  114. res.send(token);
  115. } else if (result == false) {
  116. res.send('player name already taken');
  117. }
  118. });
  119.  
  120. });
  121.  
  122. app.delete('/removeteam', function(req, res) {
  123. // get team id from request
  124. var teamid = req.body.teamid;
  125. var playername = req.body.playername;
  126. var token = req.body.token;
  127.  
  128. checkToken(token, playername, function(valid) {
  129. if (valid) {
  130. connection.query('DELETE FROM teams WHERE teamid = ?', teamid, function(error, results, fields) {
  131. if (error) {
  132. res.send('error');
  133. } else {
  134. res.send('removed');
  135. }
  136. });
  137. } else {
  138. res.send('Forbidden');
  139. }
  140. });
  141. });
  142.  
  143. app.delete('/removeplayer', function(req, res) {
  144. // get team id from request
  145. var playername = req.body.playername;
  146. var token = req.body.token;
  147. // remove the team and all of its players
  148. checkToken(token, playername, function(valid) {
  149. if (valid) {
  150. connection.query('DELETE FROM players WHERE playername = ?', playername, function(error, results, fields) {
  151. if (error) {
  152. res.send('error');
  153. } else {
  154. res.send('removed');
  155. }
  156. });
  157. } else {
  158. res.sendStatus(403);
  159. res.send('Forbidden');
  160. }
  161. });
  162. });
  163.  
  164. app.post('/updateplayerlocation', function(req, res) {
  165. var playername = req.body.playername;
  166. var location = req.body.location;
  167. var token = req.body.token;
  168. checkToken(token, playername, function(valid) {
  169. if (valid) {
  170. var decoded = jwt.verify(token, 'secret');
  171. var tokenteamid = decoded.team_id;
  172. connection.query('UPDATE players SET location = ? WHERE playername = ? AND teamid = ?', [location, playername, tokenteamid], function(error, results, fields) {
  173. if (error) {
  174. res.send('error');
  175. } else {
  176. res.send('location updated');
  177. }
  178. });
  179. } else {
  180. res.send('Forbidden');
  181. }
  182. });
  183. });
  184.  
  185. app.post('/updateteamscore', function(req, res) {
  186. var playername = req.body.playername;
  187. var teamid = req.body.teamid;
  188. var token = req.body.token;
  189. var score = req.body.score;
  190. checkToken(token, playername, function(valid) {
  191. if (valid) {
  192. updateTeamScore(teamid, score);
  193. } else {
  194. res.send('Forbidden');
  195. }
  196. });
  197. });
  198.  
  199. app.post('/getteamdetails', function(req, res) {
  200. // Get team id from request
  201. var teamid = req.body.teamid;
  202. var response = new FastMap();
  203. var players = [];
  204.  
  205. getTeamDetails(teamid, function(details) {
  206. getTeamPlayers(teamid, function(playersArray) {
  207. details.players = playersArray;
  208. res.send(details);
  209. });
  210. });
  211. });
  212.  
  213. app.post('/getallteamscores', function(req, res) {
  214. getAllTeamScores(function(scores){
  215. res.send(scores);
  216. })
  217. });
  218.  
  219. app.post('/gettoken', function(req, res) {
  220. var token = jwt.sign({
  221. "team_id": req.body.teamid
  222. }, 'secret');
  223. res.send(token);
  224. });
  225.  
  226. app.post('/playersinteam', function(req, res) {
  227. var teamid = req.body.teamid;
  228. getTeamPlayers(teamid , function(players){
  229. res.send(players.length.toString());
  230. });
  231. });
  232.  
  233. app.post('/updateteamquestion', function(req, res) {
  234. console.log("update team question");
  235. var teamid = req.body.teamid;
  236. var questionNumber = parseInt(req.body.questionNumber);
  237. updateTeamQuestionNumber(questionNumber, teamid);
  238. res.send("question updated");
  239. });
  240.  
  241. app.post('/updateplayername', function(req, res) {
  242. var teamid = req.body.teamid;
  243. var name = req.body.playername;
  244. connection.query('UPDATE players SET playername = ? WHERE teamid = ?', [name, teamid], function(error, results, fields) {
  245.  
  246. });
  247. res.send("name updated");
  248. });
  249.  
  250. app.post('/checkteamid', function(req, res) {
  251. var teamid = req.body.teamid;
  252.  
  253. connection.query('SELECT COUNT(*) FROM teams WHERE teamid = ?', teamid, function(error, results, fields) {
  254. res.send(results[0]);
  255. });
  256. });
  257.  
  258. function updateTeamQuestionNumber(questionNumber, teamid) {
  259. connection.query('UPDATE teams SET question = ? WHERE teamid = ?', [questionNumber, teamid], function(error, results, fields) {
  260.  
  261. });
  262. }
  263.  
  264. function generateID() {
  265. var id = random(1000, 9999);
  266. console.log(id);
  267. var idExists = checkIDExists(id);
  268. if (idExists == true) {
  269. generateID();
  270. }
  271. return id;
  272. }
  273.  
  274. function random(min, max) {
  275. return Math.floor(Math.random() * (max - min + 1) + min);
  276. }
  277.  
  278. function checkIDExists(id) {
  279. // Connect to datbase check if id is there
  280. connection.query('SELECT teamid FROM teams WHERE teamid = ?', id, function(error, results, fields) {
  281. if (results && results.length == 0) {
  282. // ID does not exist
  283. return false;
  284. } else {
  285. return true;
  286. }
  287. });
  288. }
  289.  
  290. function addIDToDatabase(id) {
  291. connection.query('INSERT INTO teams SET teamid = ?', id, function(error, results, fields) {
  292. console.log(error);
  293. });
  294. }
  295.  
  296. function createPlayer(teamid, playername, cb) {
  297. connection.query('INSERT INTO players SET teamid = ?, playername = ?', [teamid, playername], function(error, results, fields) {
  298. if (!error) {
  299. cb(true);
  300. } else {
  301. cb(false);
  302. }
  303. });
  304.  
  305. }
  306.  
  307. function addTeamleader(teamid, playername) {
  308. connection.query('UPDATE teams SET teamleader = ? WHERE teamid = ?', [playername, teamid], function(error, results, fields) {
  309. if (error) throw error;
  310.  
  311. });
  312. }
  313.  
  314. function selectTeamColour(cb) {
  315. // pick colour from
  316. //var colours = require("./colours").colours;
  317. var colour = '#' + ("000000" + Math.random().toString(16).slice(2, 8).toUpperCase()).slice(-6);
  318.  
  319. connection.query('SELECT colour FROM teams WHERE colour = ?', colour, function(error, results, fields) {
  320.  
  321. if (results.length > 0) {
  322. // Colour exists, pick new one
  323. selectTeamColour();
  324. } else {
  325. cb(colour);
  326. }
  327. });
  328. }
  329.  
  330.  
  331. function checkToken(token, playername, cb) {
  332. console.log("checkToken called");
  333. try {
  334. var decoded = jwt.verify(token, 'secret');
  335. var tokenteamid = decoded.team_id;
  336. connection.query('SELECT playername FROM players WHERE teamid = ?', tokenteamid, function(error, results, fields) {
  337. if (results.length > 0) {
  338. // Player exists at team, allow access
  339. cb(true);
  340. } else {
  341. cb(false);
  342. }
  343. });
  344. } catch (err) {
  345. // err
  346. console.log('token error');
  347. }
  348. }
  349.  
  350.  
  351. function getTeamDetails(teamid, cb) {
  352. connection.query('SELECT * FROM teams WHERE teamid = ?', teamid, function(error, results, fields) {
  353. if (error) {
  354. } else {
  355.  
  356. var response = {
  357. "teamname": results[0].teamname,
  358. "teamid": results[0].teamid,
  359. "teamleader": results[0].teamleader,
  360. "score": results[0].score,
  361. "colour": results[0].colour,
  362. "question": results[0].question
  363. };
  364. cb(response);
  365.  
  366. }
  367. });
  368. }
  369.  
  370.  
  371. function getTeamPlayers(teamid, cb) {
  372. connection.query('SELECT playername, location, profilepicture FROM players WHERE teamid = ?', teamid, function(error, results, fields) {
  373. if (error) {
  374. res.send('error');
  375. } else {
  376. var players = [];
  377. for (var i = 0; i < results.length; i++) {
  378. var playerData = results[i];
  379. var player = {
  380. "playername": playerData.playername,
  381. "location": playerData.location,
  382. "profilepicture": playerData.profilepicture
  383. };
  384. players.push(player);
  385. }
  386. }
  387. cb(players);
  388. });
  389. }
  390.  
  391. function getAllTeamScores(cb) {
  392. connection.query('SELECT score, teamid FROM teams', function(error, results, fields) {
  393. if (error) {
  394. res.send('error');
  395. } else {
  396. var scores = [];
  397. for (var i = 0; i < results.length; i++) {
  398. var scoreData = results[i];
  399. var score = {
  400. "teamid":scoreData.teamid,
  401. "score":scoreData.score
  402. };
  403. scores.push(score);
  404. }
  405. }
  406. cb(scores);
  407.  
  408. });
  409. }
  410.  
  411. function gamePlayed() {
  412. getGamesPlayed(function(gamesplayed) {
  413. connection.query('UPDATE stats SET gamesplayed = ?', gamesplayed++, function(error, results, fields) {
  414. if (error) {
  415. // error
  416. }
  417. });
  418. });
  419.  
  420. }
  421.  
  422. function getGamesPlayed(cb) {
  423. connection.query('SELECT gamesplayed FROM stats', function(error, results, fields) {
  424. if (error) {
  425. // error
  426. cb(results[0]);
  427. }
  428. });
  429. }
  430.  
  431. function updateTeamScore(teamid, score) {
  432. connection.query('UPDATE teams SET score = ? WHERE teamid = ?', [score, teamid], function(error, results, fields) {
  433.  
  434. });
  435. }
  436.  
  437. app.listen(process.env.PORT || 4740);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement