app.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 = `${__dirname}/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. cookieParser = require('cookie-parser'),
  15. cors = require('cors'),
  16. request = require('request'),
  17. passport = require('passport'),
  18. bcrypt = require('bcrypt'),
  19. LocalStrategy = require('passport-local').Strategy,
  20. GitHubStrategy = require('passport-github').Strategy,
  21. DiscordStrategy = require('passport-discord').Strategy,
  22. passportSocketIo = require("passport.socketio");
  23. // global module
  24. const global = require('./logic/global');
  25. // database
  26. const MongoDB = mongoose.connect('mongodb://mongo:27017/musare').connection;
  27. MongoDB.on('error', err => {
  28. console.log('Database error: ' + err.message);
  29. });
  30. MongoDB.once('open', () => {
  31. console.log('Connected to database');
  32. setupExpress();
  33. });
  34. // setup express and socket.io
  35. function setupExpress() {
  36. const app = express(MongoDB);
  37. const server = app.listen(80);
  38. global.io = require('socket.io')(server);
  39. global.db = {
  40. user: require('./schemas/user')(mongoose),
  41. station: require('./schemas/station')(mongoose),
  42. song: require('./schemas/song')(mongoose)
  43. };
  44. // other custom modules
  45. const coreHandler = require('./logic/coreHandler'),
  46. socketHandler = require('./logic/socketHandler'),
  47. expressHandler = require('./logic/expressHandler');
  48. const mongoStore = new MongoStore({'mongooseConnection': MongoDB});
  49. app.use(session({
  50. secret: config.get('secret'),
  51. key: 'connect.sid',
  52. store: mongoStore,
  53. resave: true,
  54. saveUninitialized: true
  55. }));
  56. app.use(passport.initialize());
  57. app.use(passport.session());
  58. passport.serializeUser((user, done) => {
  59. done(null, user);
  60. });
  61. passport.deserializeUser((user, done) => {
  62. done(null, user);
  63. });
  64. global.io.use(passportSocketIo.authorize({
  65. passport: require('passport'),
  66. cookieParser: require('cookie-parser'),
  67. key: 'connect.sid',
  68. secret: config.get('secret'),
  69. store: mongoStore,
  70. success: (data, accept) => {
  71. console.log('success', data);
  72. accept();
  73. },
  74. fail: (data, message, error, accept) => {
  75. console.log('error', error, message);
  76. accept();
  77. }
  78. }));
  79. passport.use(new LocalStrategy({usernameField: 'email'}, (email, password, done) => {
  80. process.nextTick(() => {
  81. global.db.user.findOne({"email.address": email}, (err, user) => {
  82. if (err) return done(err);
  83. if (!user) return done(null, false);
  84. bcrypt.compare(password, user.services.password.password, function(err, res) {
  85. if (res) {
  86. return done(null, user);
  87. } else if (err) {
  88. return done(err);
  89. } else {
  90. return done(null, false);
  91. }
  92. });
  93. });
  94. });
  95. }));
  96. app.use(bodyParser.json());
  97. app.use(bodyParser.urlencoded({
  98. extended: true
  99. }));
  100. app.use(cors());
  101. socketHandler(coreHandler, global.io, app);
  102. expressHandler(coreHandler, app);
  103. }