Explorar el Código

Refactoring application structure

Fix to use basic auth
Sotaro KARASAWA hace 11 años
padre
commit
7010c3c296

+ 5 - 198
app.js

@@ -5,203 +5,10 @@
  * @author  Sotaro KARASAWA <sotarok@crocos.co.jp>
  */
 
-var express  = require('express')
-  , bodyParser = require('body-parser')
-  , multer   = require('multer')
-  , morgan   = require('morgan')
-  , cookieParser = require('cookie-parser')
-  , methodOverride = require('method-override')
-  , errorHandler = require('errorhandler')
-  , cons     = require('consolidate')
-  , swig     = require('swig')
-  , flash    = require('connect-flash')
-  , http     = require('http')
-  , facebook = require('facebook-node-sdk')
-  , mongo    = require('mongoose')
-  , middleware = require('./lib/util/middlewares')
-  , time     = require('time')
-  , async    = require('async')
-  , session  = require('express-session')
-  , basicAuth = require('basic-auth-connect')
-  , debug    = require('debug')('crowi:appjs')
-  , models
-  , config
-  , configModel
-  , server
-  , sessionConfig
-  , RedisStore
-  ;
+var crowi = new (require('./lib/crowi'))(__dirname, process.env);
 
-time.tzset('Asia/Tokyo');
-
-var app = express();
-var env = app.get('env');
-var days = (1000*3600*24*30);
-
-// mongoUri = mongodb://user:password@host/dbname
-var mongoUri = process.env.MONGOLAB_URI ||
-  process.env.MONGOHQ_URL ||
-  process.env.MONGO_URI ||
-  'mongodb://localhost/crowi'
-  ;
-
-mongo.connect(mongoUri);
-
-sessionConfig = {
-  rolling: true,
-  secret: process.env.SECRET_TOKEN || 'this is default session secret',
-  resave: false,
-  saveUninitialized: true,
-  cookie: {
-    maxAge: days,
-  },
-};
-var redisUrl = process.env.REDISTOGO_URL ||
-  process.env.REDIS_URL ||
-  null;
-
-if (redisUrl) {
-  var ru   = require('url').parse(redisUrl);
-  var redis = require('redis');
-  var redisClient = redis.createClient(ru.port, ru.hostname);
-  if (ru.auth) {
-    redisClient.auth(ru.auth.split(':')[1]);
-  }
-
-  RedisStore = require('connect-redis')(session);
-  sessionConfig.store = new RedisStore({
-    prefix: 'crowi:sess:',
-    client: redisClient,
-  });
-}
-
-app.set('port', process.env.PORT || 3000);
-app.use(express.static(__dirname + '/public'));
-app.engine('html', cons.swig);
-app.set('view cache', false);
-app.set('view engine', 'html');
-app.set('views', __dirname + '/lib/views');
-app.use(methodOverride());
-app.use(bodyParser.urlencoded({ extended: true }));
-app.use(bodyParser.json());
-app.use(cookieParser());
-app.use(multer());
-app.use(session(sessionConfig));
-app.use(flash());
-
-configModel = require('./lib/models/config')(app);
-
-async.series([
-  function (next) {
-    configModel.loadAllConfig(function(err, doc) {
-      app.set('config', doc);
-
-      return next();
-    });
-  }, function (next) {
-    var config = app.set('config')
-      , tzoffset
-      ;
-
-
-    app.set('mailer', require('./lib/util/mailer')(app));
-
-    models = require('./lib/models')(app);
-    models.Config = configModel;
-
-    // configure application
-    app.use(function(req, res, next) {
-      var now = new Date()
-        , fbparams = {}
-        , baseUrl
-        , config = app.set('config');
-
-      tzoffset = -(config.crowi['app:timezone'] || 9) * 60; // for datez
-      app.set('tzoffset', tzoffset);
-
-      req.config = config;
-
-      config.crowi['app:url'] = baseUrl = (req.headers['x-forwarded-proto'] == 'https' ? 'https' : req.protocol) + '://' + req.get('host');
-
-      res.locals.req      = req;
-      res.locals.baseUrl  = baseUrl;
-      res.locals.config   = config;
-      res.locals.env      = app.get('env');
-      res.locals.now      = now;
-      res.locals.tzoffset = tzoffset;
-      res.locals.facebook = {appId: config.crowi['facebook:appId'] || ''};
-      res.locals.consts   = {
-          pageGrants: models.Page.getGrantLabels(),
-          userStatus: models.User.getUserStatusLabels(),
-          registrationMode: models.Config.getRegistrationModeLabels(),
-      };
-
-      next();
-    });
-
-    app.use(function(req, res, next) {
-      if (config.crowi['security:basicName'] && config.crowi['security:basicSecret']) {
-        return basicAuth(
-          config.crowi['security:basicName'],
-          config.crowi['security:basicSecret'])(req, res, next);
-      } else {
-        next();
-      }
-    });
-
-    app.use(function(req, res, next) {
-      var config = app.set('config');
-      if (config.crowi['facebook:appId'] && config.crowi['facebook:secret']) {
-        return facebook.middleware({
-          appId: config.crowi['facebook:appId'],
-          secret: config.crowi['facebook:secret']
-        })(req, res, next);
-      } else {
-        return next();
-      }
-    });
-
-    // register swig function
-    app.use(middleware.swigFilters(app, swig));
-    app.use(middleware.swigFunctions(app));
-
-    app.use(middleware.loginChecker(app, models));
-
-    next();
-  }, function(next) {
-
-    if (env == 'development') {
-      swig.setDefaults({ cache: false });
-      app.use(errorHandler({ dumpExceptions: true, showStack: true }));
-      app.use(morgan('dev'));
-
-      server = http.createServer(app).listen(app.get('port'), function(){
-        console.log('[' + app.get('env') + '] Express server listening on port ' + app.get('port'));
-      });
-    }
-
-    if (env == 'production') {
-      var oneYear = 31557600000;
-      app.use(morgan('combined'));
-      app.use(function (err, req, res, next) {
-        res.status(500);
-        res.render('500', { error: err });
-      });
-
-      server = http.createServer(app).listen(app.get('port'), function(){
-        console.log('[' + app.get('env') + '] Express server listening on port ' + app.get('port'));
-      });
-    }
-
-    require('./lib/routes')(app);
-
-    var io = require('socket.io')(server);
-    io.sockets.on('connection', function (socket) {
-    });
-
-    app.set('io', io);
-
-    next();
-  }
-]);
+crowi.init()
+  .then(function(app) {
+    crowi.start(app);
+  }).catch(crowi.exitOnError);
 

