coreHandler.js 3.9 KB

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