uni-im-group-member.schema.ext.js 7.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
// 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')
      }
DCloud_JSON's avatar
3.4.31  
DCloud_JSON 已提交
55
      triggerContext.groupInfo = res.data[0]
DCloud_JSON's avatar
DCloud_JSON 已提交
56 57 58 59 60 61
    },
		async afterCreate({
			addDataList,
			clientInfo,
      userInfo,
      result,
DCloud_JSON's avatar
3.4.31  
DCloud_JSON 已提交
62
      triggerContext
DCloud_JSON's avatar
DCloud_JSON 已提交
63 64 65 66
		}) {
      // before中已校验: jql方式创建uni-im-group-member,️只能创建一条数据 
			let [addData] = addDataList
      addData._id = result.id
DCloud_JSON's avatar
3.4.31  
DCloud_JSON 已提交
67
      const {user_id,group_id} = addData
DCloud_JSON's avatar
DCloud_JSON 已提交
68 69 70 71 72 73
      // 通知所有群成员,有用户加入群聊
      console.log('通知所有群成员,有用户加入群聊')
      const msgData = {
      	body:{
          new_member_list:[addData],
          // 冗余字段记录成员id,方便客户端显示
DCloud_JSON's avatar
3.4.31  
DCloud_JSON 已提交
74
          user_id_list:[user_id]
DCloud_JSON's avatar
DCloud_JSON 已提交
75 76 77 78
        },
        action:"join-group",
      	type:"system",
      	create_time: Date.now(),
DCloud_JSON's avatar
3.4.31  
DCloud_JSON 已提交
79 80
      	conversation_id:"group_" + group_id,
      	group_id,
DCloud_JSON's avatar
DCloud_JSON 已提交
81 82
        appId:clientInfo.appId
      }
DCloud_JSON's avatar
3.4.31  
DCloud_JSON 已提交
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
      // 更新群成员数量
      await db.collection('uni-im-group')
              .doc(group_id)
              .update({
                member_count:db.command.inc(1)
              })
      await uniImCo.sendMsg(msgData,user_id)
      if(triggerContext.groupInfo?.type === "dcloud-plugin"){
        // 刷新记录在im系统中的 插件订单信息
        try{
          console.error('加入了dcloud-plugin',triggerContext.groupInfo)
          const uniImRobot = uniCloud.importObject("uni-im-robot")
          await uniImRobot.refreshPluginOrder({
            plugin_id:triggerContext.groupInfo.ext.dcloud_plugin_id,
            user_id,
            group_id
          })
        }catch(e){
          console.error('刷新记录在im系统中的 插件订单信息 错误',e)
        }
      }
DCloud_JSON's avatar
DCloud_JSON 已提交
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
		},
		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);
DCloud_JSON's avatar
3.4.31  
DCloud_JSON 已提交
184 185 186 187 188 189
      // 更新群成员数量
      await db.collection('uni-im-group')
              .doc(group_id)
              .update({
                member_count:db.command.inc(-1)
              })
DCloud_JSON's avatar
DCloud_JSON 已提交
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
		},
    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);
      }
    }
	}
}