app.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /**
  2. * Fakie::app.js
  3. *
  4. * @package Fakie
  5. * @author Sotaro KARASAWA <sotarok@crocos.co.jp>
  6. */
  7. var express = require('express');
  8. var cons = require('consolidate');
  9. var swig = require('swig');
  10. var flash = require('connect-flash');
  11. var config = require('config');
  12. var http = require('http');
  13. var facebook = require('facebook-node-sdk');
  14. var mongo = require('mongoose');
  15. var socketio = require('socket.io');
  16. var time = require('time');
  17. time.tzset('Asia/Tokyo');
  18. tzoffset = -(config.app.timezone || 9) * 60; // for datez
  19. var app = express();
  20. mongo.connect('mongodb://' + config.mongodb.user + ':' + config.mongodb.password + '@' + config.mongodb.host + '/' + config.mongodb.dbname);
  21. // swig
  22. // TODO どっかに移す
  23. swig.setFilter('path2name', function(string) {
  24. return string.replace(/.+\/(.+)?$/, "$1");
  25. });
  26. swig.setFilter('datetz', function(input, format) {
  27. // デフォルトの filter の override するにはどうしたらいいんだろうかね
  28. var swigFilters = require('swig/lib/filters')
  29. return swigFilters.date(input, format, tzoffset);
  30. });
  31. swig.setFilter('presentation', function(string) {
  32. // 手抜き
  33. return string.replace(/[\n]+#/g, "\n\n\n#");
  34. });
  35. swig.setFilter('picture', function(user) {
  36. if (!user) {
  37. return '';
  38. }
  39. user.fbId = user.userId; // migration
  40. if (user.image && user.image != '/images/userpicture.png') {
  41. return user.image;
  42. } else if (user.fbId) {
  43. return '//graph.facebook.com/' + user.fbId + '/picture?size=square';
  44. } else {
  45. return '/images/userpicture.png';
  46. }
  47. });
  48. app.configure(function(){
  49. var models;
  50. app.set('port', config.server.port || 3000);
  51. app.engine('html', cons.swig);
  52. app.set('view cache', false);
  53. app.set('view engine', 'html');
  54. app.set('views', __dirname + '/views');
  55. app.use(express.methodOverride());
  56. app.use(express.bodyParser());
  57. app.use(express.cookieParser());
  58. app.use(express.session({
  59. rolling: true,
  60. secret: config.session.secret,
  61. }));
  62. app.use(flash());
  63. app.use(facebook.middleware({appId: config.facebook.appId, secret: config.facebook.secret}));
  64. models = require('./models')(app);
  65. app.use(function(req, res, next) {
  66. var days = (1000*3600*24*30);
  67. req.session.cookie.expires = new Date(Date.now() + days);
  68. req.session.cookie.maxAge = days;
  69. var now = new Date();
  70. req.config = config;
  71. req.baseUrl = (req.headers['x-forwarded-proto'] == 'https' ? 'https' : req.protocol) + "://" + req.get('host');
  72. res.locals({
  73. req: req,
  74. baseUrl: req.baseUrl,
  75. config: config,
  76. env: app.get('env'),
  77. now: now,
  78. tzoffset: tzoffset,
  79. facebook: {appId: config.facebook.appId},
  80. consts: {
  81. pageGrants: models.Page.getGrantLabels(),
  82. userStatus: models.User.getUserStatusLabels(),
  83. },
  84. });
  85. next();
  86. });
  87. // register swig function
  88. app.use(function(req, res, next) {
  89. res.locals(require('./lib/swig_functions')(app));
  90. next();
  91. });
  92. app.use(function(req, res, next) {
  93. // session に user object が入ってる
  94. if (req.session.user && '_id' in req.session.user) {
  95. models.User.findById(req.session.user._id, function(err, userData) {
  96. if (err) {
  97. next()
  98. } else {
  99. req.user = req.session.user = userData;
  100. res.locals({user: req.user});
  101. next();
  102. }
  103. });
  104. } else {
  105. req.user = req.session.user = false;
  106. res.locals({user: req.user});
  107. next();
  108. }
  109. });
  110. app.use(express.static(__dirname + '/public'));
  111. app.use(app.router);
  112. });
  113. app.configure('development', function(){
  114. swig.setDefaults({ cache: false });
  115. app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  116. });
  117. app.configure('production', function(){
  118. var oneYear = 31557600000;
  119. // Error Handler
  120. app.use(function (err, req, res, next) {
  121. res.status(500);
  122. res.render('500', { error: err });
  123. });
  124. });
  125. var server = 1;
  126. if (app.get('env') == 'development') {
  127. server = http.createServer(app).listen(app.get('port'), function(){
  128. console.log("[" + app.get('env') + "] Express server listening on port " + app.get('port'));
  129. });
  130. } else {
  131. server = http.createServer(app).listen(app.get('port'), '127.0.0.1', function(){
  132. console.log("[" + app.get('env') + "] Express server listening on port " + app.get('port'));
  133. });
  134. }
  135. var io = socketio.listen(server);
  136. io.sockets.on('connection', function (socket) {
  137. });
  138. app.set('io', io);
  139. require('./routes')(app);