Example #1
0
var filename = 'worker-manager.js';

var taskman = require('node-taskman');
var config = require('./env/'+process.env.NODE_ENV+'.json') || {};
var logger = require('./helpers/logger');

var REDIS_PORT = config.redis.port;
var REDIS_HOST = config.redis.host;
var REDIS_PASS = config.redis.pass;

// Creo la cola para las tareas del worker
var queueName = 'queue';
var queue = taskman.createQueue(queueName, {
  redis: {
    port:REDIS_PORT,
    host:REDIS_HOST,
    'auth_pass': REDIS_PASS
    }
  });

exports.queue = queue;

function checkQueueLength() {
	queue.redis.llen('queue:queue', function(err, count) {
  	if(err) return logger.error(err, {source:filename});
		return logger.info("Queue ", {count:count});
  });
}

// Cada 5 minutos (300000) actualizo el estado de las colas
// setInterval(function() { checkQueueLength(); }, 60000);
Example #2
0
module.exports = function(config) {
  'use strict';

  var bcrypt = require('bcrypt-nodejs');
  var jwt = require('jsonwebtoken');  
  var VError = require('verror');
  var taskman = require('node-taskman');
  var emailQueue = taskman.createQueue('email', { redis: config.redis });

  var cerror = require('../config/cerror');
  var userService = require('../services/userService')(config);
  var ClientProvider = require('../models/authProvider').ClientProvider;
  var AccessTokenProvider = require('../models/authProvider').AccessTokenProvider;
  var RefreshTokenProvider = require('../models/authProvider').RefreshTokenProvider;
  var clientProvider = new ClientProvider();
  var accessTokenProvider = new AccessTokenProvider();
  var refreshTokenProvider = new RefreshTokenProvider();

  // ---------------------------------------------------------------
  // node-auth2-server model
  // ---------------------------------------------------------------
  var oAuthModel = {};
  oAuthModel.getClient = function(clientId, clientSecret, callback) {
    clientProvider.getClient(clientId, clientSecret)
      .then(function(client) {
        callback(null, client);
      })
      .catch(function(err) {
        callback(err);
      });
  }

  oAuthModel.grantTypeAllowed = function(clientId, grantType, callback) {
    if (grantType === 'password' || grantType === 'refresh_token') {
      callback(null, true);
    } else {
      callback(null, false);
    }
  }

  oAuthModel.getUser = function(username, password, callback) {
    userService.getUserWithPass(username, password)
      .then(function(user) {
        callback(null, user);
      })
      .catch(function(err) {
        if (err instanceof cerror.NotExistError /*username is not exist*/
          || err instanceof cerror.NotMatchError /*password is not matched*/) {
          callback(null, null);
        } else {
          callback(err);
        }
      });
  }

  oAuthModel.generateToken = function(type, req, callback) {
    // jwt 생성
    var userData = {
      username: req.body.username,
      type: req.body.type,
      gen: Math.floor(Math.random() * 10000)
    };
    var expiresIn = config.oauth.accessTokenLifetime;
    if (type == 'refreshToken') {
      expiresIn = config.oauth.refreshTokenLifetime;
    }
    jwt.sign(userData, config.jwt.secret, { algorithm: config.jwt.algorithm, expiresIn: expiresIn }, function(token) {
      callback(null, token);
    })
  }

  oAuthModel.getAccessToken = function(accessToken, callback) {
    accessTokenProvider.getAccessToken(accessToken)
      .then(function(data) {
        callback(null, data);
      })
      .catch(function(err) {
        callback(err);
      });
  }

  oAuthModel.getRefreshToken = function(refreshToken, callback) {
    refreshTokenProvider.getRefreshToken(refreshToken)
      .then(function(data) {
        if (data) {
          data.user = data.userId;
        }
        callback(null, data);
      })
      .catch(function(err) {
        callback(err);
      });
  }

  oAuthModel.saveAccessToken = function(accessToken, clientId, expires, userId, callback) {
    if (userId.id) { // if문 수정하면 안됨 (refresh token 할때 다른값이 넘어옴)
      userId = userId.id;
    }
    accessTokenProvider.saveAccessToken(accessToken, clientId, expires, userId)
      .then(function(data) {
        callback(null);
      })
      .catch(function(err) {
        callback(err);
      });
  }

  oAuthModel.saveRefreshToken = function(refreshToken, clientId, expires, userId, callback) {
    if (userId.id) { // if문 수정하면 안됨 (refresh token 할때 다른값이 넘어옴)
      userId = userId.id;
    }
    refreshTokenProvider.saveRefreshToken(refreshToken, clientId, expires, userId)
      .then(function(data) {
        callback(null);
      })
      .catch(function(err) {
        callback(err);
      });
  }

  // ---------------------------------------------------------------
  // signup
  // ---------------------------------------------------------------
  var signupLocal = function(data) {
    return new Promise(function(resolve, reject) {
      userService.getUser(data.username)
        .then(function success(user) {
          // 이미 가입되어 있음
          throw new cerror.AlreadyExistError(user.username + " is already exist user");
        }, function fail(err) {
          // 새로 가입
          if (err instanceof cerror.NotExistError) {
            return userService.insertUser(data);
          } else {
            throw err;
          }
        })
        .then(function(user) {
          // 가입완료. 인증메일 발송
          emailQueue.push({ to: user.username, verifykey: user.verifykey, type: 'verify' });
          resolve(user);
        })
        .catch(function(err) {
          reject(err);
        })
    });
  };

  var signupSoical = function(data, getMe) {
    return new Promise(function(resolve, reject) {
      // password로 넘어온 accessToken으로 유저 정보를 가져온다.
      getMe(data.password)
        .then(function(me) {
          // id가 일치하는지 확인한뒤, 저장한다.
          if (data.username == me.username) {
            data.userinfo = me.userinfo;
            data.token = data.password; // accessToken을 따로 저장해준다.(password는 hash값이 저장됨)
            return userService.upsertUser(data);
          } else {
            throw new cerror.TokenVerifyError("token has different id");
          }
        })
        .then(function(result) {
          if (result.n === 1 && result.nModified <= 1) {
            resolve(result);
          } else {
            throw new Error("upsert user is failed");
          }
        })
        .catch(function(err) {
          reject(err);
        })
    });
  };

  var Singleton = function() {
    this.oAuthModel = oAuthModel;
    this.signupLocal = signupLocal;
    this.signupSoical = signupSoical;
  }

  if (instance === null) {
    instance = new Singleton();
  }
  return instance;
}
Example #3
0
module.exports = function(config) {
  'use strict';

  var _ = require('underscore');
  var uuid = require('uuid');
  var taskman = require('node-taskman');
  var emailQueue = taskman.createQueue('email', { redis: config.redis });
  var genPassword = require('generate-password');

  var cerror = require('../config/cerror');
  var hash = require('../utils/common').hash;
  var UserProvider = require('../models/userProvider').UserProvider;
  var userProvider = new UserProvider();
  var socialService = require('../services/socialService')(config);


  var insertUser = function(data, verify) {
    var cloneData = _.clone(data);
    cloneData.verify = verify || false;
    if (!cloneData.verify) {
      cloneData.verifykey = uuid.v1();
    }
    return new Promise(function(resolve, reject) {
      hash.getHash(cloneData.password)
        .then(function(hash) {
          cloneData.password = hash;
          return cloneData;
        })
        .then(function(cloneData) {
          return userProvider.save(cloneData);
        })
        .then(function(result) {
          resolve(result);
        })
        .catch(function(err) {
          if (err.code === 11000) { // duplicate key
            reject(new cerror.AlreadyExistError('username is already exist'));
          } else {
            reject(err);
          }
        })
    });
  }

  var upsertUser = function(data, verify) {
    var cloneData = _.clone(data);
    cloneData.verify = verify || true;
    if (!cloneData.verify) {
      cloneData.verifykey = uuid.v1();
    }
    return new Promise(function(resolve, reject) {
      hash.getHash(cloneData.password)
        .then(function(hash) {
          cloneData.password = hash;
          return cloneData;
        })
        .then(function(cloneData) {
          return userProvider.upsert({ username: cloneData.username }, cloneData);
        })
        .then(function(result) {
          resolve(result);
        })
        .catch(function(err) {
          reject(err);
        })
    });
  }

  var getUser = function(username) {
    return new Promise(function(resolve, reject) {
      userProvider.findOne({ username: username })
        .then(function(user) {
          if (user) {
            resolve(user);
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var getUserWithPass = function(username, password) {
    return new Promise(function(resolve, reject) {
      userProvider.findOne({ username: username })
        .then(function(user) {
          if (!user) {
            throw new cerror.NotExistError('username is not exist');
          }
          hash.compareHash(password, user.password)
            .then(function(isMatched) {
              if (!isMatched) {
                throw new cerror.NotMatchError('password is not matched');
              }
              resolve(user);
            })
            .catch(function(err) {
              reject(err);
            })
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var getUserInfo = function(username) {
    return new Promise(function(resolve, reject) {
      userProvider.findOne({ username: username })
        .then(function(user) {
          if (user) {
            var userinfo = user.userinfo || {};
            userinfo.username = user.username;
            userinfo.verify = user.verify;
            userinfo.type = user.type;
            resolve(userinfo);
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var updateUserInfo = function(username, userinfo) {
    return new Promise(function(resolve, reject) {
      userProvider.update({ username: username }, { userinfo: userinfo })
        .then(function(result) {
          if (result.n === 1 && result.nModified === 1) {
            resolve(result);
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var updatePassword = function(username, currentPassword, newPassword) {
    return new Promise(function(resolve, reject) {
      getUserWithPass(username, currentPassword)
        .then(function(user) {
          return hash.getHash(newPassword);
        })
        .then(function(hash) {
          return userProvider.update({ username: username }, { password: hash });
        })
        .then(function(result) {
          if (result.n === 1 && result.nModified === 1) {
            resolve(result);
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var setUserVerfiy = function(verifykey) {
    return new Promise(function(resolve, reject) {
      userProvider.update({ verifykey: verifykey }, { verify: true })
        .then(function(result) {
          if (result.n === 1 && result.nModified === 1) {
            resolve(result);
          } else {
            throw new cerror.NotMatchError('verifykey is not match');
          }
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var getUserVerify = function(username) {
    return new Promise(function(resolve, reject) {
      userProvider.findOne({ username: username })
        .then(function(user) {
          if (user) {
            resolve(user.verify);
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var sendVerifyEmail = function(username) {
    return new Promise(function(resolve, reject) {
      userProvider.findOne({ username: username })
        .then(function(user) {
          if (user) {
            if (user.type === 'local') {
              emailQueue.push({ to: user.username, verifykey: user.verifykey, type: 'verify' });
              resolve(user.verify);
            } else {
              throw new cerror.NotMatchError('user is not a local type');
            }
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var sendPasswordEmail = function(username) {
    return new Promise(function(resolve, reject) {
      var tempPassword = '';
      userProvider.findOne({ username: username })
        .then(function(user) {
          if (user) {
            if (user.type === 'local') {
              tempPassword = genPassword.generate({ length: 10, numbers: true, symbols:true });
              return hash.getHash(tempPassword);
            } else {
              throw new cerror.NotMatchError('user is not a local type');
            }
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .then(function(hash) {
          return userProvider.update({ username: username }, { password: hash });
        })
        .then(function(result) {
          emailQueue.push({ to: username, password: tempPassword, type: 'password' });
          resolve({ tempPassword: tempPassword });
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var removeUserAll = function() {
    return userProvider.removeAll();
  }

  var removeLocalUser = function(username) {
    return new Promise(function(resolve, reject) {
      userProvider.remove({ username: username })
        .then(function(result) {
          if (result.result.n === 1) {
            resolve();
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  var removeUser = function(username) {
    return new Promise(function(resolve, reject) {
      userProvider.findOne({ username: username })
        .then(function(user) {
          if (user) {
            if (user.type === 'kakao') {
              return socialService.kakaoUnlink(user.token, user.username);
            } else if (user.type === 'facebook') {
              return socialService.facebookUnlink(user.token, user.username);
            } else {
              return username;
            }
          } else {
            throw new cerror.NotExistError('username is not exist');
          }
        })
        .then(function(username) {
          return removeLocalUser(username);
        })
        .then(function() {
          resolve();
        })
        .catch(function(err) {
          reject(err);
        })
    })
  }

  return {
    insertUser: insertUser,
    upsertUser: upsertUser,
    getUser: getUser,
    getUserWithPass: getUserWithPass,
    getUserInfo: getUserInfo,
    updateUserInfo: updateUserInfo,
    updatePassword: updatePassword,
    setUserVerfiy: setUserVerfiy,
    getUserVerify: getUserVerify,
    sendVerifyEmail: sendVerifyEmail,
    sendPasswordEmail: sendPasswordEmail,
    removeUserAll: removeUserAll,
    removeUser: removeUser
  }
}