| 
					
				 | 
			
			
				@ -51,26 +51,28 @@ router.post(APIv1.Chats.SM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 字段判断 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    if (message.to == null || message.title == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 406, message: 'Missing fields.'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var testing = objectUtil.fieldsCheck(message, "to", "title", "summary", "contentType", "content"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    if (!testing.pass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 406, message: testing.message} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 消息处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    user.getUserStatus(message.to, function (err, userStatus) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    user.getUserStatus(message.to, function (err, rows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            console.log("Lookup system message receiver failed: ", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw {httpStatus: 500, message: "Lookup system message receiver failed: "}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(userStatus.length == 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw {httpStatus: 404, message: "User not found."}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.status(500).send({message: "Lookup system message receiver failed."}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        res.writeHead(200); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (rows.length == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.status(404).send({message: "User not found: " + message.to}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        var pushable = userStatus.length > 0 && userStatus[0].is_online; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        var notifyMessage = JSON.stringify({type: message.contentType, content: message.content}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        var pushable = rows.length > 0 && rows[0].is_online; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        var notifyMessage = JSON.stringify({type: 'system_msg', content: message.content}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        var userStatus = rows[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        // 保存该条推送信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        systemMsg.save(message.to, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -80,12 +82,15 @@ router.post(APIv1.Chats.SM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            message.content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.error("Save system message failed, ", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.error("Save system notify message failed, ", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    throw {httpStatus: 500, message: "Save system message failed."}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    res.status(500).send({message: "Save system notify message failed."}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    // 先结束网络连接,再处理后续操作,减少客户端等待 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    res.status(200).send(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    // 保存通知到数据库中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    notifyMessage.saveMessage(message.to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    notifyMsg.save(message.to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        message.title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        message.summary, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -93,12 +98,12 @@ router.post(APIv1.Chats.SM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        pushable, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                log.error("Save system message failed, ", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                log.error("Save system notify message failed, ", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                throw {httpStatus: 500, message: "Save system notify message failed."}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                res.status(500).send({message: "Save system notify message failed."}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                if (pushable == true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    if (userStatus.platform == PLATFORMS.iOS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                if (pushable) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    if (userStatus.platform === PLATFORMS.iOS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        getui.pushAPN(message.to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            userStatus.token, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            message.contentType, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -108,7 +113,7 @@ router.post(APIv1.Chats.SM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                err != null ? console.log(err) : console.log(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    } else if (PLATFORMS.iOS.Android) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    } else if (userStatus.platform === PLATFORMS.Android) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        getui.pushAndroid(userStatus.client_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            message.title, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -125,8 +130,6 @@ router.post(APIv1.Chats.SM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    res.writeHead(200); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -153,57 +156,50 @@ router.post(APIv1.Chats.PM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 字段判断 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    if (message.from == null || message.to == null || message.contentType == null || message.content == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 406, message: 'Missing fields.'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var testing = objectUtil.fieldsCheck(message, "from", "to", "contentType", "content"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    if (!testing.pass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 406, message: testing.message} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 处理消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    user.isExist(message.to, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    user.isExist(message.to, function (err, rows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            console.log('Lookup receiving users failed: ', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw {httpStatus: 500, message: 'Lookup receiving users failed.'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.status(500).send({message: 'Lookup receiving users failed.'}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (result.length == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw {httpStatus: 404, message: 'Receiving users not found.'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (rows.length == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.status(404).send({message: 'Receiving users not found.'}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        // 保存消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        privateMsg.save(message.to, message.from, message.contentType, message.content, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw {httpStatus: 500, message: 'Save private message failed.'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                res.status(500).send({message: 'Save private message failed.'}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.writeHead(200); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 结束网络连接,后续操作继续执行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.status(200).send(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 更新自身的聊天统计信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            msgStats.updateP2PChatInfo(message.from, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.from, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                CHANNELS.Private, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) log.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            msgStats.updateP2PChatInfo(message.from, message.to, message.from, message.contentType, message.content, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (err) log.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 更新对端的聊天统计信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            msgStats.updateP2PChatInfo(message.to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.from, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.from, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) log.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            msgStats.updateP2PChatInfo(message.to, message.from, message.from, message.contentType, message.content, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (err) log.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 获取对方状态,即对端的系统平台,token等信息,并推送通知消息给对端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            user.getUserStatus(message.to, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.error('Get users status failed: ' + message.to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    throw {httpStatus: 500, message: 'Find target users failed.'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.error('Get target user status for private message failed: ' + message.to); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                // 构建通知消息 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -228,57 +224,49 @@ router.post(APIv1.Chats.PM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                var notifyMessage = JSON.stringify({type: 'p2p_msg', from: message.from}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                var notifyMessage = JSON.stringify({type: 'p2p_msg', from_uid: message.from}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                // 保存通知消息到数据库中并根据用户在线状态推送此消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                notifyMsg.saveNotifyMessage(message.to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    notifyMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    pushable, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            log.error('Save private notify message failed, ', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (pushable === true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                if (data.platform === PLATFORMS.iOS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    getui.pushAPN(message.to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        data.token, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        notifyMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            if (err != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                console.log(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                console.log(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                } else if (data.platform === PLATFORMS.Android) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    getui.pushAndroid(data.client_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        notifyMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        data.status, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            if (err != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                console.log(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                console.log(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                notifyMsg.save(message.to, message.contentType, title, content, notifyMessage, pushable, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        log.error('Save private notify message failed, ', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        if (pushable === true) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (target.platform === PLATFORMS.iOS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                getui.pushAPN(message.to, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    target.token, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    notifyMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        if (err != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            console.log(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            console.log(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            } else if (target.platform === PLATFORMS.Android) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                getui.pushAndroid(data.client_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    notifyMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    target.status, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        if (err != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            console.log(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            console.log(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    res.writeHead(200); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -304,58 +292,62 @@ router.post(APIv1.Chats.GM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 字段判断 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    if (message.from == null || message.group == null || message.contentType == null || message.content == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 406, message: 'Missing fields.'} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var testing = objectUtil.fieldsCheck(message, 'from', 'at', 'group', 'groupType', 'contentType', 'content'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    if (!testing.pass) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 406, message: testing.message} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    // 消息处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    group.isGroupMember(message.group, message.groupType, message.from, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw {httpStatus: 500, message: 'Check group member failed.'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            log.error('Check group member failed: ', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.status(500).send({message: 'Check group member failed.'}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (result.length == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            throw {httpStatus: 404, message: 'Group member not found. Member id: ' + message.from}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.status(404).send({message: 'Member with id "' + message.from + '" is not in group "' + message.group + '"'}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        // 保存群组消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        groupMsg.saveMessage(message.from, message.group, message.at, message.contentType, message.content, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        groupMsg.save(message.from, message.group, message.at, message.contentType, message.content, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                throw {httpStatus: 500, message: 'Save group message failed.'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                log.error('Save group message failed: ', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                res.status(500).send({message: 'Save group message failed.'}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.writeHead(200); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 统计信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            msgStats.updateGroupChatInfo(message.from, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.group, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.from, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                message.content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (err) log.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 关闭网络连接后执行后续操作 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            res.status(200).send(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 更新组内统计信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            msgStats.updateGroupChatInfo(message.from, message.group, message.from, 0, message.contentType, message.content, false, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (err) log.error(err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // 推送通知消息给群组成员 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            group.getMembers(message.group, message.groupType, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.error('Get group members failed: ', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    throw {httpStatus: 500, message: 'Get group members failed.'}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (result.length == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.warn('No members in group ', message.group); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    log.warn('No members in group ', message.group, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        message.groupType === GROUP_TYPE.AdminTeam ? " of admin team." : "of discussion group."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                // 逐个推送通知 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                for (var nIndex = 0; nIndex < result.length; nIndex++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    var member = result[nIndex]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (member.member_code === message.from) continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (member.user_id === message.from) continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    user.getUserStatus(member.member_code, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    user.getUserStatus(member.user_id, function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            console.error('Get group member status failed: ', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            return; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -378,13 +370,15 @@ router.post(APIv1.Chats.GM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        var pushable = result.length > 0 && result[0].is_online === 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        var notifyMessage = JSON.stringify({type: 'group_msg', groupId: message.group}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        var notifyMessage = JSON.stringify({type: 'group_msg', gid: message.group}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        // 发送并保存通知到数据库中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        if (pushable) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (data.platform === PLATFORMS.iOS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                getui.pushAPN(member.member_code, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    data.token, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            var userStatus = result[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            if (userStatus.platform === PLATFORMS.iOS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                getui.pushAPN(member.user_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    userStatus.token, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    content, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -393,7 +387,7 @@ router.post(APIv1.Chats.GM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        err != null ? console.error(err) : console.log(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        // 这段代码重复 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        notifyMsg.saveNotifyMessage(member.member_code, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        notifyMsg.save(member.user_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            content, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -407,18 +401,18 @@ router.post(APIv1.Chats.GM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            } else if (data.platform === PLATFORMS.Android) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            } else if (userStatus.platform === PLATFORMS.Android) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                getui.pushAndroid(data.client_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    content, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    notifyMessage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    data.status, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    userStatus.status, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                    function (err, result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        err != null ? console.error(err) : console.log(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        // 这段代码重复 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        notifyMsg.saveNotifyMessage(member.member_code, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                        notifyMsg.save(member.user_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                            content, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -435,7 +429,7 @@ router.post(APIv1.Chats.GM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            // 这段代码重复 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            notifyMsg.saveNotifyMessage(member.member_code, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            notifyMsg.save(member.user_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                message.contentType, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                content, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -451,13 +445,11 @@ router.post(APIv1.Chats.GM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    // 统计信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    // 统计'@'信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    var at = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (message.at == member.member_code) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        at = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if (message.at == member.user_id) at = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    msgStats.updateGroupChatInfo(member.member_code, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    msgStats.updateGroupChatInfo(member.user_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        message.group, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        message.from, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        at, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -489,7 +481,7 @@ router.post(APIv1.Chats.GM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * 请求URL: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 *  /pm?user_id=sand&peer_id=Rose&message_start_id=0&count=20 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				router.get(APIv1.Chats.PM, function (req, res)  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				router.get(APIv1.Chats.PM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var userId = req.query.user_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var peerId = req.query.peer_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var msgStartId = req.query.message_start_id === null ? MAX_INT : parseInt(req.query.message_start_id); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -499,7 +491,7 @@ router.get(APIv1.Chats.PM, function (req, res)  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 400, message: "Missing field."}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    privateMsg.findMessage(userId, peerId, msgStartId, count, function (err, rows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    privateMsg.findByGroupId(userId, peerId, msgStartId, count, function (err, rows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            log.error("Get private message failed, ", err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -537,7 +529,7 @@ router.get(APIv1.Chats.PM, function (req, res)  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * 请求URL: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 *  /gm?user_id=sand&group_id=discussionGroup&message_start_id=0&count=20 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				router.get(APIv1.Chats.GM, function (req, res)  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				router.get(APIv1.Chats.GM, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var groupId = req.query.group_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var userId = req.query.user_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var msgStartId = req.query.message_start_id === null ? MAX_INT : parseInt(req.query.message_start_id); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -547,7 +539,7 @@ router.get(APIv1.Chats.GM, function (req, res)  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 400, message: "Missing field."}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    groupMsg.findMessage(groupId, msgStartId, count, function (err, rows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    groupMsg.findByGroupId(groupId, msgStartId, count, function (err, rows) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (err) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            console.log('Get group message failed: ', err); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -718,8 +710,8 @@ router.get(APIv1.Chats.GMStats, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 *  peer_id:聊天对端id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				router.get(APIv1.Chats.PMStats, function (req, res) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var userId =  req.query.user_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var peerId =  req.query.peer_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var userId = req.query.user_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    var peerId = req.query.peer_id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    if (userId == null || peerId == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        throw {httpStatus: 406, message: "Missing fields."}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 |