back-service.js 5.3 KB
/**
 * Created by TaoHuang on 2016/6/14.
 */

'use strict';

const Promise = require('bluebird');
const co = Promise.coroutine;
const _ = require('lodash');
const moment = require('moment');

const helpers = global.yoho.helpers;
const api = require('./back-api');
const LoginService = require('./user-service');
const PassportHelper = require('./passport-helper');
const BackHelper = require('./back-helper');

/**
 * 验证手机和邮箱输入正确性
 */
const validateEmailOrMobileAsync = (userInput, areaCode) => {
    return new Promise(function(resolve, rejected) {
        let result = {type: 'email', area: '', phone: ''};

        if (PassportHelper.validator.verifyEmail(userInput)) {
            result.type = 'email';
            result.area = '';
            result.phone = userInput;

            resolve(result);
        } else if (PassportHelper.validator.verifyMobile(userInput)) {
            result.type = 'mobile';
            result.area = areaCode;
            result.phone = userInput;

            resolve(result);
        } else {
            rejected('输入信息出错!');
        }

    });

};

/**
 * 查找用户
 */
const findUserAsync = (type, phone, area) => {
    return co(function * () {
        const MESSAGE = {
            mobile: '您输入的手机号码尚未注册!',
            email: '您输入的邮件账户尚未注册!',
            ok: '验证成功'
        };

        const findBy = {
            email: LoginService.findByEmailAsync,
            mobile: _.rearg(LoginService.findByMobileAsync, [1, 0]) // 交换参数
        };

        const OK = {code: 200, message: MESSAGE.ok};

        const user = yield findBy[type](phone, area);

        if (_.isEmpty(user)) {
            return {
                code: 402,
                message: MESSAGE[type]
            };
        }

        return OK;
    })();
};

/**
 * 发送验证码到用户
 */
const sendCodeToUserAsync = (type, mobile, areaCode) => {
    let sendTo = {
        email: api.sendCodeToEmailAsync,
        mobile: api.sendCodeToMobileAsync
    };

    return sendTo[type](mobile, areaCode);
};

/**
 * 发送找回手机号短信
 */
const sendCodeToMobileAsync = (areaCode, mobile) => {
    return api.sendCodeToMobileAsync(mobile, areaCode);
};

/**
 * 获得首页的数据
 */
const indexPageDataAsync = () => {
    return co(function *() {
        let countryList = PassportHelper.getCountry();

        return {
            back: {
                countryName: {text: '中国'},
                location: '+86',
                country: {list: countryList},
                captchaUrl: helpers.urlFormat('/passport/images')
            }
        };
    })();
};

/**
 * 验证手机验证码
 */
const verifyCodyByMobileAsync = (area, mobile, mobileCode) => {
    const ERR = {
        code: 400,
        message: '验证码错误!',
        data: helpers.urlFormat('/passport/back/index')
    };

    return api.validateMobileCodeAsync(mobile, mobileCode, area)
        .then(result => {
            if (!(result.code && result.code === 200)) {
                return ERR;
            }

            let data = {
                mobile: mobile,
                area: area,
                token: result.data.token,
                createdAt: moment().unix()
            };

            data.code = new Buffer(BackHelper.makeToken(data)).toString('base64');

            return {
                code: 200,
                message: '验证成功',
                data: helpers.urlFormat('/passport/back/backcode', data)
            };
        });

};

/**
 * 手机 token 合法性验证
 */
const authRequest = (data, token) => {
    if (!BackHelper.validateToken(data, token)) {
        return {};
    }

    let existTime = moment.duration(60, 'minutes').asSeconds();
    let isExpired = (moment().unix() - data.createdAt) > existTime;

    if (isExpired) {
        return {};
    } else {
        return data;
    }
};

/**
 * 更新密码接口
 */
const updatePwdAsync = (emailToken, mobileToken, newPassword) => {
    return co(function * () {
        let result = {type: 'mobile', status: false};
        const ERR = {type: 'unknown', status: false};

        if (!_.isEmpty(mobileToken)) {
            if (!mobileToken.mobile || mobileToken.uid) {
                return ERR;
            }

            let mobile = mobileToken.mobile;
            let area = mobileToken.area;
            let token = mobileToken.token;
            let modifyStatus = yield api.modifyPasswordByMobileAsync(mobile, token, newPassword, area);

            if (!modifyStatus.code || modifyStatus.code !== 200) {
                return ERR;
            }

            result.type = 'mobile';
            result.status = true;
        } else {
            let modifyStatus = yield api.modifyPasswordByEmailCodeAsync(emailToken, newPassword);

            if (!modifyStatus.code || modifyStatus.code !== 200) {
                return ERR;
            }

            result.type = 'email';
            result.status = true;
        }

        return result;
    })();
};

/**
 * 验证邮件验证码
 */
const checkEmailCodeAsync = api.checkEmailCodeAsync;

module.exports = {
    validateEmailOrMobileAsync,
    findUserAsync,
    sendCodeToUserAsync,
    sendCodeToMobileAsync,
    indexPageDataAsync,
    verifyCodyByMobileAsync,
    authRequest,
    updatePwdAsync,
    checkEmailCodeAsync
};