Skip to content

Commit baf35f7

Browse files
author
Dominik Frantisek Bucik
committed
feat: 🎸 RPC groupsManager/getGroupsWhereUserIsActiveMember
1 parent 947fe0f commit baf35f7

File tree

10 files changed

+166
-7
lines changed

10 files changed

+166
-7
lines changed

‎perun-base/src/main/resources/perun-roles.yml‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2216,6 +2216,15 @@ perun_policies:
22162216
include_policies:
22172217
- default_policy
22182218

2219+
getGroupsWhereUserIsActiveMember_User_Vo_policy:
2220+
policy_roles:
2221+
- SELF: User
2222+
- PERUNOBSERVER:
2223+
- VOOBSERVER: Vo
2224+
- VOADMIN: Vo
2225+
include_policies:
2226+
- default_policy
2227+
22192228
getRichGroupsAssignedToResourceWithAttributesByNames_Resource_List<String>_policy:
22202229
policy_roles:
22212230
- RESOURCESELFSERVICE: Resource

‎perun-core/src/main/java/cz/metacentrum/perun/core/api/GroupsManager.java‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1513,4 +1513,14 @@ public interface GroupsManager {
15131513
* @throws PrivilegeException if unauthorized
15141514
*/
15151515
List<Group> getAllAllowedGroupsToHierarchicalVo(PerunSession sess, Vo vo, Vo memberVo) throws VoNotExistsException, PrivilegeException;
1516+
1517+
/**
1518+
* Returns groups in which the user is active member. Groups are looked up only for the specified VO
1519+
* @param session session
1520+
* @param user user object
1521+
* @param vo VO object
1522+
* @return List of groups
1523+
*/
1524+
List<Group> getGroupsWhereUserIsActiveMember(PerunSession session, User user, Vo vo) throws VoNotExistsException, UserNotExistsException, PrivilegeException;
1525+
15161526
}

‎perun-core/src/main/java/cz/metacentrum/perun/core/bl/GroupsManagerBl.java‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2191,4 +2191,13 @@ public interface GroupsManagerBl {
21912191
*/
21922192
List<Group> getAllAllowedGroupsToHierarchicalVo(PerunSession sess, Vo vo, Vo memberVo);
21932193

2194+
/**
2195+
* Returns groups in which the user is active member. Groups are looked up only for the specified VO.
2196+
*
2197+
* @param sess session
2198+
* @param user user object
2199+
* @param vo VO object
2200+
* @return List of groups
2201+
*/
2202+
List<Group> getGroupsWhereUserIsActiveMember(PerunSession sess, User user, Vo vo);
21942203
}

‎perun-core/src/main/java/cz/metacentrum/perun/core/blImpl/GroupsManagerBlImpl.java‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6084,4 +6084,11 @@ public List<Group> getAllAllowedGroupsToHierarchicalVo(PerunSession sess, Vo vo)
60846084
public List<Group> getAllAllowedGroupsToHierarchicalVo(PerunSession sess, Vo vo, Vo memberVo) {
60856085
return this.groupsManagerImpl.getAllAllowedGroupsToHierarchicalVo(sess, vo, memberVo);
60866086
}
6087+
6088+
@Override
6089+
public List<Group> getGroupsWhereUserIsActiveMember(PerunSession sess, User user, Vo vo) {
6090+
List<Group> groups = this.groupsManagerImpl.getGroupsWhereUserIsActiveMember(sess, user, vo);
6091+
groups.removeIf(g -> VosManager.MEMBERS_GROUP.equals(g.getName()));
6092+
return groups;
6093+
}
60876094
}

