| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- const {
- userCollection,
- LOG_TYPE
- } = require('../../common/constants')
- const {
- ERROR
- } = require('../../common/error')
- const {
- findUser
- } = require('./account')
- const {
- getValidInviteCode,
- generateInviteInfo
- } = require('./fission')
- const {
- logout
- } = require('./logout')
- const PasswordUtils = require('./password')
- const {
- merge
- } = require('../npm/index')
- async function realPreRegister (params = {}) {
- const {
- user
- } = params
- const {
- userMatched
- } = await findUser({
- userQuery: user,
- authorizedApp: this.getUniversalClientInfo().appId
- })
- if (userMatched.length > 0) {
- throw {
- errCode: ERROR.ACCOUNT_EXISTS
- }
- }
- }
- async function preRegister (params = {}) {
- try {
- await realPreRegister.call(this, params)
- } catch (error) {
- await this.middleware.uniIdLog({
- success: false,
- type: LOG_TYPE.REGISTER
- })
- throw error
- }
- }
- async function preRegisterWithPassword (params = {}) {
- const {
- user,
- password
- } = params
- await preRegister.call(this, {
- user
- })
- const passwordUtils = new PasswordUtils({
- clientInfo: this.getUniversalClientInfo(),
- passwordSecret: this.config.passwordSecret
- })
- const {
- passwordHash,
- version
- } = passwordUtils.generatePasswordHash({
- password
- })
- const extraData = {
- password: passwordHash,
- password_secret_version: version
- }
- return {
- user,
- extraData
- }
- }
- async function thirdPartyRegister ({
- user = {}
- } = {}) {
- return {
- mobileConfirmed: !!(user.mobile && user.mobile_confirmed) || false,
- emailConfirmed: !!(user.email && user.email_confirmed) || false
- }
- }
- async function postRegister (params = {}) {
- const {
- user,
- extraData = {},
- isThirdParty = false,
- inviteCode
- } = params
- const {
- appId,
- appName,
- appVersion,
- appVersionCode,
- channel,
- scene,
- clientIP,
- osName
- } = this.getUniversalClientInfo()
- const uniIdToken = this.getUniversalUniIdToken()
- merge(user, extraData)
- const registerChannel = channel || scene
- user.register_env = {
- appid: appId || '',
- uni_platform: this.clientPlatform || '',
- os_name: osName || '',
- app_name: appName || '',
- app_version: appVersion || '',
- app_version_code: appVersionCode || '',
- channel: registerChannel ? registerChannel + '' : '', // channel可能为数字,统一存为字符串
- client_ip: clientIP || ''
- }
- user.register_date = Date.now()
- user.dcloud_appid = [appId]
- if (user.username) {
- user.username = user.username.toLowerCase()
- }
- if (user.email) {
- user.email = user.email.toLowerCase()
- }
- const {
- autoSetInviteCode, // 注册时自动设置邀请码
- forceInviteCode, // 必须有邀请码才允许注册,注意此逻辑不可对admin生效
- userRegisterDefaultRole // 用户注册时配置的默认角色
- } = this.config
- if (autoSetInviteCode) {
- user.my_invite_code = await getValidInviteCode()
- }
- // 如果用户注册默认角色配置存在且不为空数组
- if (userRegisterDefaultRole && userRegisterDefaultRole.length) {
- // 将用户已有的角色和配置的默认角色合并成一个数组,并去重
- user.role = Array.from(new Set([...(user.role || []), ...userRegisterDefaultRole]))
- }
- const isAdmin = user.role && user.role.includes('admin')
- if (forceInviteCode && !isAdmin && !inviteCode) {
- throw {
- errCode: ERROR.INVALID_INVITE_CODE
- }
- }
- if (inviteCode) {
- const {
- inviterUid,
- inviteTime
- } = await generateInviteInfo({
- inviteCode
- })
- user.inviter_uid = inviterUid
- user.invite_time = inviteTime
- }
- if (uniIdToken) {
- try {
- await logout.call(this)
- } catch (error) { }
- }
- const beforeRegister = this.hooks.beforeRegister
- let userRecord = user
- if (beforeRegister) {
- userRecord = await beforeRegister({
- userRecord,
- clientInfo: this.getUniversalClientInfo()
- })
- }
- const {
- id: uid
- } = await userCollection.add(userRecord)
- const createTokenRes = await this.uniIdCommon.createToken({
- uid
- })
- const {
- errCode,
- token,
- tokenExpired
- } = createTokenRes
- if (errCode) {
- throw createTokenRes
- }
- await this.middleware.uniIdLog({
- data: {
- user_id: uid
- },
- type: LOG_TYPE.REGISTER
- })
- return {
- errCode: 0,
- uid,
- newToken: {
- token,
- tokenExpired
- },
- ...(
- isThirdParty
- ? thirdPartyRegister({
- user: {
- ...userRecord,
- _id: uid
- }
- })
- : {}
- ),
- passwordConfirmed: !!userRecord.password
- }
- }
- module.exports = {
- preRegister,
- preRegisterWithPassword,
- postRegister
- }
|