+ 115 - 0
lib/crowi/express-init.js

@@ -0,0 +1,115 @@
+'use strict';
+
+module.exports = function(crowi, app) {
+  var express        = require('express')
+    , bodyParser     = require('body-parser')
+    , multer         = require('multer')
+    , morgan         = require('morgan')
+    , cookieParser   = require('cookie-parser')
+    , methodOverride = require('method-override')
+    , errorHandler   = require('errorhandler')
+    , session        = require('express-session')
+    , basicAuth      = require('basic-auth-connect')
+    , flash          = require('connect-flash')
+    , cons           = require('consolidate')
+    , swig           = require('swig')
+    , env            = crowi.node_env
+    , middleware     = require('../util/middlewares')
+    ;
+
+  app.use(function(req, res, next) {
+    var now = new Date()
+      , fbparams = {}
+      , baseUrl
+      , config = crowi.getConfig()
+      , tzoffset = -(config.crowi['app:timezone'] || 9) * 60 // for datez
+      , Page = crowi.model('Page')
+      , User = crowi.model('User')
+      , Config = crowi.model('Config')
+      ;
+
+    app.set('tzoffset', tzoffset);
+
+    req.config = config;
+
+    config.crowi['app:url'] = baseUrl = (req.headers['x-forwarded-proto'] == 'https' ? 'https' : req.protocol) + '://' + req.get('host');
+
+    res.locals.req      = req;
+    res.locals.baseUrl  = baseUrl;
+    res.locals.config   = config;
+    res.locals.env      = env;
+    res.locals.now      = now;
+    res.locals.tzoffset = tzoffset;
+    res.locals.facebook = {appId: config.crowi['facebook:appId'] || ''};
+    res.locals.consts   = {
+        pageGrants: Page.getGrantLabels(),
+        userStatus: User.getUserStatusLabels(),
+        registrationMode: Config.getRegistrationModeLabels(),
+    };
+
+    next();
+  });
+
+  // Set basic auth middleware
+  app.use(function(req, res, next) {
+    var config = crowi.getConfig();
+
+    if (config.crowi['security:basicName'] && config.crowi['security:basicSecret']) {
+      return basicAuth(
+        config.crowi['security:basicName'],
+        config.crowi['security:basicSecret'])(req, res, next);
+    } else {
+      next();
+    }
+  });
+
+  // Register Facebook middleware
+  app.use(function(req, res, next) {
+    var config = crowi.getConfig()
+      , facebook = require('facebook-node-sdk')
+      ;
+
+    if (config.crowi['facebook:appId'] && config.crowi['facebook:secret']) {
+      return facebook.middleware({
+        appId: config.crowi['facebook:appId'],
+        secret: config.crowi['facebook:secret']
+      })(req, res, next);
+    } else {
+      return next();
+    }
+  });
+
+  app.set('port', crowi.port);
+  app.use(express.static(crowi.publicDir));
+  app.engine('html', cons.swig);
+  app.set('view cache', false);
+  app.set('view engine', 'html');
+  app.set('views', crowi.viewsDir);
+  app.use(methodOverride());
+  app.use(bodyParser.urlencoded({ extended: true }));
+  app.use(bodyParser.json());
+  app.use(cookieParser());
+  app.use(multer());
+  app.use(session(crowi.sessionConfig));
+  app.use(flash());
+
+  app.use(middleware.swigFilters(app, swig));
+  app.use(middleware.swigFunctions(crowi, app));
+
+  app.use(middleware.loginChecker(crowi, app));
+
+  if (env == 'development') {
+    swig.setDefaults({ cache: false });
+    app.use(errorHandler({ dumpExceptions: true, showStack: true }));
+    app.use(morgan('dev'));
+  }
+
+  if (env == 'production') {
+    var oneYear = 31557600000;
+    app.use(morgan('combined'));
+    app.use(function (err, req, res, next) {
+      res.status(500);
+      res.render('500', { error: err });
+    });
+  }
+};

+ 218 - 0
lib/crowi/index.js

