123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- const {
- db,
- dbCmd,
- userCollection
- } = require('../../common/constants')
- const {
- USER_IDENTIFIER
- } = require('../../common/constants')
- const {
- batchFindObjctValue,
- getType
- } = 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)
- let appQuery = null
- if (authorizedAppType === 'string') {
- // 传入authorizedApp为单个appId时
- appQuery = dbCmd.or(
- {
- dcloud_appid: authorizedApp
- },
- {
- dcloud_appid: dbCmd.exists(false)
- }
- )
- } else if (authorizedAppType === 'array') {
- if (authorizedApp.length === 0) {
- // 传入空数组表示希望获取不能登录任一客户端的用户
- appQuery = {
- dcloud_appid: []
- }
- } else if (authorizedApp.length === 1) {
- appQuery = dbCmd.or(
- {
- dcloud_appid: authorizedApp[0]
- },
- {
- dcloud_appid: dbCmd.exists(false)
- }
- )
- } else {
- appQuery = dbCmd.or(
- {
- dcloud_appid: db.command.in(authorizedApp)
- },
- {
- dcloud_appid: dbCmd.exists(false)
- }
- )
- }
- } else {
- throw new Error('Invalid authorized app')
- }
- let finalQuery
- if (condition.length === 1) {
- finalQuery = dbCmd.and(condition[0], appQuery)
- } else {
- finalQuery = dbCmd.and(
- dbCmd.or(condition),
- appQuery
- )
- }
- const userQueryRes = await userCollection.where(finalQuery).get()
- return userQueryRes.data
- }
- 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()
- })
- }
- }
- condition.push(queryItem)
- }
- return condition
- }
- module.exports = {
- findUser,
- getUserIdentifier
- }
|