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 2022/12/16 11:06:31 UTC

[openmeetings] 01/02: [OPENMEETINGS-2566] Group admin can send invitations to group

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

commit 478d4dca8cdb82434b81b7f0bfd6412bba156510
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Fri Dec 16 18:03:47 2022 +0700

    [OPENMEETINGS-2566] Group admin can send invitations to group
---
 .../apache/openmeetings/db/dao/user/GroupDao.java  |  8 +++--
 .../web/admin/AdminUserChoiceProvider.java         |  2 +-
 .../web/common/GroupChoiceProvider.java            | 21 +++++++-----
 .../web/room/menu/RoomInvitationForm.java          |  2 +-
 .../web/user/calendar/AppointmentDialog.java       |  2 +-
 .../apache/openmeetings/user/TestUserGroup.java    | 38 +++++++++++++++++++++-
 6 files changed, 57 insertions(+), 16 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
index 6acb8fd8f..273672f77 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/GroupDao.java
@@ -43,6 +43,7 @@ import org.springframework.transaction.annotation.Transactional;
 @Transactional
 public class GroupDao implements IGroupAdminDataProviderDao<Group> {
 	private static final List<String> searchFields = List.of("name");
+	private static final List<String> guSearchFields = List.copyOf(searchFields.stream().map(n -> "group." + n).toList());
 	@PersistenceContext
 	private EntityManager em;
 
@@ -82,14 +83,15 @@ public class GroupDao implements IGroupAdminDataProviderDao<Group> {
 
 	private Predicate getAdminFilter(Long adminId, CriteriaBuilder builder, CriteriaQuery<?> query) {
 		Root<GroupUser> root = getRoot(query, GroupUser.class);
-		return builder.and(builder.equal(root.get("user").get("id"), adminId), builder.isTrue(root.get("moderator")));
+		return builder.and(builder.equal(root.get("user").get("id"), adminId)
+						, builder.isTrue(root.get("moderator")));
 	}
 
 	@Override
 	public List<Group> adminGet(String search, Long adminId, long start, long count, SortParam<String> sort) {
 		return DaoHelper.get(em, GroupUser.class, Group.class
 				, (builder, root) -> root.get("group")
-				, true, search, searchFields, true
+				, true, search, guSearchFields, true
 				, (b, q) -> getAdminFilter(adminId, b, q)
 				, sort, start, count);
 	}
@@ -108,7 +110,7 @@ public class GroupDao implements IGroupAdminDataProviderDao<Group> {
 	public long adminCount(String search, Long adminId) {
 		return DaoHelper.count(em, GroupUser.class
 				, (builder, root) -> builder.countDistinct(root.get("group"))
-				, search, searchFields, false
+				, search, guSearchFields, false
 				, (b, q) -> getAdminFilter(adminId, b, q.distinct(true)));
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java
index d17449eba..6452dd050 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/AdminUserChoiceProvider.java
@@ -48,7 +48,7 @@ public abstract class AdminUserChoiceProvider extends ChoiceProvider<User> {
 	@Override
 	public void query(String term, int page, Response<User> response) {
 		response.addAll(userDao.get(term, true, page * PAGE_SIZE, PAGE_SIZE));
-		response.setHasMore(PAGE_SIZE == response.getResults().size());
+		response.setHasMore(page * PAGE_SIZE + response.getResults().size() < userDao.count(term, true, -1L));
 	}
 
 	@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GroupChoiceProvider.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GroupChoiceProvider.java
index d4d4332f7..fb9abd995 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GroupChoiceProvider.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GroupChoiceProvider.java
@@ -19,10 +19,10 @@
 package org.apache.openmeetings.web.common;
 
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
+import static org.apache.openmeetings.web.app.WebSession.getRights;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
 import java.util.Locale;
 
 import org.apache.openmeetings.db.dao.user.GroupDao;
@@ -30,7 +30,7 @@ import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.user.Group;
 import org.apache.openmeetings.db.entity.user.GroupUser;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.web.app.WebSession;
+import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.wicket.injection.Injector;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
@@ -39,6 +39,7 @@ import org.wicketstuff.select2.Response;
 
 public class GroupChoiceProvider extends ChoiceProvider<Group> {
 	private static final long serialVersionUID = 1L;
+	public static final long PAGE_SIZE = 5;
 	@SpringBean
 	private GroupDao groupDao;
 	@SpringBean
@@ -50,13 +51,13 @@ public class GroupChoiceProvider extends ChoiceProvider<Group> {
 
 	@Override
 	public void query(String term, int page, Response<Group> response) {
-		if (WebSession.getRights().contains(User.Right.ADMIN)) {
-			List<Group> groups = groupDao.get(0, Integer.MAX_VALUE);
-			for (Group g : groups) {
-				if (Strings.isEmpty(term) || g.getName().toLowerCase(Locale.ROOT).contains(term.toLowerCase(Locale.ROOT))) {
-					response.add(g);
-				}
-			}
+		long count;
+		if (AuthLevelUtil.hasAdminLevel(getRights())) {
+			count = groupDao.count(term);
+			response.addAll(groupDao.get(term, page * PAGE_SIZE, PAGE_SIZE, null));
+		} else if (AuthLevelUtil.hasGroupAdminLevel(getRights())) {
+			response.addAll(groupDao.adminGet(term, getUserId(), page * PAGE_SIZE, PAGE_SIZE, null));
+			count = groupDao.adminCount(term, getUserId());
 		} else {
 			User u = userDao.get(getUserId());
 			for (GroupUser ou : u.getGroupUsers()) {
@@ -64,7 +65,9 @@ public class GroupChoiceProvider extends ChoiceProvider<Group> {
 					response.add(ou.getGroup());
 				}
 			}
+			count = u.getGroupUsers().size();
 		}
+		response.setHasMore(page * PAGE_SIZE + response.getResults().size() < count);
 	}
 
 	@Override
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
index e06354d4b..65e11512d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/menu/RoomInvitationForm.java
@@ -81,7 +81,7 @@ public class RoomInvitationForm extends InvitationForm {
 	@Override
 	protected void onInitialize() {
 		groups.setLabel(new ResourceModel("126"));
-		boolean showGroups = AuthLevelUtil.hasAdminLevel(getRights());
+		boolean showGroups = AuthLevelUtil.hasAdminLevel(getRights()) || AuthLevelUtil.hasGroupAdminLevel(getRights());
 		add(rdi.add(new AjaxFormChoiceComponentUpdatingBehavior() {
 			private static final long serialVersionUID = 1L;
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index 611338d88..c40359e35 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -370,7 +370,7 @@ public class AppointmentDialog extends Modal<Appointment> {
 			add(feedback.setOutputMarkupId(true));
 			//General
 			add(ownerPanel.add(owner));
-			boolean showGroups = AuthLevelUtil.hasAdminLevel(getRights());
+			boolean showGroups = AuthLevelUtil.hasAdminLevel(getRights()) || AuthLevelUtil.hasGroupAdminLevel(getRights());
 			groups.getSettings().setDropdownParent(AppointmentDialog.this.getMarkupId());
 			add(rdi.add(new AjaxFormChoiceComponentUpdatingBehavior() {
 				private static final long serialVersionUID = 1L;
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
index 5233a9cbb..a0c3a6f8b 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/user/TestUserGroup.java
@@ -20,11 +20,15 @@ package org.apache.openmeetings.user;
 
 import static java.util.UUID.randomUUID;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.openmeetings.AbstractOmServerTest;
 import org.apache.openmeetings.db.dao.user.GroupUserDao;
@@ -66,7 +70,7 @@ class TestUserGroup extends AbstractOmServerTest {
 	void addGroup() {
 		Group g = new Group();
 		g.setName(GROUP_NAME);
-		Long groupId = groupDao.update(g, null).getId(); //inserted by not checked
+		Long groupId = groupDao.update(g, null).getId();
 		assertNotNull(groupId, "New Group have valid id");
 
 		List<GroupUser> ul = groupUserDao.get(groupId, 0, 9999);
@@ -89,6 +93,38 @@ class TestUserGroup extends AbstractOmServerTest {
 		checkEmptyGroup("dao.getByLogin(user)", userDao.getByLogin(u.getLogin(), u.getType(), u.getDomainId()));
 	}
 
+	private Long addGroupUser(User u, String grpNameUq, boolean moderator) {
+		Group g = new Group();
+		g.setName(grpNameUq + randomUUID().toString());
+		g = groupDao.update(g, null);
+		GroupUser gu = new GroupUser(g, u);
+		gu.setModerator(moderator);
+		u.getGroupUsers().add(gu);
+		return g.getId();
+	}
+
+	@Test
+	void groupAdmin() throws Exception {
+		String uuid = randomUUID().toString();
+		User u = getUser(uuid);
+		u.setGroupUsers(new ArrayList<>());
+
+		final String uniquePart = randomUUID().toString().replace('-', '_');
+		Long idG1 = addGroupUser(u, uniquePart, true);
+		Long idG2 = addGroupUser(u, uniquePart, true);
+		Long idG3 = addGroupUser(u, uniquePart, false);
+
+		u = userDao.update(u, null);
+
+		assertEquals(2, groupDao.adminCount(uniquePart, u.getId()), "Count: There should be exatly 2 groups");
+
+		List<Group> groups = groupDao.adminGet(uniquePart, u.getId(), 0, 10, null);
+		assertEquals(2, groups.size(), "List: There should be exatly 2 groups");
+		Set<Long> groupIds = groups.stream().map(Group::getId).collect(Collectors.toSet());
+		assertTrue(groupIds.contains(idG1), "First group should be found");
+		assertTrue(groupIds.contains(idG2), "Second group should be found");
+		assertFalse(groupIds.contains(idG3), "Third group should NOT be found");
+	}
 
 	@Test
 	void addLdapUserWithoutGroup() throws Exception {