@@ -0,0 +1,218 @@
+'use strict';
+
+
+var debug = require('debug')('crowi:crowi')
+  , pkg = require('../../package.json')
+  , path = require('path')
+  , sep = path.sep
+  , Promise = require('bluebird')
+
+  , http     = require('http')
+  , express  = require('express')
+
+  , mongoose    = require('mongoose')
+
+  , models = require('../models')
+  ;
+
+function Crowi (rootdir, env)
+{
+  var self = this;
+
+  this.version = pkg.version;
+
+  this.rootDir   = rootdir;
+  this.pluginDir = path.join(this.rootDir, 'node_modules') + sep;
+  this.publicDir = path.join(this.rootDir, 'public') + sep;
+  this.libDir    = path.join(this.rootDir, 'lib') + sep;
+  this.viewsDir  = path.join(this.libDir, 'views') + sep;
+  this.mailDir   = path.join(this.viewsDir, 'mail') + sep;
+
+  this.config = {};
+  this.mailer = {};
+
+  this.models = {};
+
+  this.env = env;
+  this.node_env = this.env.NODE_ENV || 'development';
+  this.port = this.env.PORT || 3000;
+
+  if (this.node_env == 'development') {
+    Promise.longStackTraces();
+  }
+
+  //time.tzset('Asia/Tokyo');
+};
+
+Crowi.prototype.init = function() {
+  var self = this;
+
+  return new Promise.resolve()
+  .then(function() {
+    // setup database server and load all modesl
+    return self.setupDatabase();
+  }).then(function() {
+    return self.setupModels();
+  }).then(function() {
+    return self.setupSessionConfig();
+  }).then(function() {
+    return new Promise(function(resolve, reject) {
+      self.model('Config', require('../models/config')(self));
+      var Config = self.model('Config');
+      Config.loadAllConfig(function(err, doc) {
+        if (err) {
+          return reject();
+        }
+        self.setConfig(doc);
+        return resolve();
+      });
+    });
+  }).then(function() {
+    return self.setupMailer();
+  }).then(function() {
+    return self.buildServer();
+  });
+}
+
+Crowi.prototype.setConfig = function(config) {
+  this.config = config;
+};
+
+Crowi.prototype.getConfig = function() {
+  return this.config;
+};
+
+// getter/setter of model instance
+//
+Crowi.prototype.model = function(name, model) {
+  if (model) {
+    return this.models[name] = model;
+  }
+
+  return this.models[name];
+};
+
+Crowi.prototype.setupDatabase = function() {
+  // mongoUri = mongodb://user:password@host/dbname
+  var mongoUri = this.env.MONGOLAB_URI ||
+    this.env.MONGOHQ_URL ||
+    this.env.MONGO_URI ||
+    'mongodb://localhost/crowi'
+    ;
+
+  return new Promise(function(resolve, reject) {
+    mongoose.connect(mongoUri, function(e) {
+      if (e) {
+        debug('DB Connect Error: ', mongoUri);
+        return reject(new Error('Cann\'t connect to Database Server.'));
+      }
+      return resolve();
+    });
+  });
+};
+
+Crowi.prototype.setupSessionConfig = function() {
+  var self = this
+    , session  = require('express-session')
+    , sessionConfig
+    , sessionAge = (1000*3600*24*30)
+    , redisUrl = this.env.REDISTOGO_URL || this.env.REDIS_URL || null
+    , RedisStore
+    ;
+
+  return new Promise(function(resolve, reject) {
+    sessionConfig = {
+      rolling: true,
+      secret: self.env.SECRET_TOKEN || 'this is default session secret',
+      resave: false,
+      saveUninitialized: true,
+      cookie: {
+        maxAge: sessionAge,
+      },
+    };
+
+    if (redisUrl) {
+      var ru   = require('url').parse(redisUrl);
+      var redis = require('redis');
+      var redisClient = redis.createClient(ru.port, ru.hostname);
+      if (ru.auth) {
+        redisClient.auth(ru.auth.split(':')[1]);
+      }
+
+      RedisStore = require('connect-redis')(session);
+      sessionConfig.store = new RedisStore({
+        prefix: 'crowi:sess:',
+        client: redisClient,
+      });
+    }
+
+    self.sessionConfig = sessionConfig;
+    resolve();
+  });
+};
+
+Crowi.prototype.setupModels = function() {
+  var self = this
+    ;
+
+  return new Promise(function(resolve, reject) {
+    Object.keys(models).forEach(function(key) {
+      self.model(key, models[key](self));
+    });
+    resolve();
+  });
+};
+
+Crowi.prototype.getIo = function() {
+  return this.io;
+};
+
+Crowi.prototype.getMailer = function() {
+  return this.mailer;
+};
+
+Crowi.prototype.setupMailer = function() {
+  var self = this;
+  return new Promise(function(resolve, reject) {
+    self.mailer = require('../util/mailer')(self);
+    resolve();
+  });
+};
+
+
+Crowi.prototype.start = function(app) {
+  var self = this
+    , server
+    , io;
+
+  server = http.createServer(app).listen(self.port, function() {
+    console.log('[' + self.node_env + '] Express server listening on port ' + self.port);
+  });
+
+  io = require('socket.io')(server);
+  io.sockets.on('connection', function (socket) {
+  });
+  this.io = io;
+};
+
+Crowi.prototype.buildServer = function() {
+  var app            = express()
+    , env            = this.node_env
+    , sessionConfig  = this.setupSessionConfig();
+    ;
+
+  require('./express-init')(this, app);
+  require('../routes')(this, app);
+
+  return new Promise.resolve(app);
+};
+
+Crowi.prototype.exitOnError = function(err) {
+  debug('Critical error occured.');
+  console.error(err);
+  console.error(err.stack);
+  process.exit(1);
+};
+
+
+module.exports = Crowi;

+ 4 - 6
lib/models/bookmark.js

