Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added count in get all usergroups operation result. #397

Merged
merged 6 commits into from
Jan 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import it.geosolutions.geostore.core.model.Resource;
import it.geosolutions.geostore.core.model.User;

public interface PermissionService {
public interface ResourcePermissionService {
/**
* This method allows us to know if we filter out "unadvertised" resources for
* non-admin/non-owners, keeping only owned resources.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,15 +140,15 @@ List<ShortResource> updateSecurityRules(
UserGroup get(String name);

/**
* Returns the amount of groups that match searching criteria. The 'everyone' group is never
* included.
* Returns the amount of groups that match searching criteria.
*
* @param authUser the user that performs the research
* @param nameLike a sub-string to search in group name
* @param all if <code>true</code> adds to result the 'everyone' group if it matches the
* searching criteria
* @return the amount of groups that match searching criteria
* @throws BadRequestServiceEx
*/
long getCount(User authUser, String nameLike) throws BadRequestServiceEx;
long getCount(String nameLike, boolean all) throws BadRequestServiceEx;

/**
* Returns the amount of groups that match searching criteria.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import java.util.List;
import java.util.function.BiFunction;

public class PermissionServiceImpl implements PermissionService {
public class ResourcePermissionServiceImpl implements ResourcePermissionService {

private final BiFunction<SecurityRule, Resource, Boolean> resourceOwnership =
(rule, resource) -> resource.getId().equals(rule.getResource().getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ public class ResourceServiceImpl implements ResourceService {
private SecurityDAO securityDAO;

private UserService userService;
private PermissionService permissionService;

private ResourcePermissionService resourcePermissionService;

/** @param securityDAO the securityDAO to set */
public void setSecurityDAO(SecurityDAO securityDAO) {
Expand Down Expand Up @@ -122,8 +123,8 @@ public void setUserService(UserService userService) {
this.userService = userService;
}

public void setPermissionService(PermissionService permissionService) {
this.permissionService = permissionService;
public void setResourcePermissionService(ResourcePermissionService resourcePermissionService) {
this.resourcePermissionService = resourcePermissionService;
}

/*
Expand Down Expand Up @@ -702,15 +703,15 @@ private List<ShortResource> convertToShortResourceList(List<Resource> resources,
userService.fetchSecurityRules(user);

return resources.stream()
.filter(r -> permissionService.isResourceAvailableForUser(r, user))
.filter(r -> resourcePermissionService.isResourceAvailableForUser(r, user))
.map(r -> createShortResource(user, r))
.collect(Collectors.toList());
}

private ShortResource createShortResource(User user, Resource resource) {
ShortResource shortResource = new ShortResource(resource);

if (user != null && permissionService.canUserWriteResource(user, resource)) {
if (user != null && resourcePermissionService.canUserWriteResource(user, resource)) {
shortResource.setCanEdit(true);
shortResource.setCanDelete(true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ public List<UserGroup> getAll(Integer page, Integer entries, String nameLike, bo
}

private Search createGetAllSearchCriteria(
Integer page, Integer entries, String nameLike, boolean all)
Integer page, Integer entries, String nameLike, boolean includeReserved)
throws BadRequestServiceEx {

if (((page != null) && (entries == null)) || ((page == null) && (entries != null))) {
Expand All @@ -258,7 +258,7 @@ private Search createGetAllSearchCriteria(
searchCriteria.addFilterILike("groupName", nameLike);
}

if (!all) {
if (!includeReserved) {
searchCriteria.addFilterNotEqual("groupName", GroupReservedNames.EVERYONE.groupName());
}

Expand Down Expand Up @@ -396,12 +396,17 @@ public UserGroup get(String name) {
}

@Override
public long getCount(User user, String nameLike, boolean all) throws BadRequestServiceEx {
if (user == null) throw new BadRequestServiceEx("User must be defined.");
public long getCount(String nameLike, boolean all) throws BadRequestServiceEx {
return userGroupDAO.count(createCountSearchCriteria(nameLike, all));
}

Search searchCriteria = new Search(UserGroup.class);
@Override
public long getCount(User user, String nameLike, boolean all) throws BadRequestServiceEx {
if (user == null) {
throw new BadRequestServiceEx("User must be defined.");
}

searchCriteria.addSortAsc("groupName");
Search searchCriteria = createCountSearchCriteria(nameLike, all);

if (user.getRole() == Role.USER) {
Set<UserGroup> userGrp = user.getGroups();
Expand All @@ -412,18 +417,22 @@ public long getCount(User user, String nameLike, boolean all) throws BadRequestS
searchCriteria.addFilterIn("id", grpIds);
}

return userGroupDAO.count(searchCriteria);
}

private Search createCountSearchCriteria(String nameLike, boolean includingReserved) {

Search searchCriteria = new Search(UserGroup.class);

if (nameLike != null) {
searchCriteria.addFilterILike("groupName", nameLike);
}

if (!all)
if (!includingReserved) {
searchCriteria.addFilterNotEqual("groupName", GroupReservedNames.EVERYONE.groupName());
}

return userGroupDAO.count(searchCriteria);
}

public long getCount(User user, String nameLike) throws BadRequestServiceEx {
return getCount(user, nameLike, false);
return searchCriteria;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@

<bean id="userSessionService" class="it.geosolutions.geostore.services.InMemoryUserSessionServiceImpl"> </bean>

<bean id="permissionService" class="it.geosolutions.geostore.services.PermissionServiceImpl"> </bean>
<bean id="resourcePermissionService" class="it.geosolutions.geostore.services.ResourcePermissionServiceImpl"> </bean>

</beans>
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

Expand All @@ -31,34 +32,34 @@
public class UserGroupList implements Iterable<RESTUserGroup> {

private List<RESTUserGroup> list;
private long count;

public UserGroupList() {
this.list = new ArrayList<RESTUserGroup>();
this.list = new ArrayList<>();
}

/** @param list */
public UserGroupList(List<RESTUserGroup> list) {
public UserGroupList(List<RESTUserGroup> list, long count) {
super();
if (list != null) {
this.list = list;
} else {
this.list = new ArrayList<RESTUserGroup>();
}
this.count = count;
this.list = Objects.requireNonNullElseGet(list, ArrayList::new);
}

/** @return the userGroup */
@XmlElement(name = "UserGroup")
public List<RESTUserGroup> getUserGroupList() {
return list;
}

/** @param userGroup the userGroup to set */
public void setUserGroupList(List<RESTUserGroup> userGroup) {
this.list = userGroup;
}

@XmlElement(name = "Count")
public long getCount() {
return count;
}

@Override
public Iterator<RESTUserGroup> iterator() {
return list == null ? Collections.EMPTY_LIST.iterator() : list.iterator();
return list == null ? Collections.emptyIterator() : list.iterator();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import it.geosolutions.geostore.core.model.Resource;
import it.geosolutions.geostore.core.model.User;
import it.geosolutions.geostore.core.model.UserGroup;
import it.geosolutions.geostore.services.PermissionService;
import it.geosolutions.geostore.services.ResourcePermissionService;
import it.geosolutions.geostore.services.ResourceService;
import it.geosolutions.geostore.services.SecurityService;
import it.geosolutions.geostore.services.UserGroupService;
Expand Down Expand Up @@ -86,7 +86,7 @@ public class RESTExtJsServiceImpl extends RESTServiceImpl implements RESTExtJsSe

private UserGroupService groupService;

private PermissionService permissionService;
private ResourcePermissionService resourcePermissionService;

/** @param resourceService */
public void setResourceService(ResourceService resourceService) {
Expand All @@ -97,8 +97,8 @@ public void setUserGroupService(UserGroupService userGroupService) {
this.groupService = userGroupService;
}

public void setPermissionService(PermissionService permissionService) {
this.permissionService = permissionService;
public void setResourcePermissionService(ResourcePermissionService resourcePermissionService) {
this.resourcePermissionService = resourcePermissionService;
}

/* (non-Javadoc)
Expand Down Expand Up @@ -395,7 +395,7 @@ private List<Resource> filterOutUnavailableResources(List<Resource> resources, U
userService.fetchSecurityRules(user);

return resources.stream()
.filter(r -> permissionService.isResourceAvailableForUser(r, user))
.filter(r -> resourcePermissionService.isResourceAvailableForUser(r, user))
.collect(Collectors.toList());
}

Expand All @@ -422,7 +422,7 @@ private ExtResource convertToExtResource(Resource resource, User user) {
/* setting copy permission as in ResourceEnvelop.isCanCopy */
.withCanCopy(user != null);

if (permissionService.canUserWriteResource(user, resource)) {
if (resourcePermissionService.canUserWriteResource(user, resource)) {
extResourceBuilder.withCanEdit(true).withCanDelete(true);
}

Expand Down Expand Up @@ -535,7 +535,9 @@ public ExtGroupList getGroupsList(
}

try {
nameLike = nameLike.replaceAll("[*]", "%");
if (nameLike != null) {
nameLike = nameLike.replaceAll("[*]", "%");
}
List<UserGroup> groups =
groupService.getAllAllowed(authUser, page, limit, nameLike, all);

Expand Down Expand Up @@ -684,12 +686,12 @@ public ExtShortResource getExtResource(
User authUser = extractAuthUser(sc);
userService.fetchSecurityRules(authUser);

if (!permissionService.canUserReadResource(authUser, id)) {
if (!resourcePermissionService.canUserReadResource(authUser, id)) {
throw new ForbiddenErrorWebEx("Resource is protected");
}

ShortResource shortResource = new ShortResource(resource);
if (permissionService.canUserWriteResource(authUser, resource)) {
if (resourcePermissionService.canUserWriteResource(authUser, resource)) {
shortResource.setCanEdit(true);
shortResource.setCanDelete(true);
}
Expand Down Expand Up @@ -755,7 +757,7 @@ private void readSecurity() {
canEdit = sr.isCanEdit();
return;
}
if (authUser != null && permissionService.canUserWriteResource(authUser, r)) {
if (authUser != null && resourcePermissionService.canUserWriteResource(authUser, r)) {
canEdit = true;
canDelete = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import it.geosolutions.geostore.services.dto.search.FieldFilter;
import it.geosolutions.geostore.services.dto.search.GroupFilter;
import it.geosolutions.geostore.services.dto.search.SearchOperator;
import it.geosolutions.geostore.services.model.ExtGroupList;
import it.geosolutions.geostore.services.model.ExtResource;
import it.geosolutions.geostore.services.model.ExtResourceList;
import it.geosolutions.geostore.services.model.ExtShortResource;
Expand Down Expand Up @@ -504,7 +505,7 @@ public void testExtResourcesList_sorted() throws Exception {
sc,
0,
1000,
new Sort("unknown field", "desc"),
new Sort("unknownfield", "desc"),
false,
false,
new AndFilter());
Expand Down Expand Up @@ -1521,6 +1522,38 @@ public void testGetExtResource_groupOwnedWithPermissionsInformation() throws Exc
}
}

@Test
public void testGetGroupsList() throws Exception {
final String groupAName = "groupA";

long groupAId = createGroup(groupAName);
UserGroup groupA = userGroupService.get(groupAId);

createGroup("groupB");

long adminId = restCreateUser("admin", Role.ADMIN, null, "admin");
SecurityContext adminSecurityContext = new SimpleSecurityContext(adminId);

long userId = restCreateUser("u0", Role.USER, Collections.singleton(groupA), "p0");
SecurityContext userSecurityContext = new SimpleSecurityContext(userId);

{
ExtGroupList response =
restExtJsService.getGroupsList(adminSecurityContext, null, 0, 1000, true);
List<UserGroup> resources = response.getList();
assertEquals(2, resources.size());
}

{
ExtGroupList response =
restExtJsService.getGroupsList(userSecurityContext, null, 0, 1000, true);
List<UserGroup> userGroups = response.getList();
assertEquals(1, userGroups.size());
UserGroup userGroup = userGroups.get(0);
assertEquals(groupAName, userGroup.getGroupName());
}
}

private JSONResult parse(String jsonString) {
JSONResult ret = new JSONResult();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public class ServiceTestBase {
protected static CategoryService categoryService;
protected static UserService userService;
protected static UserGroupService userGroupService;
protected static PermissionService permissionService;
protected static ResourcePermissionService resourcePermissionService;

protected static ResourceDAO resourceDAO;
protected static UserDAO userDAO;
Expand All @@ -95,7 +95,8 @@ public ServiceTestBase() {
categoryService = (CategoryService) ctx.getBean("categoryService");
userService = (UserService) ctx.getBean("userService");
userGroupService = (UserGroupService) ctx.getBean("userGroupService");
permissionService = (PermissionService) ctx.getBean("permissionService");
resourcePermissionService =
(ResourcePermissionService) ctx.getBean("resourcePermissionService");

resourceDAO = (ResourceDAO) ctx.getBean("resourceDAO");
userDAO = (UserDAO) ctx.getBean("userDAO");
Expand Down Expand Up @@ -125,7 +126,7 @@ public void testCheckServices() {
assertNotNull(categoryService);
assertNotNull(userService);
assertNotNull(userGroupService);
assertNotNull(permissionService);
assertNotNull(resourcePermissionService);

assertNotNull(resourceDAO);
assertNotNull(userDAO);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,13 @@ public UserGroupList getAll(
userGroupService.getAll(page, entries, nameLike, all).stream()
.map(ug -> createRestUserGroup(ug, includeUsers))
.collect(Collectors.toList());
return new UserGroupList(restUserGroups);

long count = 0;
if (!restUserGroups.isEmpty()) {
count = userGroupService.getCount(nameLike, all);
}

return new UserGroupList(restUserGroups, count);
} catch (BadRequestServiceEx e) {
LOGGER.error(e.getMessage(), e);
throw new BadRequestWebEx(e.getMessage());
Expand Down Expand Up @@ -333,7 +339,7 @@ private UserGroupList getGroups(String name, List<String> values, boolean ignore
groupStream
.map(g -> new RESTUserGroup(g, Collections.emptySet()))
.collect(Collectors.toList());
groupList = new UserGroupList(restGroups);
groupList = new UserGroupList(restGroups, restGroups.size());
} else {
groupList = new UserGroupList();
}
Expand Down
Loading
Loading