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);
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; }
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 } }