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

376 lines
12 KiB
JavaScript
Raw 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 afterCreate({
addDataList,
clientInfo
}) {
if (addDataList.length === 1) {
// a加b为好友 自动 将b加a为好友
let [data] = addDataList
let {
friend_uid,
user_id
} = data
data.friend_uid = user_id
data.user_id = friend_uid
const dbJQL = uniCloud.databaseForJQL({
clientInfo
})
let {data:userList} = await dbJQL.collection('uni-id-users').where({
"_id":dbCmd.in([friend_uid,user_id])
})
.field('_id,nickname,avatar_file')
.get()
let friendInfo = userList.filter(i=>i._id == friend_uid)[0]
let userInfo = userList.filter(i=>i._id == user_id)[0]
// console.log(12313132131,{userList,friendInfo,userInfo})
// console.log('do uni-im-friend afterCreate');
// console.log(data);
let res = await db.collection('uni-im-friend').add(data)
// console.log('1231', res);
dbJQL.setUser({
uid: user_id, // 建议此处使用真实uid
role: ['admin'], // 指定当前执行用户的角色为admin。如果只希望指定为admin身份可以删除uid和permission节点
permission: []
})
let conversationId = getConversationId([user_id, friend_uid])
res = await db.collection('uni-im-conversation')
.where({id:conversationId,friend_uid})
.get()
// 查询是否存在,防止未加好友时发起过会话重复创建
if(res.data.length === 0){
res = await dbJQL.collection('uni-im-conversation').add({
id: conversationId,
user_id,
friend_uid,
type: 1,
unread_count: 0
})
}else{
console.log('会话已存在')
}
//发消息通知 被邀请加好友的用户
let pushParam = {
"user_id": friend_uid,
"payload": {
type: "uni-im-notification",
subType: "uni-im-friend-add",
// avatar_file: userInfo.avatar_file, // 头像或图标的图片地址支持Base64
data: {
from_uid: user_id,
to_uid: friend_uid,
},
unique:[user_id,friend_uid].sort().join('_')
},
title:"成功加为好友通知",
content:'你已成功添加"'+ userInfo.nickname +'"为好友',
}
// console.log(123, pushParam);
const uniImCo = uniCloud.importObject("uni-im-co")
res = await uniImCo.sendPushMsg(pushParam,clientInfo.appId)
// console.log(8989989, res);
pushParam.user_id = user_id
pushParam.content = '你已成功添加"'+ friendInfo.nickname +'"为好友'
res = await uniImCo.sendPushMsg(pushParam,clientInfo.appId)
} else {
throw new Error('非法参数')
}
},
async beforeDelete({
where,
clientInfo
}) {
console.log('where',{where});
if (where && where.friend_uid) {
let {
data: [friendData]
} = await db.collection('uni-im-friend').where(where).get()
if (friendData) {
let {
friend_uid,
user_id
} = friendData
const dbJQL = uniCloud.databaseForJQL({
clientInfo
})
let {data:userList} = await dbJQL.collection('uni-id-users').where({
"_id":dbCmd.in([friend_uid,user_id])
})
.field('_id,nickname,avatar_file')
.get()
let friendInfo = userList.filter(i=>i._id == friend_uid)[0]
let userInfo = userList.filter(i=>i._id == user_id)[0]
// console.log(12313132131,{userList,friendInfo,userInfo})
let res = await db.collection('uni-im-friend')
.where({
friend_uid: user_id,
user_id: friend_uid
})
.remove()
console.log('同步删除好友',res);
dbJQL.setUser({
uid: user_id, // 建议此处使用真实uid
role: ['admin'], // 指定当前执行用户的角色为admin。如果只希望指定为admin身份可以删除uid和permission节点
permission: []
})
let conversationId = getConversationId([user_id, friend_uid])
res = await dbJQL.collection('uni-im-conversation')
.where({
"id": conversationId
})
.remove()
console.log('同步删除相关会话',res);
//发消息通知 用户成功删除好友
let pushParam = {
"user_id": friend_uid, //群创建人id后续升级为所有群管理员id
"payload": {
type: "uni-im-notification", // im消息通知比如加好友请求有用户退群等
subType: "uni-im-friend-delete", // 通知子类型(可选)
// avatar_file: userInfo.avatar_file, // 头像或图标的图片地址支持Base64
data: {
conversationId,
from_uid:user_id,
to_uid:friend_uid
},
unique:[user_id,friend_uid].sort().join('_')
},
title:"好友关系解除通知",
content:'"'+ userInfo.nickname +'"与你解除好友关系'
}
// console.log(123, pushParam);
const uniImCo = uniCloud.importObject("uni-im-co")
res = await uniImCo.sendPushMsg(pushParam,clientInfo.appId)
// console.log(8989989, res);
pushParam.user_id = user_id
pushParam.content = '你已成功与"'+ friendInfo.nickname +'"解除好友关系'
res = await uniImCo.sendPushMsg(pushParam,clientInfo.appId)
// console.log(8989989, res);
} else {
throw new Error('不是好友')
}
} else {
throw new Error('非法参数1')
}
},
async afterRead({result}){
// 数据脱敏处理
result.data.forEach(item=>{
let friendInfo = item.friend_uid[0]
})
}
}
}
function getConversationId(param) {
return 'single' + '_' + MD5(param.sort().toString())
}
function MD5(sMessage) {
function RotateLeft(lValue, iShiftBits) {
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
}
function AddUnsigned(lX, lY) {
var lX4, lY4, lX8, lY8, lResult;
lX8 = (lX & 0x80000000);
lY8 = (lY & 0x80000000);
lX4 = (lX & 0x40000000);
lY4 = (lY & 0x40000000);
lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
if (lX4 | lY4) {
if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
else return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
} else return (lResult ^ lX8 ^ lY8);
}
function F(x, y, z) {
return (x & y) | ((~x) & z);
}
function G(x, y, z) {
return (x & z) | (y & (~z));
}
function H(x, y, z) {
return (x ^ y ^ z);
}
function I(x, y, z) {
return (y ^ (x | (~z)));
}
function FF(a, b, c, d, x, s, ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function GG(a, b, c, d, x, s, ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function HH(a, b, c, d, x, s, ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function II(a, b, c, d, x, s, ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function ConvertToWordArray(sMessage) {
var lWordCount;
var lMessageLength = sMessage.length;
var lNumberOfWords_temp1 = lMessageLength + 8;
var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
var lWordArray = Array(lNumberOfWords - 1);
var lBytePosition = 0;
var lByteCount = 0;
while (lByteCount < lMessageLength) {
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = (lWordArray[lWordCount] | (sMessage.charCodeAt(lByteCount) << lBytePosition));
lByteCount++;
}
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
return lWordArray;
}
function WordToHex(lValue) {
var WordToHexValue = "",
WordToHexValue_temp = "",
lByte, lCount;
for (lCount = 0; lCount <= 3; lCount++) {
lByte = (lValue >>> (lCount * 8)) & 255;
WordToHexValue_temp = "0" + lByte.toString(16);
WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
}
return WordToHexValue;
}
var x = Array();
var k, AA, BB, CC, DD, a, b, c, d
var S11 = 7,
S12 = 12,
S13 = 17,
S14 = 22;
var S21 = 5,
S22 = 9,
S23 = 14,
S24 = 20;
var S31 = 4,
S32 = 11,
S33 = 16,
S34 = 23;
var S41 = 6,
S42 = 10,
S43 = 15,
S44 = 21;
x = ConvertToWordArray(sMessage);
a = 0x67452301;
b = 0xEFCDAB89;
c = 0x98BADCFE;
d = 0x10325476;
for (k = 0; k < x.length; k += 16) {
AA = a;
BB = b;
CC = c;
DD = d;
a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
a = AddUnsigned(a, AA);
b = AddUnsigned(b, BB);
c = AddUnsigned(c, CC);
d = AddUnsigned(d, DD);
}
var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
return temp.toLowerCase();
}