import { isEmpty, merge, pick } from 'ramda' import { makeError, replies } from '@oyst/utils' import { MFA } from '@oyst/mfa' import { ONECLICK_API_URL } from '../../lib/constants' import UserAPI from './../../apis/user' import authorizeHandler from '../../handlers/authorize' import { authorize as headers } from '../../validators/headers' import log from '../../lib/log' import { orderSession } from '../../sessions' import phoneRule from 'joi-phone-validator' const { error, success } = replies export default { config: { pre: [authorizeHandler], validate: { headers, query: { phone: phoneRule.phone().mobile().required() } } }, handler: async (req, reply) => { try { const sessionID = req.pre.authorization.data.id const phone = req.query.phone await orderSession.setData(sessionID, { phone }, 'phone') const user = await UserAPI.findByPhone(phone) if (user === null) { return error(makeError('USER-404', 'user-not-found'), reply) } await orderSession.setData(sessionID, { phone: user.phone, session: req.headers['oyst-session'], user_id: user.id }, 'login-user') const name = `${user.first_name || ''}` const mobileDetect = require('mobile-detect') const md = new mobileDetect(req.headers['user-agent']) const res = await MFA.sendSMS(phone, { code: { length: 4, alpha: false }, data: { name }, is_mobile: !!md.mobile(), type: 'oneclick.login', urls: { success: { json: { phone: user.phone, session: req.headers['oyst-session'], user_id: user.id }, method: 'POST', url: `${ONECLICK_API_URL}/v1/mfa/valid` } } }, sessionID, true) success(merge({ channel: `phone-checker-${res.id}`, code: true, login: true, retry_request: { key: 'phone', method: 'GET', path: '/users' }, sms: res.success || false }, pick(['event', 'id', 'phone', 'can_retry', 'is_mobile'], res)), reply) } catch (err) { log({ errFindUser: err }) error(makeError(err), reply) } }, method: 'GET', path: '/v1/users' }