app.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. 'use strict';
  2. // nodejs modules
  3. const path = require('path'),
  4. fs = require('fs'),
  5. os = require('os');
  6. process.env.NODE_CONFIG_DIR = `${process.cwd()}/backend/config`;
  7. // npm modules
  8. const express = require('express'),
  9. session = require('express-session'),
  10. mongoose = require('mongoose'),
  11. MongoStore = require('connect-mongo')(session),
  12. bodyParser = require('body-parser'),
  13. config = require('config'),
  14. request = require('request'),
  15. passport = require('passport'),
  16. bcrypt = require('bcrypt'),
  17. LocalStrategy = require('passport-local').Strategy,
  18. GitHubStrategy = require('passport-github').Strategy,
  19. DiscordStrategy = require('passport-discord').Strategy,
  20. passportSocketIo = require("passport.socketio");
  21. // global module
  22. const global = require('./logic/global');
  23. // database
  24. const MongoDB = mongoose.connect('mongodb://localhost:27017/musare').connection;
  25. MongoDB.on('error', (err) => {
  26. console.log('Database error: ' + err.message);
  27. });
  28. MongoDB.once('open', () => {
  29. console.log('Connected to database');
  30. setupExpress();
  31. });
  32. // setup express and socket.io
  33. function setupExpress() {
  34. const app = express(MongoDB);
  35. const server = app.listen(80);
  36. global.io = require('socket.io')(server);
  37. // other custom modules
  38. const coreHandler = require('./logic/coreHandler'),
  39. socketHandler = require('./logic/socketHandler'),
  40. expressHandler = require('./logic/expressHandler');
  41. global.db = {
  42. user: require('./schemas/user')(mongoose),
  43. station: require('./schemas/station')(mongoose),
  44. song: require('./schemas/song')(mongoose)
  45. };
  46. const mongoStore = new MongoStore({'mongooseConnection': MongoDB});
  47. app.use(session({
  48. secret: config.get('secret'),
  49. key: 'connect.sid',
  50. store: mongoStore,
  51. resave: true,
  52. saveUninitialized: true
  53. }));
  54. global.io.use(passportSocketIo.authorize({
  55. cookieParser: require('cookie-parser'),
  56. key: 'connect.sid',
  57. secret: config.get('secret'),
  58. store: mongoStore,
  59. success: function (data, accept) {
  60. console.log('successful connection to socket.io');
  61. accept();
  62. },
  63. fail: function (data, message, error, accept) {
  64. console.log(message);
  65. if (error && message !== "Passport was not initialized")
  66. throw new Error(message);
  67. accept();
  68. }
  69. }));
  70. app.use(passport.initialize());
  71. app.use(passport.session());
  72. passport.serializeUser((user, done) => {
  73. done(null, user);
  74. });
  75. passport.deserializeUser((user, done) => {
  76. done(null, user);
  77. });
  78. passport.use(new LocalStrategy({usernameField: 'email'}, (email, password, done) => {
  79. console.log(email, password);
  80. process.nextTick(() => {
  81. console.log(email, password);
  82. global.db.user.findOne({"email.address": email}, (err, user) => {
  83. if (err) return done(err);
  84. if (!user) return done(null, false);
  85. bcrypt.compare(password, user.services.password.password, function(err, res) {
  86. if (res) {
  87. return done(null, user);
  88. } else if (err) {
  89. return done(err);
  90. } else {
  91. return done(null, false);
  92. }
  93. });
  94. });
  95. });
  96. }));
  97. passport.use(new GitHubStrategy({
  98. clientID: config.get("apis.github.client"),
  99. clientSecret: config.get("apis.github.secret"),
  100. callbackURL: `${config.get("domain")}/users/github/callback`
  101. },
  102. function(accessToken, refreshToken, profile, done) {
  103. console.log('new github auth', accessToken, refreshToken, profile);
  104. /*User.findOrCreate({ githubId: profile.id }, function (err, user) {
  105. return cb(err, user);
  106. });*/
  107. global.db.user.findOne({"services.github.id": profile._json.id}, (err, id) => {
  108. if (err) return done(err);
  109. if (!id) {
  110. global.db.user.findOne({"username": profile.username}, (err, username) => {
  111. if (err) return done(err);
  112. if (!username) {
  113. let newUser = new global.db.user({
  114. username: profile.username,
  115. services: {
  116. discord: {
  117. id: profile.id
  118. }
  119. }
  120. });
  121. newUser.save(err => {
  122. if (err) throw err;
  123. return done(null, newUser);
  124. });
  125. } else {
  126. return done(null, user);
  127. }
  128. });
  129. }
  130. });
  131. }
  132. ));
  133. passport.use(new DiscordStrategy({
  134. clientID: config.get("apis.discord.client"),
  135. clientSecret: config.get("apis.discord.secret"),
  136. callbackURL: `${config.get("domain")}/users/discord/callback`
  137. },
  138. function(accessToken, refreshToken, profile, done) {
  139. console.log('new discord auth', accessToken, refreshToken, profile);
  140. global.db.user.findOne({"services.discord.id": profile.id}, (err, id) => {
  141. if (err) return done(err);
  142. if (!id) {
  143. global.db.user.findOne({"username": profile.username}, (err, username) => {
  144. if (err) return done(err);
  145. if (!username) {
  146. let newUser = new global.db.user({
  147. username: profile.username,
  148. services: {
  149. discord: {
  150. id: profile.id
  151. }
  152. }
  153. });
  154. newUser.save(err => {
  155. if (err) throw err;
  156. return done(null, newUser);
  157. });
  158. } else {
  159. return done(null, user);
  160. }
  161. });
  162. }
  163. });
  164. }
  165. ));
  166. app.use(bodyParser.json());
  167. app.use(bodyParser.urlencoded({
  168. extended: true
  169. }));
  170. app.use(express.static(__dirname + '/../frontend/build/'));
  171. socketHandler(coreHandler, global.io);
  172. expressHandler(coreHandler, app);
  173. }