coreHandler.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. 'use strict';
  2. // nodejs modules
  3. const path = require('path'),
  4. fs = require('fs'),
  5. os = require('os'),
  6. events = require('events');
  7. // npm modules
  8. const config = require('config'),
  9. request = require('request'),
  10. waterfall = require('async/waterfall'),
  11. passport = require('passport');
  12. // custom modules
  13. const global = require('./global'),
  14. stations = require('./stations');
  15. var eventEmitter = new events.EventEmitter();
  16. module.exports = {
  17. // module functions
  18. on: (name, cb) => {
  19. eventEmitter.on(name, cb);
  20. },
  21. emit: (name, data) => {
  22. eventEmitter.emit(name, data);
  23. },
  24. // core route handlers
  25. '/users/register': (username, email, password, recaptcha, cb) => {
  26. console.log(username, password);
  27. //TODO Check recaptcha
  28. request({
  29. url: 'https://www.google.com/recaptcha/api/siteverify',
  30. method: 'POST',
  31. form: {
  32. 'secret': config.get("apis.recapthca.secret"),
  33. 'response': recaptcha
  34. }
  35. }, function (error, response, body) {
  36. console.log(error, body, error === null, JSON.parse(body).success === true);
  37. if (error === null && JSON.parse(body).success === true) {
  38. body = JSON.parse(body);
  39. global.db.user.findOne({'username': username}, function (err, user) {
  40. console.log(err, user);
  41. if (err) return cb(err);
  42. if (user) return cb("username");
  43. else {
  44. global.db.user.findOne({'email.address': email}, function (err, user) {
  45. console.log(err, user);
  46. if (err) return cb(err);
  47. if (user) return cb("email");
  48. else {
  49. //TODO Email verification code, send email
  50. //TODO Encrypt password
  51. let newUser = new global.db.user({
  52. username: username,
  53. email: {
  54. address: email,
  55. verificationToken: "Code"
  56. }
  57. });
  58. newUser.save(function (err) {
  59. if (err) throw err;
  60. return cb(null, newUser);
  61. });
  62. }
  63. });
  64. }
  65. });
  66. } else {
  67. cb("Recaptcha failed");
  68. }
  69. });
  70. },
  71. '/stations': cb => {
  72. cb(stations.getStations().map(function (result) {
  73. return {
  74. id: result.getId(),
  75. displayName: result.getDisplayName(),
  76. description: result.getDescription(),
  77. users: result.getUsers()
  78. }
  79. }));
  80. },
  81. '/stations/join/:id': (id, user, cb) => {
  82. const station = stations.getStation(id);
  83. if (station) {
  84. user.stationId = id;
  85. this.emit('station-joined', {
  86. user: {
  87. id: user.id,
  88. username: user.username
  89. }
  90. });
  91. return cb({
  92. status: 'joined',
  93. data: {
  94. displayName: station.getDisplayName(),
  95. users: station.getUsers(),
  96. currentSong: station.getCurrentSong()
  97. }
  98. });
  99. }
  100. else {
  101. return cb({ status: 'error', message: 'Room with that ID does not exists' });
  102. }
  103. },
  104. '/stations/search/:query': (query, cb) => {
  105. const params = [
  106. 'part=snippet',
  107. `q=${encodeURIComponent(query)}`,
  108. `key=${config.get('apis.youtube.key')}`,
  109. 'type=video',
  110. 'maxResults=25'
  111. ].join('&');
  112. request(`https://www.googleapis.com/youtube/v3/search?${params}`, (err, res, body) => {
  113. if (err) {
  114. return cb({ status: 'error', message: 'Failed to make request' });
  115. }
  116. else {
  117. try {
  118. return cb({ status: 'success', body: JSON.parse(body) });
  119. }
  120. catch (e) {
  121. return cb({ status: 'error', message: 'Non JSON response' });
  122. }
  123. }
  124. });
  125. }
  126. };