2
0

coreHandler.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. r = require('rethinkdb');
  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: function (name, cb) {
  19. eventEmitter.on(name, cb);
  20. },
  21. emit: function (name, data) {
  22. eventEmitter.emit(name, data);
  23. },
  24. // core route handlers
  25. '/users/login': function (user, cb) {
  26. if (!user.username || !user.password) {
  27. return cb({ status: 'error', message: 'Invalid login request' });
  28. }
  29. r.table('users').filter({
  30. username: user.username,
  31. password: crypto.createHash('md5').update(user.password).digest("hex")
  32. }).run(rc, (err, cursor) => {
  33. if (err) {
  34. return cb({ status: 'failure', message: 'Error while fetching the user' });
  35. }
  36. else {
  37. cursor.toArray((err, result) => {
  38. if (err) {
  39. return cb({ status: 'failure', message: 'Error while fetching the user' });
  40. }
  41. else {
  42. return cb({ status: 'success', user: result });
  43. }
  44. });
  45. }
  46. });
  47. },
  48. '/users/register': function (user, cb) {
  49. if (!user.email || !user.username || !user.password) {
  50. return cb({ status: 'error', message: 'Invalid register request' });
  51. }
  52. // TODO: Implement register
  53. },
  54. '/stations': function (cb) {
  55. cb(stations.getStations().map(function (result) {
  56. return {
  57. id: result.getId(),
  58. displayName: result.getDisplayName(),
  59. description: result.getDescription(),
  60. users: result.getUsers()
  61. }
  62. }));
  63. },
  64. '/stations/join/:id': function (id, user, cb) {
  65. var station = stations.getStation(id);
  66. if (station) {
  67. user.stationId = id;
  68. this.emit('station-joined', {
  69. user: {
  70. id: user.id,
  71. username: user.username
  72. }
  73. });
  74. return cb({
  75. status: 'joined',
  76. data: {
  77. displayName: station.getDisplayName(),
  78. users: station.getUsers(),
  79. currentSong: station.getCurrentSong()
  80. }
  81. });
  82. }
  83. else {
  84. return cb({ status: 'error', message: 'Room with that ID does not exists' });
  85. }
  86. },
  87. '/stations/search/:query': function (query, cb) {
  88. var params = [
  89. 'part=snippet',
  90. `q=${encodeURIComponent(query)}`,
  91. `key=${config.get('apis.youtube.key')}`,
  92. 'type=video',
  93. 'maxResults=25'
  94. ].join('&');
  95. request(`https://www.googleapis.com/youtube/v3/search?${params}`, function (err, res, body) {
  96. if (err) {
  97. return cb({ status: 'error', message: 'Failed to make request' });
  98. }
  99. else {
  100. try {
  101. return cb({ status: 'success', body: JSON.parse(body) });
  102. }
  103. catch (e) {
  104. return cb({ status: 'error', message: 'Non JSON response' });
  105. }
  106. }
  107. });
  108. }
  109. };