app.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. cors = require('cors'),
  15. request = require('request'),
  16. passport = require('passport'),
  17. bcrypt = require('bcrypt'),
  18. LocalStrategy = require('passport-local').Strategy,
  19. GitHubStrategy = require('passport-github').Strategy,
  20. DiscordStrategy = require('passport-discord').Strategy,
  21. passportSocketIo = require("passport.socketio");
  22. // global module
  23. const global = require('./logic/global');
  24. // database
  25. const MongoDB = mongoose.connect(`mongodb://${config.get('domain')}:27017/musare`).connection;
  26. MongoDB.on('error', err => {
  27. console.log('Database error: ' + err.message);
  28. });
  29. MongoDB.once('open', () => {
  30. console.log('Connected to database');
  31. setupExpress();
  32. });
  33. // setup express and socket.io
  34. function setupExpress() {
  35. const app = express(MongoDB);
  36. const server = app.listen(80);
  37. global.io = require('socket.io')(server);
  38. // other custom modules
  39. const coreHandler = require('./logic/coreHandler'),
  40. socketHandler = require('./logic/socketHandler'),
  41. expressHandler = require('./logic/expressHandler');
  42. global.db = {
  43. user: require('./schemas/user')(mongoose),
  44. station: require('./schemas/station')(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: (data, accept) => {
  60. accept();
  61. },
  62. fail: (data, message, error, accept) => {
  63. accept();
  64. }
  65. }));
  66. passport.use(new LocalStrategy({usernameField: 'email'}, (email, password, done) => {
  67. process.nextTick(() => {
  68. global.db.user.findOne({"email.address": email}, (err, user) => {
  69. if (err) return done(err);
  70. if (!user) return done(null, false);
  71. bcrypt.compare(password, user.services.password.password, function(err, res) {
  72. if (res) {
  73. return done(null, user);
  74. } else if (err) {
  75. return done(err);
  76. } else {
  77. return done(null, false);
  78. }
  79. });
  80. });
  81. });
  82. }));
  83. app.use(bodyParser.json());
  84. app.use(bodyParser.urlencoded({
  85. extended: true
  86. }));
  87. app.use(cors());
  88. socketHandler(coreHandler, global.io);
  89. expressHandler(coreHandler, app);
  90. }