uni-im-group-member.schema.ext.js 6.6 KB
Newer Older
DCloud_JSON's avatar
DCloud_JSON 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
// schema扩展相关文档请参阅:https://uniapp.dcloud.net.cn/uniCloud/jql-schema-ext.html
const db = uniCloud.database();
const uniImCo = uniCloud.importObject("uni-im-co")
module.exports = {
	trigger: {
		async beforeRead({
			where,
			userInfo
		}) {
			if (where.user_id != userInfo.uid) {
				if (where.group_id) {
					let res = await db.collection('uni-im-group-member')
						.where({
							group_id: where.group_id,
							user_id: userInfo.uid
						})
						.get()
					// console.log(res);
					if (res.data.length === 0) {
            return [] //不是群成员返回空(场景:被踢出群后,点开群)
						// throw new Error('不是群成员,不能查询')
					}
				}
			}
		},
		async afterRead(){},
    async beforeCreate({addDataList,userInfo,triggerContext}){
      if(addDataList.length !== 1 ){
        throw new Error('jql方式创建uni-im-group-member,️只能创建一条数据')
      }
      if(!addDataList[0].role){
        addDataList[0].role = []  // 角色默认为空
      }
      if(!addDataList[0].mute_type){
        addDataList[0].mute_type = 0  // 是否免打扰默认为false
      }
      addDataList.create_time = Date.now()
      const [{group_id}] = addDataList
      // 1. 判断操作者,必须是应用管理员(可由触发器触发时会设置role为admin)或者是群的管理员
      if(!userInfo.role.includes('admin')){
        // 不是应用管理员,判断是否是群管理员
      	let res = await db.collection('uni-im-group-member')
      									.where({group_id,"user_id":userInfo.uid})
      									.get()
      	// console.log('---',res.data);
      	if( !(res.data[0] && res.data[0].role.includes('admin')) ){
      		throw Error('没有权限')
      	}
      }
      // 2. 群是否存在
      let res = await db.collection('uni-im-group').doc(group_id).get()
      if (res.data.length == 0) {
      	throw new Error('非法群id')
      }
    },
		async afterCreate({
			addDataList,
			clientInfo,
      userInfo,
      result,
		}) {
      // before中已校验: jql方式创建uni-im-group-member,️只能创建一条数据 
			let [addData] = addDataList
      addData._id = result.id
      // 通知所有群成员,有用户加入群聊
      console.log('通知所有群成员,有用户加入群聊')
      const msgData = {
      	body:{
          new_member_list:[addData],
          // 冗余字段记录成员id,方便客户端显示
          user_id_list:[addData.user_id]
        },
        action:"join-group",
      	type:"system",
      	create_time: Date.now(),
      	conversation_id:"group_" + addData.group_id,
      	group_id:addData.group_id,
        appId:clientInfo.appId
      }
      await uniImCo.sendMsg(msgData,addData.user_id)
		},
		async beforeDelete({
			where,
			userInfo,
      clientInfo
		}) {
			// console.log('where---', where);
			let {
				group_id,
				user_id
			} = where
			//查群相关信息
			let res = await db.collection('uni-im-group').doc(group_id).get()
      const groupInfo = res.data[0]
      if (groupInfo.user_id == user_id) {
      	throw Error('群主不能退群')
      }
      
      // 操作者不是群主,且不是操作自己退群。时查询操作者的角色,必须是群管理员
      if( ![groupInfo.user_id,user_id].includes(userInfo.uid) ){
        // 查一下当前用户在此群的角色
        let res = await db.collection("uni-im-group-member").where({
          group_id: groupInfo._id,
          user_id: userInfo.uid
        }).get()
        if(res.data.length == 0){
          throw new Error('你不是群成员,不能操作')
        }
        console.log('res.data',res.data);
        if(!res.data[0].role.includes('admin')){
          throw new Error('你不是群管理员,不能操作')
        }
      }
      
      // 通知所有群成员,有用户离开群
      const msgData = {
      	body:{
          user_id_list:[user_id]
        },
        action:"group-expel",
      	type:"system",
      	create_time: Date.now(),
      	conversation_id:"group_"+group_id,
      	group_id,
        appId:clientInfo.appId
      }

      const dbJQL = uniCloud.databaseForJQL({clientInfo});
      let title,content;
      //自己操作的是 主动退出的 否则是被踢掉的
      if (userInfo.uid == user_id) {
        title = '用户退群通知'
        content = "用户退出,群聊:" + groupInfo.name;
      	msgData.action = "group-exit"
      } else {
        title = '用户被踢出群聊通知'
        content = "用户被踢出,群聊:" + groupInfo.name;
      	msgData.action = "group-expel"
      }
      
      await uniImCo.sendMsg(msgData,'system')
      console.log('res',res);
		},
		async afterDelete({
			where,
			userInfo,
			clientInfo
		}) {
			// console.error('2 where---', where);
			let {
				group_id,
				user_id
			} = where

			// 删除相关此用户的会话数据
			let res = await db.collection('uni-im-conversation').where({
				group_id,
				user_id
			}).remove()
			// console.error('Delete uni-im-conversation:', res, where);
		},
    async beforeUpdate({where,updateData,userInfo,docId,clientInfo}){
      
      // 限制群主的不能被修改
      let _id = where._id || docId
      console.log('_id',_id);
      let res = await db.collection('uni-im-group-member').doc(_id).get()
      const member = res.data[0]
      if(member.role.includes("creator")){
        throw Error('群主不能被修改')
      }
      
      //查 当前用户在此群的角色,判断是不是群管理员
      res = await db.collection('uni-im-group-member').where({
        group_id:member.group_id,
        user_id:userInfo.uid,
        role:db.command.in(['admin','creator'])
      }).get()
      
      if(res.data.length === 0){
        throw Error('非群管理员不能修改群成员信息')
      }
      
      if('role' in updateData){
        // 判断传入的role(updateData.role)和 用户原来的userInfo.role,推测出是增加了某个角色还是减少了
        let addRole = updateData.role.filter(v=>!member.role.includes(v))
        let delRole = member.role.filter(v=>!updateData.role.includes(v))
      
        // 通知指定的群
        const msg = {
          appId:clientInfo.appId,
          body: {
            "user_id":member.user_id,
            addRole,
            delRole
          },
          type: "system",
          action:"set-group-admin",
          from_uid: 'system',
          create_time: Date.now(),
          conversation_id: "",
          group_id: member.group_id
        }
        const uniImCo = uniCloud.importObject("uni-im-co")
        return await uniImCo.sendMsg(msg,'system')
      }else{
        console.log('updateData',updateData);
      }
    }
	}
}