@@ -1,6 +1,6 @@
-module.exports = function(app, models) {
-  var mongoose = require('mongoose')
-    , debug = require('debug')('crowi:models:bookmark')
+module.exports = function(crowi) {
+  var debug = require('debug')('crowi:models:bookmark')
+    , mongoose = require('mongoose')
     , ObjectId = mongoose.Schema.Types.ObjectId
     , bookmarkSchema;
 
@@ -52,7 +52,5 @@ module.exports = function(app, models) {
     // To be implemented ...
   };
 
-  models.Bookmark = mongoose.model('Bookmark', bookmarkSchema);
-
-  return models.Bookmark;
+  return mongoose.model('Bookmark', bookmarkSchema);
 };

+ 3 - 3
lib/models/config.js

@@ -1,4 +1,4 @@
-module.exports = function(app) {
+module.exports = function(crowi) {
   var mongoose = require('mongoose')
     , debug = require('debug')('crowi:models:config')
     , ObjectId = mongoose.Schema.Types.ObjectId
@@ -58,7 +58,7 @@ module.exports = function(app) {
 
   configSchema.statics.updateConfigCache = function(ns, config)
   {
-    var originalConfig = app.set('config');
+    var originalConfig = crowi.getConfig();
     var newNSConfig = originalConfig[ns] || {};
     Object.keys(config).forEach(function (key) {
       if (config[key] || config[key] === '') {
@@ -67,7 +67,7 @@ module.exports = function(app) {
     });
 
     originalConfig[ns] = newNSConfig;
-    app.set('config', originalConfig);
+    crowi.setConfig(originalConfig);
   };
 
   // Execute only once for installing application

+ 5 - 11
lib/models/index.js

@@ -1,12 +1,6 @@
-module.exports = function(app) {
-  var models = {};
-
-  require('./page')(app, models);
-  require('./user')(app, models);
-  require('./revision')(app, models);
-  require('./bookmark')(app, models);
-
-  app.set('models', models);
-
-  return models;
+module.exports = {
+  Page: require('./page'),
+  User: require('./user'),
+  Revision: require('./revision'),
+  Bookmark: require('./bookmark'),
 };

+ 23 - 15
lib/models/page.js

@@ -1,6 +1,6 @@
-module.exports = function(app, models) {
-  var mongoose = require('mongoose')
-    , debug = require('debug')('crowi:models:page')
+module.exports = function(crowi) {
+  var debug = require('debug')('crowi:models:page')
+    , mongoose = require('mongoose')
     , ObjectId = mongoose.Schema.Types.ObjectId
     , GRANT_PUBLIC = 1
     , GRANT_RESTRICTED = 2
@@ -10,6 +10,8 @@ module.exports = function(app, models) {
     , pageSchema;
 
   function populatePageData(pageData, revisionId, callback) {
+    var Page = crowi.model('Page');
+
     if (revisionId) {
       pageData.revision = revisionId;
     }
@@ -24,7 +26,7 @@ module.exports = function(app, models) {
       {path: 'liker', options: { limit: 11 }},
       {path: 'seenUsers', options: { limit: 11 }},
     ], function (err, pageData) {
-      models.Page.populate(pageData, {path: 'revision.author', model: 'User'}, callback);
+      Page.populate(pageData, {path: 'revision.author', model: 'User'}, callback);
     });
   }
 
@@ -92,7 +94,9 @@ module.exports = function(app, models) {
   };
 
   pageSchema.methods.like = function(userData, callback) {
-    var self = this;
+    var self = this,
+      Page = self;
+
     if (undefined === this.populated('liker')) {
       var added = this.liker.addToSet(userData._id);
       if (added.length > 0) {
@@ -105,7 +109,7 @@ module.exports = function(app, models) {
         return callback(null, this);
       }
     } else {
-      models.Page.update(
+      Page.update(
         {_id: self._id},
         { $addToSet: { liker:  userData._id }},
         function(err, numAffected, raw) {
@@ -117,7 +121,9 @@ module.exports = function(app, models) {
   };
 
   pageSchema.methods.unlike = function(userData, callback) {
-    var self = this;
+    var self = this,
+      Page = self;
+
     if (undefined === this.populated('liker')) {
       var removed = this.liker.pull(userData._id);
       if (removed.length > 0) {
@@ -130,7 +136,7 @@ module.exports = function(app, models) {
         callback(null, this);
       }
     } else {
-      models.Page.update(
+      Page.update(
         {_id: self._id},
         { $pull: { liker:  userData._id }},
         function(err, numAffected, raw) {
@@ -142,7 +148,9 @@ module.exports = function(app, models) {
   };
 
   pageSchema.methods.seen = function(userData, callback) {
-    var self = this;
+    var self = this,
+      Page = self;
+
     if (undefined === this.populated('seenUsers')) {
       var added = this.seenUsers.addToSet(userData._id);
       if (added.length > 0) {
@@ -155,7 +163,7 @@ module.exports = function(app, models) {
         return callback(null, this);
       }
     } else {
-      models.Page.update(
+      Page.update(
         {_id: self._id},
         { $addToSet: { seenUsers:  userData._id }},
         function(err, numAffected, raw) {
@@ -356,6 +364,7 @@ module.exports = function(app, models) {
 
   pageSchema.statics.create = function(path, body, user, options, cb) {
     var Page = this
+      , Revision = crowi.model('Revision')
       , format = options.format || 'markdown'
       , redirectTo = options.redirectTo || null;
 
@@ -373,7 +382,7 @@ module.exports = function(app, models) {
       newPage.redirectTo = redirectTo;
       newPage.save(function (err, newPage) {
 
-        var newRevision = models.Revision.prepareRevision(newPage, body, user, {format: format});
+        var newRevision = Revision.prepareRevision(newPage, body, user, {format: format});
         Page.pushRevision(newPage, newRevision, user, function(err, data) {
           if (err) {
             console.log('Push Revision Error on create page', err);
@@ -387,6 +396,7 @@ module.exports = function(app, models) {
 
   pageSchema.statics.rename = function(pageData, newPageName, user, options, cb) {
     var Page = this
+      , Revision = crowi.model('Revision')
       , path = pageData.path
       , createRedirectPage = options.createRedirectPage || 0
       , moveUnderTrees     = options.moveUnderTrees || 0;
@@ -398,7 +408,7 @@ module.exports = function(app, models) {
       }
 
       // reivisions の path を変更
-      models.Revision.updateRevisionListByPath(path, {path: newPageName}, {}, function(err, data) {
+      Revision.updateRevisionListByPath(path, {path: newPageName}, {}, function(err, data) {
         if (err) {
           return cb(err, null);
         }
@@ -427,7 +437,5 @@ module.exports = function(app, models) {
   pageSchema.statics.GRANT_OWNER = GRANT_OWNER;
   pageSchema.statics.PAGE_GRANT_ERROR = PAGE_GRANT_ERROR;
 
-  models.Page = mongoose.model('Page', pageSchema);
-
-  return models.Page;
+  return mongoose.model('Page', pageSchema);
 };

+ 4 - 5
lib/models/revision.js

@@ -1,5 +1,6 @@
-module.exports = function(app, models) {
-  var mongoose = require('mongoose')
+module.exports = function(crowi) {
+  var debug = require('debug')('crowi:models:revision')
+    , mongoose = require('mongoose')
     , ObjectId = mongoose.Schema.Types.ObjectId
     , revisionSchema;
 
@@ -68,7 +69,5 @@ module.exports = function(app, models) {
   revisionSchema.statics.updatePath = function(pathName) {
   };
 
-  models.Revision = mongoose.model('Revision', revisionSchema);
-
-  return models.Revision;
+  return mongoose.model('Revision', revisionSchema);
 };

+ 13 - 11
lib/models/user.js

@@ -1,12 +1,10 @@
-module.exports = function(app, models) {
-  var mongoose = require('mongoose')
+module.exports = function(crowi) {
+  var debug = require('debug')('crowi:models:user')
+    , mongoose = require('mongoose')
     , mongoosePaginate = require('mongoose-paginate')
-    , debug = require('debug')('crowi:models:user')
     , crypto = require('crypto')
     , async = require('async')
-    , config = app.set('config')
     , ObjectId = mongoose.Schema.Types.ObjectId
-    , mailer = app.set('mailer')
 
     , STATUS_REGISTERED = 1
     , STATUS_ACTIVE     = 2
@@ -34,7 +32,8 @@ module.exports = function(app, models) {
   userSchema.plugin(mongoosePaginate);
 
   function decideUserStatusOnRegistration () {
-    var Config = models.Config;
+    var Config = crowi.model('Config'),
+      config = crowi.getConfig();
 
     // status decided depends on registrationMode
     switch (config.crowi['security:registrationMode']) {
@@ -214,7 +213,9 @@ module.exports = function(app, models) {
   };
 
   userSchema.statics.isEmailValid = function(email, callback) {
-    var whitelist = config.crowi['security:registrationWhiteList'];
+    var config = crowi.getConfig()
+      , whitelist = config.crowi['security:registrationWhiteList'];
+
     if (Array.isArray(whitelist) && whitelist.length > 0) {
       return config.crowi['security:registrationWhiteList'].some(function(allowedEmail) {
         var re = new RegExp(allowedEmail + '$');
@@ -348,7 +349,10 @@ module.exports = function(app, models) {
 
   userSchema.statics.createUsersByInvitation = function(emailList, toSendEmail, callback) {
     var User = this
-      , createdUserList = [];
+      , createdUserList = []
+      , config = crowi.getConfig()
+      , mailer = crowi.getMailer()
+      ;
 
     if (!Array.isArray(emailList)) {
       debug('emailList is not array');
@@ -493,7 +497,5 @@ module.exports = function(app, models) {
   userSchema.statics.STATUS_DELETED = STATUS_DELETED;
   userSchema.statics.STATUS_INVITED = STATUS_INVITED;
 
-  models.User = mongoose.model('User', userSchema);
-
-  return models.User;
+  return mongoose.model('User', userSchema);
 };

+ 3 - 3
lib/routes/admin.js

@@ -1,8 +1,8 @@
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   'use strict';
 
   var debug = require('debug')('crowi:routes:admin')
-    , models = app.set('models')
+    , models = crowi.models
     , Page = models.Page
     , User = models.User
     , Config = models.Config
@@ -228,7 +228,7 @@ module.exports = function(app) {
 
   function validateMailSetting(req, form, callback)
   {
-    var mailer = app.set('mailer');
+    var mailer = crowi.mailer;
     var option = {
       host: form['mail:smtpHost'],
       port: form['mail:smtpPort'],

+ 47 - 45
lib/routes/index.js

@@ -1,15 +1,17 @@
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   var middleware = require('../util/middlewares')
     , form      = require('../form')
-    , page      = require('./page')(app)
-    , login     = require('./login')(app)
-    , logout    = require('./logout')(app)
-    , me        = require('./me')(app)
-    , admin     = require('./admin')(app)
-    , installer = require('./installer')(app)
-    , user      = require('./user')(app);
+    , page      = require('./page')(crowi, app)
+    , login     = require('./login')(crowi, app)
+    , logout    = require('./logout')(crowi, app)
+    , me        = require('./me')(crowi, app)
+    , admin     = require('./admin')(crowi, app)
+    , installer = require('./installer')(crowi, app)
+    , user      = require('./user')(crowi, app)
+    , loginRequired = middleware.loginRequired
+    ;
 
-  app.get('/'                        , middleware.loginRequired(app) , page.pageListShow);
+  app.get('/'                        , loginRequired(crowi, app) , page.pageListShow);
 
   app.get('/installer'               , middleware.applicationNotInstalled() , installer.index);
   app.post('/installer/createAdmin'  , middleware.applicationNotInstalled() , form.register , installer.createAdmin);
@@ -28,50 +30,50 @@ module.exports = function(app) {
   app.get('/login/facebook'          , login.loginFacebook);
   app.get('/logout'                  , logout.logout);
 
-  app.get('/admin'                      , middleware.loginRequired(app) , middleware.adminRequired() , admin.index);
-  app.get('/admin/app'                  , middleware.loginRequired(app) , middleware.adminRequired() , admin.app.index);
-  app.post('/_api/admin/settings/app'   , middleware.loginRequired(app) , middleware.adminRequired() , form.admin.app, admin.api.appSetting);
-  app.post('/_api/admin/settings/sec'   , middleware.loginRequired(app) , middleware.adminRequired() , form.admin.sec, admin.api.appSetting);
-  app.post('/_api/admin/settings/mail'  , middleware.loginRequired(app) , middleware.adminRequired() , form.admin.mail, admin.api.appSetting);
-  app.post('/_api/admin/settings/aws'   , middleware.loginRequired(app) , middleware.adminRequired() , form.admin.aws, admin.api.appSetting);
-  app.post('/_api/admin/settings/google', middleware.loginRequired(app) , middleware.adminRequired() , form.admin.google, admin.api.appSetting);
-  app.post('/_api/admin/settings/fb'    , middleware.loginRequired(app) , middleware.adminRequired() , form.admin.fb
+  app.get('/admin'                      , loginRequired(crowi, app) , middleware.adminRequired() , admin.index);
+  app.get('/admin/app'                  , loginRequired(crowi, app) , middleware.adminRequired() , admin.app.index);
+  app.post('/_api/admin/settings/app'   , loginRequired(crowi, app) , middleware.adminRequired() , form.admin.app, admin.api.appSetting);
+  app.post('/_api/admin/settings/sec'   , loginRequired(crowi, app) , middleware.adminRequired() , form.admin.sec, admin.api.appSetting);
+  app.post('/_api/admin/settings/mail'  , loginRequired(crowi, app) , middleware.adminRequired() , form.admin.mail, admin.api.appSetting);
+  app.post('/_api/admin/settings/aws'   , loginRequired(crowi, app) , middleware.adminRequired() , form.admin.aws, admin.api.appSetting);
+  app.post('/_api/admin/settings/google', loginRequired(crowi, app) , middleware.adminRequired() , form.admin.google, admin.api.appSetting);
+  app.post('/_api/admin/settings/fb'    , loginRequired(crowi, app) , middleware.adminRequired() , form.admin.fb
   , admin.api.appSetting);
 
-  app.get('/admin/users'                , middleware.loginRequired(app) , middleware.adminRequired() , admin.user.index);
-  app.post('/admin/user/invite'         , form.admin.userInvite ,  middleware.loginRequired(app) , middleware.adminRequired() , admin.user.invite);
-  app.post('/admin/user/:id/makeAdmin'  , middleware.loginRequired(app) , middleware.adminRequired() , admin.user.makeAdmin);
-  app.post('/admin/user/:id/removeFromAdmin', middleware.loginRequired(app) , middleware.adminRequired() , admin.user.removeFromAdmin);
-  app.post('/admin/user/:id/activate'   , middleware.loginRequired(app) , middleware.adminRequired() , admin.user.activate);
-  app.post('/admin/user/:id/suspend'    , middleware.loginRequired(app) , middleware.adminRequired() , admin.user.suspend);
-  app.post('/admin/user/:id/remove'     , middleware.loginRequired(app) , middleware.adminRequired() , admin.user.remove);
-  app.post('/admin/user/:id/removeCompletely' , middleware.loginRequired(app) , middleware.adminRequired() , admin.user.removeCompletely);
+  app.get('/admin/users'                , loginRequired(crowi, app) , middleware.adminRequired() , admin.user.index);
+  app.post('/admin/user/invite'         , form.admin.userInvite ,  loginRequired(crowi, app) , middleware.adminRequired() , admin.user.invite);
+  app.post('/admin/user/:id/makeAdmin'  , loginRequired(crowi, app) , middleware.adminRequired() , admin.user.makeAdmin);
+  app.post('/admin/user/:id/removeFromAdmin', loginRequired(crowi, app) , middleware.adminRequired() , admin.user.removeFromAdmin);
+  app.post('/admin/user/:id/activate'   , loginRequired(crowi, app) , middleware.adminRequired() , admin.user.activate);
+  app.post('/admin/user/:id/suspend'    , loginRequired(crowi, app) , middleware.adminRequired() , admin.user.suspend);
+  app.post('/admin/user/:id/remove'     , loginRequired(crowi, app) , middleware.adminRequired() , admin.user.remove);
+  app.post('/admin/user/:id/removeCompletely' , loginRequired(crowi, app) , middleware.adminRequired() , admin.user.removeCompletely);
 
-  app.get('/me'                      , middleware.loginRequired(app) , me.index);
-  app.get('/me/password'             , middleware.loginRequired(app) , me.password);
-  app.post('/me'                     , form.me.user               , middleware.loginRequired(app) , me.index);
-  app.post('/me/password'            , form.me.password           , middleware.loginRequired(app) , me.password);
-  app.post('/me/picture/delete'      , middleware.loginRequired(app) , me.deletePicture);
-  app.post('/me/auth/facebook'       , middleware.loginRequired(app) , me.authFacebook);
-  app.post('/me/auth/google'         , middleware.loginRequired(app) , me.authGoogle);
-  app.get('/me/auth/google/callback' , middleware.loginRequired(app) , me.authGoogleCallback);
+  app.get('/me'                      , loginRequired(crowi, app) , me.index);
+  app.get('/me/password'             , loginRequired(crowi, app) , me.password);
+  app.post('/me'                     , form.me.user               , loginRequired(crowi, app) , me.index);
+  app.post('/me/password'            , form.me.password           , loginRequired(crowi, app) , me.password);
+  app.post('/me/picture/delete'      , loginRequired(crowi, app) , me.deletePicture);
+  app.post('/me/auth/facebook'       , loginRequired(crowi, app) , me.authFacebook);
+  app.post('/me/auth/google'         , loginRequired(crowi, app) , me.authGoogle);
+  app.get('/me/auth/google/callback' , loginRequired(crowi, app) , me.authGoogleCallback);
 
-  app.get('/:id([0-9a-z]{24})'       , middleware.loginRequired(app) , page.api.redirector);
-  app.get('/_r/:id([0-9a-z]{24})'    , middleware.loginRequired(app) , page.api.redirector); // alias
+  app.get('/:id([0-9a-z]{24})'       , loginRequired(crowi, app) , page.api.redirector);
+  app.get('/_r/:id([0-9a-z]{24})'    , loginRequired(crowi, app) , page.api.redirector); // alias
   app.get('/_api/check_username'     , user.api.checkUsername);
-  app.post('/_api/me/picture/upload' , middleware.loginRequired(app) , me.api.uploadPicture);
-  app.get('/_api/user/bookmarks'     , middleware.loginRequired(app) , user.api.bookmarks);
-  app.post('/_api/page_rename/*'     , middleware.loginRequired(app) , page.api.rename);
-  app.post('/_api/page/:id/like'     , middleware.loginRequired(app) , page.api.like);
-  app.post('/_api/page/:id/unlike'   , middleware.loginRequired(app) , page.api.unlike);
-  app.get('/_api/page/:id/bookmark'  , middleware.loginRequired(app) , page.api.isBookmarked);
-  app.post('/_api/page/:id/bookmark' , middleware.loginRequired(app) , page.api.bookmark);
+  app.post('/_api/me/picture/upload' , loginRequired(crowi, app) , me.api.uploadPicture);
+  app.get('/_api/user/bookmarks'     , loginRequired(crowi, app) , user.api.bookmarks);
+  app.post('/_api/page_rename/*'     , loginRequired(crowi, app) , page.api.rename);
+  app.post('/_api/page/:id/like'     , loginRequired(crowi, app) , page.api.like);
+  app.post('/_api/page/:id/unlike'   , loginRequired(crowi, app) , page.api.unlike);
+  app.get('/_api/page/:id/bookmark'  , loginRequired(crowi, app) , page.api.isBookmarked);
+  app.post('/_api/page/:id/bookmark' , loginRequired(crowi, app) , page.api.bookmark);
   //app.get('/_api/page/*'           , user.useUserData()         , page.api.get);
   //app.get('/_api/revision/:id'     , user.useUserData()         , revision.api.get);
   //app.get('/_api/r/:revisionId'    , user.useUserData()         , page.api.get);
 
-  app.post('/*/edit'                 , form.revision              , middleware.loginRequired(app) , page.pageEdit);
-  app.get('/*/$'                     , middleware.loginRequired(app) , page.pageListShow);
-  app.get('/*'                       , middleware.loginRequired(app) , page.pageShow);
+  app.post('/*/edit'                 , form.revision              , loginRequired(crowi, app) , page.pageEdit);
+  app.get('/*/$'                     , loginRequired(crowi, app) , page.pageListShow);
+  app.get('/*'                       , loginRequired(crowi, app) , page.pageShow);
   //app.get('/*/edit'                , routes.edit);
 };

+ 2 - 2
lib/routes/installer.js

@@ -1,8 +1,8 @@
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   'use strict';
 
   var debug = require('debug')('crowi:routes:installer')
-    , models = app.set('models')
+    , models = crowi.models
     , Config = models.Config
     , User = models.User
 

+ 7 - 8
lib/routes/login.js

@@ -1,16 +1,15 @@
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   'use strict';
 
   var googleapis = require('googleapis')
     , debug = require('debug')('crowi:routes:login')
     , async    = require('async')
-    , models = app.set('models')
-    , config = app.set('config')
-    , mailer = app.set('mailer')
-    , Page = models.Page
-    , User = models.User
-    , Config = models.Config
-    , Revision = models.Revision
+    , config = crowi.getConfig()
+    , mailer = crowi.getMailer()
+    , Page = crowi.model('Page')
+    , User = crowi.model('User')
+    , Config = crowi.model('Config')
+    , Revision = crowi.model('Revision')
     , actions = {};
 
   var loginSuccess = function(req, res, userData) {

+ 1 - 1
lib/routes/logout.js

@@ -1,4 +1,4 @@
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   return {
     logout: function(req, res) {
 

+ 18 - 4
lib/routes/me.js

@@ -1,19 +1,25 @@
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   'use strict';
 
   var debug = require('debug')('crowi:routes:me')
     , fs = require('fs')
-    , models = app.set('models')
+    , models = crowi.models
+    , config = crowi.getConfig()
     , Page = models.Page
     , User = models.User
     , Revision = models.Revision
+    //, pluginService = require('../service/plugin')
     , actions = {}
-    , api = {};
+    , api = {}
+    ;
 
   actions.api = api;
 
   api.uploadPicture = function (req, res) {
-    var fileUploader = require('../util/fileUploader')(app);
+    var fileUploader = require('../util/fileUploader')(crowi, app);
+    //var storagePlugin = new pluginService('storage');
+    //var storage = require('../service/storage').StorageService(config);
+
     var tmpFile = req.files.userPicture || null;
     if (!tmpFile) {
       return res.json({
@@ -33,6 +39,14 @@ module.exports = function(app) {
       });
     }
 
+    //debug('tmpFile Is', tmpFile, tmpFile.constructor, tmpFile.prototype);
+    //var imageUrl = storage.writeSync(storage.tofs(tmpFile), filePath, {mime: tmpFile.mimetype});
+    //return return res.json({
+    //  'status': true,
+    //  'url': imageUrl,
+    //  'message': '',
+    //});
+
     fileUploader.uploadFile(
       filePath,
       tmpFile.mimetype,

+ 6 - 7
lib/routes/page.js

@@ -1,12 +1,11 @@
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   'use strict';
 
   var debug = require('debug')('crowi:routes:page')
-    , models = app.set('models')
-    , Page = models.Page
-    , User = models.User
-    , Revision = models.Revision
-    , Bookmark = models.Bookmark
+    , Page = crowi.model('Page')
+    , User = crowi.model('User')
+    , Revision = crowi.model('Revision')
+    , Bookmark = crowi.model('Bookmark')
     , actions = {};
 
   function getPathFromRequest(req) {
@@ -154,7 +153,7 @@ module.exports = function(app) {
         if (err) {
           console.log('Page save error:', err);
         }
-        app.set('io').sockets.emit('page edited', {page: data, user: req.user});
+        crowi.getIo().sockets.emit('page edited', {page: data, user: req.user});
 
         var redirectPath = encodeURI(path);
         if (grant != data.grant) {

+ 5 - 6
lib/routes/user.js

@@ -1,11 +1,10 @@
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   'use strict';
 
-   var models = app.set('models')
-    , Page = models.Page
-    , User = models.User
-    , Revision = models.Revision
-    , Bookmark = models.Bookmark
+   var Page = crowi.model('Page')
+    , User = crowi.model('User')
+    , Revision = crowi.model('Revision')
+    , Bookmark = crowi.model('Bookmark')
     , actions = {}
     , api = {};
 

+ 2 - 2
lib/util/fileUploader.js

@@ -3,12 +3,12 @@
  */
 
 
-module.exports = function(app) {
+module.exports = function(crowi, app) {
   'use strict';
 
   var aws = require('aws-sdk')
     , debug = require('debug')('crowi:lib:fileUploader')
-    , config = app.set('config')
+    , config = crowi.getConfig()
     , lib = {}
     ;
 

+ 3 - 3
lib/util/mailer.js

@@ -2,16 +2,16 @@
  * mailer
  */
 
-module.exports = function(app) {
+module.exports = function(crowi) {
   'use strict';
 
   var debug = require('debug')('crowi:lib:mailer')
     , nodemailer = require('nodemailer')
     , swig = require('swig')
-    , config = app.set('config')
+    , config = crowi.getConfig()
     , mailConfig = {}
     , mailer = {}
-    , MAIL_TEMPLATE_DIR = app.set('views') + '/mail/'
+    , MAIL_TEMPLATE_DIR = crowi.mailDir
     ;
 
 

+ 12 - 10
lib/util/middlewares.js

@@ -1,10 +1,12 @@
 var debug = require('debug')('crowi:lib:middlewares');
 
-exports.loginChecker = function(app, models) {
+exports.loginChecker = function(crowi, app) {
   return function(req, res, next) {
+    var User = crowi.model('User');
+
     // session に user object が入ってる
     if (req.session.user && '_id' in req.session.user) {
-      models.User.findById(req.session.user._id, function(err, userData) {
+      User.findById(req.session.user._id, function(err, userData) {
         if (err) {
           next();
         } else {
@@ -21,9 +23,9 @@ exports.loginChecker = function(app, models) {
   };
 };
 
-exports.swigFunctions = function(app) {
+exports.swigFunctions = function(crowi, app) {
   return function(req, res, next) {
-    require('../util/swigFunctions')(app, res.locals);
+    require('../util/swigFunctions')(crowi, app, res.locals);
     next();
   };
 };
@@ -80,19 +82,19 @@ exports.adminRequired = function() {
   };
 };
 
-exports.loginRequired = function(app) {
+exports.loginRequired = function(crowi, app) {
   return function(req, res, next) {
-    var models = app.set('models');
+    var User = crowi.model('User')
 
     if (req.user && '_id' in req.user) {
-      if (req.user.status === models.User.STATUS_ACTIVE) {
+      if (req.user.status === User.STATUS_ACTIVE) {
         // Active の人だけ先に進める
         return next();
-      } else if (req.user.status === models.User.STATUS_REGISTERED) {
+      } else if (req.user.status === User.STATUS_REGISTERED) {
         return res.redirect('/login/error/registered');
-      } else if (req.user.status === models.User.STATUS_SUSPENDED) {
+      } else if (req.user.status === User.STATUS_SUSPENDED) {
         return res.redirect('/login/error/suspended');
-      } else if (req.user.status === models.User.STATUS_INVITED) {
+      } else if (req.user.status === User.STATUS_INVITED) {
         return res.redirect('/login/invited');
       }
     }

+ 5 - 5
lib/util/swigFunctions.js

@@ -1,16 +1,16 @@
-module.exports = function(app, locals) {
+module.exports = function(crowi, app, locals) {
   var debug = require('debug')('crowi:lib:swigFunctions')
-    , models = app.set('models')
-    , Page = models.Page
-    , User = models.User
-    , config = app.set('config')
+    , Page = crowi.model('Page')
+    , User = crowi.model('User')
   ;
 
   locals.facebookLoginEnabled = function() {
+    var config = crowi.getConfig()
     return config.crowi['facebook:appId'] && config.crowi['facebook:secret'];
   };
 
   locals.googleLoginEnabled = function() {
+    var config = crowi.getConfig()
     return config.crowi['google:clientId'] && config.crowi['google:clientSecret'];
   };
 

+ 1 - 0
package.json

@@ -31,6 +31,7 @@
     "basic-auth-connect": "~1.0.0",
     "body-parser": "~1.12.0",
     "bower": "~1.4.0",
+    "bluebird": "^2.9.12",
     "cli": "~0.6.0",
     "connect-flash": "~0.1.1",
     "connect-redis": "~2.1.0",