Files
im-system/uni-im示例/uni_modules/uni-im/uniCloud/database/uni-id-users.schema.ext.js
2023-09-24 17:55:19 +08:00

130 lines
3.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// schema扩展相关文档请参阅https://uniapp.dcloud.net.cn/uniCloud/jql-schema-ext.html
const db = uniCloud.database();
const dbCmd = db.command
module.exports = {
trigger: {
async afterReadAsSecondaryCollection(e) {
await afterReadAction(e, true)
},
async afterRead(e) {
await afterReadAction(e)
}
}
}
async function afterReadAction({
field,
result,
userInfo: currentUserInfo,
primaryCollection
} = {}, asSecondaryCollection = false) {
if (result && field && field.includes("nickname")) {
//uni-im 处理查询nickname但值为空的情况
let {
data
} = result
if( !Array.isArray(data) ){
// 说明走了 getOne
data = [data]
}
// 为联查 且为副表时的字段
if (asSecondaryCollection && typeof(data[0]) == "object") {
let foreignKeysObj = {
"uni-im-group-member":"user_id",
"uni-im-friend":"friend_uid"
}
let foreignKey = foreignKeysObj[primaryCollection]
if(foreignKey in data[0]){
data = data.map(item => item[foreignKey][0])
}else{
return console.log('触发器uni-id-users.schema.ext.js未在当前操作生效。如需应用此触发器请补充主表表名及其foreignKey的值到触发器uni-id-users.schema.ext.js的变量foreignKeysObj内');
}
}
// console.log('data',data);
if (!Array.isArray(data)) {
data = [data]
}
// 记录没有nickname的用户id
let user_ids = [],
usersInfo = {};
data.forEach(item => {
if (item && !item.nickname) {
user_ids.push(item._id)
}
})
if (user_ids.length) {
console.info('注意uni-im项目用户数据依赖nickname。有' + user_ids.length +
`个用户数据 nickname 的值为空已多执行一次数据库查询将此用户的“用户名”或“邮箱”或“手机号”脱敏后作为nickname输出。请引导用户完善nickname减少查库次数`)
let res = await db.collection('uni-id-users')
.where({
_id: dbCmd.in(user_ids)
})
.field({
username: true,
email: true,
mobile: true
})
.limit(1000)
.get()
usersInfo = res.data.reduce((sum, current) => {
sum[current._id] = current
return sum
}, {})
}
let isUniImAdmin = currentUserInfo.role.includes('uni-im-admin') || currentUserInfo.role.includes('admin')
data.forEach(item => {
if (!item.nickname) {
let userInfo = usersInfo[item._id]
// 管理员可以看到不打码的
if (isUniImAdmin) {
item.nickname = userInfo.username || userInfo.email || userInfo.mobile
}else{
item.nickname = hideUsernameStr(userInfo.username) || hideEmailStr(userInfo.email) ||
hideMobileStr(userInfo.mobile)
}
}else if(!isUniImAdmin && item.nickname.includes('@')){
// 禁止昵称用邮箱 脱敏处理
item.nickname = hideEmailStr(item.nickname)
}
// 特殊处理某个用户xxx
if (item._id == "xxx") {
item.nickname = "xxx"
item.avatar_file = {
url: "xxx"
}
}
})
function hideUsernameStr(username) {
if (username == undefined) {
return false
}
let length = username.length
let n = parseInt(length / 2.5) * 2
return username.substr(0, length - n) + '**' + username.substr(-1 * n / 2)
}
function hideEmailStr(email) {
if (email == undefined) {
return false
}
const content = email.split("@")
return content[0].substr(0, content[0].length - 2) + '**' + content[1]
}
function hideMobileStr(mobile) {
if (mobile == undefined) {
return false
}
return mobile.substr(0, 3) + '****' + mobile.substr(-1 * 4)
}
}
}