You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2019/12/18 15:12:26 UTC

[openmeetings] branch master updated: [OPENMEETINGS-2010] private chats are being closed on room exit

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 6716a9d  [OPENMEETINGS-2010] private chats are being closed on room exit
6716a9d is described below

commit 6716a9dcfd53451e4056ce0b552fa270d82bb7d3
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Wed Dec 18 22:12:13 2019 +0700

    [OPENMEETINGS-2010] private chats are being closed on room exit
---
 .../apache/openmeetings/db/dao/basic/ChatDao.java  |  8 ++++++
 .../openmeetings/db/entity/basic/ChatMessage.java  | 29 ++++++++++++++++++++--
 .../apache/openmeetings/web/room/RoomPanel.java    |  2 ++
 .../openmeetings/web/room/menu/RoomMenuPanel.java  |  5 ++++
 .../apache/openmeetings/web/user/chat/raw-chat.js  |  6 +++++
 5 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
index c0620ab..2624887 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ChatDao.java
@@ -70,10 +70,18 @@ public class ChatDao {
 	public List<ChatMessage> getUserRecent(long userId, Date date, long start, long count) {
 		return setLimits(em.createNamedQuery("getChatMessagesByUserTime", ChatMessage.class)
 					.setParameter(PARAM_USER_ID, userId)
+					.setParameter("status", ChatMessage.Status.CLOSED)
 					.setParameter("date", date)
 				, start, count).getResultList();
 	}
 
+	public void closeMessages(long userId) {
+		em.createNamedQuery("chatCloseMessagesByUser")
+			.setParameter(PARAM_USER_ID, userId)
+			.setParameter("status", ChatMessage.Status.CLOSED)
+			.executeUpdate();
+	}
+
 	public ChatMessage update(ChatMessage entity) {
 		return update(entity, null);
 	}
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
index d1b1073..db801d0 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/basic/ChatMessage.java
@@ -22,6 +22,8 @@ import java.util.Date;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
@@ -44,10 +46,15 @@ import org.simpleframework.xml.Root;
 @NamedQuery(name = "getGlobalChatMessages", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL ORDER BY c.sent DESC")
 @NamedQuery(name = "getChatMessagesByRoom", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId"
 		+ " AND (true = :all OR (false = :all AND c.needModeration = false)) ORDER BY c.sent DESC")
-@NamedQuery(name = "getChatMessagesByUser", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
+@NamedQuery(name = "getChatMessagesByUser", query = "SELECT c FROM ChatMessage c WHERE "
+		+ "c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
 		+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) ORDER BY c.sent DESC")
-@NamedQuery(name = "getChatMessagesByUserTime", query = "SELECT c FROM ChatMessage c WHERE c.toUser IS NOT NULL AND c.toRoom IS NULL AND "
+@NamedQuery(name = "getChatMessagesByUserTime", query = "SELECT c FROM ChatMessage c WHERE "
+		+ "c.toUser IS NOT NULL AND c.toRoom IS NULL AND c.status <> :status AND "
 		+ "(c.fromUser.id = :userId OR c.toUser.id = :userId) AND c.sent > :date ORDER BY c.sent DESC")
+@NamedQuery(name = "chatCloseMessagesByUser", query = "UPDATE ChatMessage c SET c.status = :status WHERE "
+		+ "c.toUser IS NOT NULL AND c.toRoom IS NULL AND c.status <> :status AND "
+		+ "(c.fromUser.id = :userId OR c.toUser.id = :userId)")
 @NamedQuery(name = "deleteChatGlobal", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom IS NULL")
 @NamedQuery(name = "deleteChatRoom", query = "DELETE FROM ChatMessage c WHERE c.toUser IS NULL AND c.toRoom.id = :roomId")
 @NamedQuery(name = "deleteChatUser", query = "DELETE FROM ChatMessage c WHERE c.toRoom IS NULL AND c.toUser.id = :userId")
@@ -57,6 +64,11 @@ import org.simpleframework.xml.Root;
 public class ChatMessage implements IDataProviderEntity {
 	private static final long serialVersionUID = 1L;
 
+	public enum Status {
+		OPEN
+		, CLOSED
+	}
+
 	@Id
 	@GeneratedValue(strategy = GenerationType.IDENTITY)
 	@Column(name = "id")
@@ -98,6 +110,11 @@ public class ChatMessage implements IDataProviderEntity {
 	@Element(name = "from_name", data = true, required = false)
 	private String fromName; // this is required for users with no first/last name specified
 
+	@Column(name = "status")
+	@Element(data = true, required = false)
+	@Enumerated(EnumType.STRING)
+	private Status status;
+
 	@Override
 	public Long getId() {
 		return id;
@@ -163,4 +180,12 @@ public class ChatMessage implements IDataProviderEntity {
 	public void setFromName(String fromName) {
 		this.fromName = fromName;
 	}
+
+	public Status getStatus() {
+		return status;
+	}
+
+	public void setStatus(Status status) {
+		this.status = status;
+	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
index 17884d2..81e174f 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPanel.java
@@ -19,6 +19,7 @@
 package org.apache.openmeetings.web.room;
 
 import static java.time.Duration.ZERO;
+import static org.apache.openmeetings.core.util.ChatWebSocketHelper.ID_USER_PREFIX;
 import static org.apache.openmeetings.web.app.WebSession.getDateFormat;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.room.wb.InterviewWbPanel.INTERVIEWWB_JS_REFERENCE;
@@ -467,6 +468,7 @@ public class RoomPanel extends BasePanel {
 					case roomExit:
 						sidebar.update(handler);
 						sidebar.addActivity(new Activity(m, Activity.Type.roomExit), handler);
+						handler.appendJavaScript("Chat.removeTab('" + ID_USER_PREFIX + m.getUserId() + "');");
 						break;
 					case roomClosed:
 						handler.add(room.setVisible(false));
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
index 64be71f..28e6447 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomMenuPanel.java
@@ -22,6 +22,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_TITLE;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
 import static org.apache.openmeetings.web.util.GroupLogoResourceReference.getUrl;
 import static org.apache.openmeetings.web.util.OmUrlFragment.ROOMS_PUBLIC;
 
@@ -33,6 +34,7 @@ import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.openmeetings.core.remote.KurentoHandler;
 import org.apache.openmeetings.core.remote.StreamProcessor;
 import org.apache.openmeetings.core.util.WebSocketHelper;
+import org.apache.openmeetings.db.dao.basic.ChatDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -104,6 +106,8 @@ public class RoomMenuPanel extends Panel {
 	@SpringBean
 	private ConfigurationDao cfgDao;
 	@SpringBean
+	private ChatDao chatDao;
+	@SpringBean
 	private KurentoHandler kHandler;
 	@SpringBean
 	private StreamProcessor streamProcessor;
@@ -137,6 +141,7 @@ public class RoomMenuPanel extends Panel {
 
 			@Override
 			public void onClick(AjaxRequestTarget target) {
+				chatDao.closeMessages(getUserId());
 				exit(target);
 			}
 		};
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
index 5cc09cc..0b0697d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/raw-chat.js
@@ -362,6 +362,12 @@ var Chat = function() {
 	}
 	function _setRoomMode(_mode) {
 		roomMode = _mode;
+		if (isInited() && !roomMode) {
+			// remove all private chats on room exit
+			$('li[aria-controls^="chatTab-u"]').remove();
+			$('div[id^="chatTab-u"]').remove();
+			tabs.tabs("refresh");
+		}
 		_reinit({userId: userId, all: allPrefix, room: roomPrefix, sendOnEnter: sendOn === SEND_ENTER});
 	}
 	function _scrollDown(area) {