‎perun-core/src/main/java/cz/metacentrum/perun/core/entry/GroupsManagerEntry.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,4 +1746,18 @@ public List<Group> getAllAllowedGroupsToHierarchicalVo(PerunSession sess, Vo vo,
17461746

17471747
return getGroupsManagerBl().getAllAllowedGroupsToHierarchicalVo(sess, vo, memberVo);
17481748
}
1749+
1750+
@Override
1751+
public List<Group> getGroupsWhereUserIsActiveMember(PerunSession sess, User user, Vo vo)
1752+
throws VoNotExistsException, UserNotExistsException, PrivilegeException {
1753+
Utils.checkPerunSession(sess);
1754+
getPerunBl().getVosManagerBl().checkVoExists(sess, vo);
1755+
getPerunBl().getUsersManagerBl().checkUserExists(sess, user);
1756+
1757+
if (!AuthzResolver.authorizedInternal(sess, "getGroupsWhereUserIsActiveMember_User_Vo_policy", user, vo)) {
1758+
throw new PrivilegeException(sess, "getGroupsWhereUserIsActiveMember");
1759+
}
1760+
1761+
return getGroupsManagerBl().getGroupsWhereUserIsActiveMember(sess, user, vo);
1762+
}
17491763
}

‎perun-core/src/main/java/cz/metacentrum/perun/core/impl/GroupsManagerImpl.java‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,6 +1469,18 @@ public List<Group> getAllAllowedGroupsToHierarchicalVo(PerunSession sess, Vo vo,
14691469
}
14701470
}
14711471

