app.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. bodyParser = require('body-parser'),
  12. config = require('config'),
  13. cookieParser = require('cookie-parser'),
  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 globals = require('./logic/globals');
  24. // database
  25. globals.db.connection = mongoose.connect('mongodb://mongo:27017/musare').connection;
  26. globals.db.connection.on('error', err => console.log('Database error: ' + err.message));
  27. globals.db.connection.once('open', _ => {
  28. console.log('Connected to database');
  29. const app = express(globals.db.connection);
  30. const server = app.listen(80);
  31. globals.io = require('socket.io')(server);
  32. // load all the schemas from the schemas folder into an object
  33. globals.db.models =
  34. // get an array of all the files in the schemas folder
  35. fs.readdirSync(`${__dirname}/schemas`)
  36. // remove the .js from the file names
  37. .map(name => name.split('.').shift())
  38. // create an object with
  39. .reduce((db, name) => {
  40. db[name] = mongoose.model(name, new mongoose.Schema(require(`${__dirname}/schemas/${name}`)));
  41. return db;
  42. }, {});
  43. globals.db.store = new (require('connect-mongo')(session))({ 'mongooseConnection': globals.db.connection });
  44. app.use(session({
  45. secret: config.get('secret'),
  46. key: 'connect.sid',
  47. store: globals.db.store,
  48. resave: true,
  49. saveUninitialized: true
  50. }));
  51. app.use(passport.initialize());
  52. app.use(passport.session());
  53. passport.serializeUser((user, done) => done(null, user));
  54. passport.deserializeUser((user, done) => done(null, user));
  55. globals.io.use(passportSocketIo.authorize({
  56. passport: require('passport'),
  57. cookieParser: require('cookie-parser'),
  58. key: 'connect.sid',
  59. secret: config.get('secret'),
  60. store: globals.db.store,
  61. success: (data, accept) => {
  62. console.log('success', data);
  63. accept();
  64. },
  65. fail: (data, message, error, accept) => {
  66. console.log('error', error, message);
  67. accept();
  68. }
  69. }));
  70. passport.use(new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
  71. process.nextTick(() => {
  72. globals.db.user.findOne({ "email.address": email }, (err, user) => {
  73. if (err) return done(err);
  74. if (!user) return done(null, false);
  75. bcrypt.compare(password, user.services.password.password, function(err, res) {
  76. if (res) {
  77. return done(null, user);
  78. } else if (err) {
  79. return done(err);
  80. } else {
  81. return done(null, false);
  82. }
  83. });
  84. });
  85. });
  86. }));
  87. app.use(bodyParser.json());
  88. app.use(bodyParser.urlencoded({ extended: true }));
  89. let corsOptions = Object.assign({}, config.get('cors'));
  90. app.use(cors(corsOptions));
  91. app.options('*', cors(corsOptions));
  92. const coreHandler = require('./logic/coreHandler');
  93. require('./logic/socketHandler')(coreHandler, globals.io);
  94. require('./logic/expressHandler')(coreHandler, app);
  95. });