131 lines
3.2 KiB
JavaScript
131 lines
3.2 KiB
JavaScript
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
|
||
}
|