1472+
@Override
1473+
public List<Group> getGroupsWhereUserIsActiveMember(PerunSession sess, User user, Vo vo) {
1474+
try {
1475+
return jdbc.query("SELECT " + groupMappingSelectQuery + " FROM groups WHERE groups.vo_id=? AND groups.id IN " +
1476+
"(SELECT groups_members.group_id FROM groups_members WHERE groups_members.source_group_status = ? AND groups_members.member_id IN " +
1477+
"(SELECT members.id FROM members WHERE members.user_id = ? AND members.vo_id = ?))",
1478+
GROUP_MAPPER, vo.getId(), MemberGroupStatus.VALID.getCode(), user.getId(), vo.getId());
1479+
} catch (RuntimeException e) {
1480+
throw new InternalErrorException(e);
1481+
}
1482+
}
1483+
14721484
private String getSQLWhereForGroupsPage(GroupsPageQuery query, MapSqlParameterSource namedParams) {
14731485
if (isEmpty(query.getSearchString())) {
14741486
return "";

‎perun-core/src/main/java/cz/metacentrum/perun/core/implApi/GroupsManagerImplApi.java‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,4 +1025,15 @@ public interface GroupsManagerImplApi {
10251025
* @return list of allowed groups to hierarchical VO
10261026
*/
10271027
List<Group> getAllAllowedGroupsToHierarchicalVo(PerunSession sess, Vo vo, Vo memberVo);
1028+
1029+
1030+
/**
1031+
* Returns groups in which the user is active member. Groups are looked up only for the specified VO.
1032+
*
1033+
* @param sess session
1034+
* @param user user object
1035+
* @param vo VO object
1036+
* @return List of groups
1037+
*/
1038+
List<Group> getGroupsWhereUserIsActiveMember(PerunSession sess, User user, Vo vo);
10281039
}

‎perun-core/src/test/java/cz/metacentrum/perun/core/entry/GroupsManagerEntryIntegrationTest.java‎

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
import cz.metacentrum.perun.core.api.MembershipType;
1919
import cz.metacentrum.perun.core.api.Paginated;
2020
import cz.metacentrum.perun.core.api.PerunClient;
21-
import cz.metacentrum.perun.core.api.PerunSession;
2221
import cz.metacentrum.perun.core.api.PerunPrincipal;
22+
import cz.metacentrum.perun.core.api.PerunSession;
2323
import cz.metacentrum.perun.core.api.Resource;
2424
import cz.metacentrum.perun.core.api.RichGroup;
2525
import cz.metacentrum.perun.core.api.RichMember;
@@ -35,7 +35,6 @@
3535
import cz.metacentrum.perun.core.api.exceptions.ExternallyManagedException;
3636
import cz.metacentrum.perun.core.api.exceptions.GroupExistsException;
3737
import cz.metacentrum.perun.core.api.exceptions.GroupMoveNotAllowedException;
38-
import cz.metacentrum.perun.core.api.exceptions.GroupNotAllowedToAutoRegistrationException;
3938
import cz.metacentrum.perun.core.api.exceptions.GroupNotExistsException;
4039
import cz.metacentrum.perun.core.api.exceptions.GroupRelationAlreadyExists;
4140
import cz.metacentrum.perun.core.api.exceptions.GroupRelationCannotBeRemoved;
@@ -54,12 +53,9 @@
5453
import cz.metacentrum.perun.core.bl.UsersManagerBl;
5554
import cz.metacentrum.perun.core.impl.PerunSessionImpl;
5655
import cz.metacentrum.perun.core.implApi.modules.attributes.AbstractMembershipExpirationRulesModule;
57-
import cz.metacentrum.perun.registrar.model.ApplicationFormItem;
5856
import org.junit.Before;
5957
import org.junit.Test;
60-
import org.mockito.Mockito;
6158
import org.springframework.util.Assert;
62-
import org.testcontainers.shaded.com.fasterxml.jackson.databind.annotation.JsonAppend;
6359

6460
import java.time.LocalDate;
6561
import java.util.ArrayList;
@@ -80,7 +76,6 @@
8076
import static org.junit.Assert.assertEquals;
8177
import static org.junit.Assert.assertFalse;
8278
import static org.junit.Assert.assertNotNull;
83-
import static org.junit.Assert.assertNull;
8479
import static org.junit.Assert.assertSame;
8580
import static org.junit.Assert.assertTrue;
8681

@@ -6534,6 +6529,63 @@ public void getAllAllowedGroupsToHierarchicalVoWithMemberVo() throws Exception {
65346529
assertEquals(group2, result.get(0));
65356530
}
65366531

6532+
@Test
6533+
public void getGroupsWhereUserIsActiveMember() throws Exception {
6534+
System.out.println(CLASS_NAME + "getGroupsWhereUserIsActiveMember");
6535+
6536+
Vo vo = setUpVo();
6537+
Member member = setUpMember(vo);
6538+
User user = perun.getUsersManagerBl().getUserById(sess, member.getUserId());
6539+
6540+
groupsManager.createGroup(sess, vo, group);
6541+
groupsManager.createGroup(sess, vo, group2);
6542+
groupsManager.createGroup(sess, group2, group3);
6543+
groupsManager.createGroup(sess, group2, group4);
6544+
groupsManager.createGroup(sess, group3, group5);
6545+
groupsManager.createGroup(sess, group4, group6);
6546+
6547+
groupsManagerBl.addMember(sess, group, member);
6548+
groupsManagerBl.addMember(sess, group2, member);
6549+
groupsManagerBl.addMember(sess, group6, member);
6550+
6551+
List<Group> result = groupsManager.getGroupsWhereUserIsActiveMember(sess, user, vo);
6552+
6553+
assertEquals(4, result.size());
6554+
assertTrue(result.contains(group));
6555+
assertTrue(result.contains(group2));
6556+
assertTrue(result.contains(group4)); //indirect member
6557+
assertTrue(result.contains(group6));
6558+
}
6559+
6560+
@Test
6561+
public void getGroupsWhereUserIsActiveMemberInactiveInGroup() throws Exception {
6562+
System.out.println(CLASS_NAME + "getGroupsWhereUserIsActiveMemberInactiveInGroup");
6563+
6564+
Vo vo = setUpVo();
6565+
Member member = setUpMember(vo);
6566+
User user = perun.getUsersManagerBl().getUserById(sess, member.getUserId());
6567+
6568+
groupsManager.createGroup(sess, vo, group);
6569+
groupsManager.createGroup(sess, vo, group2);
6570+
groupsManager.createGroup(sess, group2, group3);
6571+
groupsManager.createGroup(sess, group2, group4);
6572+
groupsManager.createGroup(sess, group3, group5);
6573+
groupsManager.createGroup(sess, group4, group6);
6574+
6575+
groupsManagerBl.addMember(sess, group, member);
6576+
groupsManagerBl.addMember(sess, group2, member);
6577+
groupsManagerBl.addMember(sess, group6, member);
6578+
groupsManager.setMemberGroupStatus(sess, member, group6, MemberGroupStatus.EXPIRED);
6579+
6580+
List<Group> result = groupsManager.getGroupsWhereUserIsActiveMember(sess, user, vo);
6581+
6582+
assertEquals(2, result.size());
6583+
assertTrue(result.contains(group));
6584+
assertTrue(result.contains(group2));
6585+
assertFalse(result.contains(group4)); //indirect member expired
6586+
assertFalse(result.contains(group6)); //expired member
6587+
}
6588+
65376589
// PRIVATE METHODS -------------------------------------------------------------
65386590

65396591
private Vo setUpVo() throws Exception {

‎perun-openapi/openapi.yml‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13888,7 +13888,6 @@ paths:
1388813888
$ref: '#/components/responses/ListOfGroupsResponse'
1388913889
default:
1389013890
$ref: '#/components/responses/ExceptionResponse'
13891-
1389213891
/json/groupsManager/getGroupsWhereMemberIsActive:
1389313892
get:
1389413893
tags:
@@ -13902,6 +13901,20 @@ paths:
1390213901
$ref: '#/components/responses/ListOfGroupsResponse'
1390313902
default:
1390413903
$ref: '#/components/responses/ExceptionResponse'
13904+
/json/groupsManager/getGroupsWhereUserIsActiveMember:
13905+
get:
13906+
tags:
13907+
- GroupsManager
13908+
operationId: getGroupsWhereUserIsActiveMember
13909+
summary: Returns list of groups where user is member in active state. Groups are looked up only for the specfied VO.
13910+
parameters:
13911+
- $ref: '#/components/parameters/userId'
13912+
- $ref: '#/components/parameters/voId'
13913+
responses:
13914+
'200':
13915+
$ref: '#/components/responses/ListOfGroupsResponse'
13916+
default:
13917+
$ref: '#/components/responses/ExceptionResponse'
1390513918

1390613919
#################################################
1390713920
# #

‎perun-rpc/src/main/java/cz/metacentrum/perun/rpc/methods/GroupsManagerMethod.java‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1880,6 +1880,28 @@ public List<Group> call(ApiCaller ac, Deserializer parms) throws PerunException
18801880
}
18811881
},
18821882

1883+
/*#
1884+
* Returns all user's groups where user is in active state (is valid there) and are subgroups of the specified VO
1885+
* Excluded members group.
1886+
*
1887+
* @throw UserNotExistsException When the user does not exist
1888+
* @throw VoNotExistsException When the vo doesn't exist
1889+
*
1890+
* @param user int <code>id</code> of user
1891+
* @param vo int <code>id</code> of vo in which groups are looked up
1892+
* @return List<Group> Groups where user is in active state (valid), if the user is member of the given vo
1893+
*/
1894+
getGroupsWhereUserIsActiveMember {
1895+
@Override
1896+
public List<Group> call(ApiCaller ac, Deserializer parms) throws PerunException {
1897+
return ac.getGroupsManager().getGroupsWhereUserIsActiveMember(
1898+
ac.getSession(),
1899+
ac.getUserById(parms.readInt("user")),
1900+
ac.getVoById(parms.readInt("vo"))
1901+
);
1902+
}
1903+
},
1904+
18831905
/*#
18841906
* Return all members of the group who are active (valid) in the group.
18851907
*

0 commit comments

Comments
 (0)