const { dbCmd, userCollection } = require('../../common/constants') const { USER_IDENTIFIER } = require('../../common/constants') const { batchFindObjctValue, getType, isMatchUserApp } = require('../../common/utils') /** * 查询满足条件的用户 * @param {Object} params * @param {Object} params.userQuery 用户唯一标识组成的查询条件 * @param {Object} params.authorizedApp 用户允许登录的应用 * @returns userMatched 满足条件的用户列表 */ async function findUser (params = {}) { const { userQuery, authorizedApp = [] } = params const condition = getUserQueryCondition(userQuery) if (condition.length === 0) { throw new Error('Invalid user query') } const authorizedAppType = getType(authorizedApp) if (authorizedAppType !== 'string' && authorizedAppType !== 'array') { throw new Error('Invalid authorized app') } let finalQuery if (condition.length === 1) { finalQuery = condition[0] } else { finalQuery = dbCmd.or(condition) } const userQueryRes = await userCollection.where(finalQuery).get() return { total: userQueryRes.data.length, userMatched: userQueryRes.data.filter(item => { return isMatchUserApp(item.dcloud_appid, authorizedApp) }) } } function getUserIdentifier (userRecord = {}) { const keys = Object.keys(USER_IDENTIFIER) return batchFindObjctValue(userRecord, keys) } function getUserQueryCondition (userRecord = {}) { const userIdentifier = getUserIdentifier(userRecord) const condition = [] for (const key in userIdentifier) { const value = userIdentifier[key] if (!value) { // 过滤所有value为假值的条件,在查询用户时没有意义 continue } const queryItem = { [key]: value } // 为兼容用户老数据用户名及邮箱需要同时查小写及原始大小写数据 if (key === 'mobile') { queryItem.mobile_confirmed = 1 } else if (key === 'email') { queryItem.email_confirmed = 1 const email = userIdentifier.email if (email.toLowerCase() !== email) { condition.push({ email: email.toLowerCase(), email_confirmed: 1 }) } } else if (key === 'username') { const username = userIdentifier.username if (username.toLowerCase() !== username) { condition.push({ username: username.toLowerCase() }) } } else if (key === 'identities') { queryItem.identities = dbCmd.elemMatch(value) } condition.push(queryItem) } return condition } module.exports = { findUser, getUserIdentifier }