Skip to content

Commit

Permalink
MGR-77 allow filters of suers by group (#15)
Browse files Browse the repository at this point in the history
  • Loading branch information
madness-inc committed Aug 1, 2019
1 parent 818c7a1 commit d96964a
Show file tree
Hide file tree
Showing 11 changed files with 184 additions and 28 deletions.
10 changes: 6 additions & 4 deletions application-home/conf/datasources/ds-subjects.xml
Expand Up @@ -9,9 +9,10 @@
<permission ref="subject.list" mode="set" />
</permissions>
<params>
<param name="userid" />
<param name="userId" />
<param name="groupId" />
</params>
<meta-data bindClass="org.appng.api.model.Subject" result-selector="${current.id eq userid}">
<meta-data bindClass="org.appng.api.model.Subject" result-selector="${current.id eq userId}">
<field name="name" type="text">
<sort prio="0" order="asc" ignore-case="true" />
<label>name</label>
Expand Down Expand Up @@ -61,14 +62,15 @@
</linkpanel>
</config>
<bean id="subjects">
<option name="subject" groupId="${groupId}"/>
</bean>
</datasource>

<datasource id="user">
<config>
<title>subject</title>
<params>
<param name="userid" />
<param name="userId" />
</params>
<meta-data binding="subject" bindClass="org.appng.application.manager.form.SubjectForm">
<field name="name" type="text" readonly="true">
Expand Down Expand Up @@ -106,7 +108,7 @@
</meta-data>
</config>
<bean id="subjects">
<option name="subject" id="${userid}" />
<option name="subject" id="${userId}" />
</bean>
</datasource>

Expand Down
10 changes: 5 additions & 5 deletions application-home/conf/events/ev-subjects.xml
Expand Up @@ -29,17 +29,17 @@
</permissions>
<params>
<param name="form_action" />
<param name="userid" />
<param name="userId" />
</params>
</config>
<condition expression="${form_action eq 'update'}" />
<datasource id="user">
<params>
<param name="userid">${userid}</param>
<param name="userId">${userId}</param>
</params>
</datasource>
<bean id="subjects">
<option name="subject" id="${userid}" />
<option name="subject" id="${userId}" />
<option name="action" id="update" />
</bean>
</action>
Expand All @@ -52,12 +52,12 @@
</permissions>
<params>
<param name="form_action" />
<param name="userid" />
<param name="userId" />
</params>
</config>
<condition expression="${form_action eq 'delete'}" />
<bean id="subjects">
<option name="subject" id="${userid}" />
<option name="subject" id="${userId}" />
<option name="action" id="delete" />
</bean>
</action>
Expand Down
8 changes: 5 additions & 3 deletions application-home/conf/pages/pg-subjects.xml
Expand Up @@ -21,6 +21,7 @@
<get-param name="f_type" />
<get-param name="f_name" />
<get-param name="f_gn" />
<get-param name="f_gid" />
</get-params>
<post-params>
<post-param name="form_action" />
Expand All @@ -42,7 +43,7 @@
<element passive="true">
<action eventId="subjectEvent" id="update" onSuccess="/users">
<params>
<param name="userid">${id}</param>
<param name="userId">${id}</param>
<param name="form_action">${form_action}</param>
</params>
<condition expression="${action eq 'update' and entity eq 'user'}" />
Expand All @@ -52,7 +53,8 @@
<element>
<datasource id="users">
<params>
<param name="userid">${id}</param>
<param name="userId">${id}</param>
<param name="groupId">${f_gid}</param>
</params>
</datasource>
</element>
Expand Down Expand Up @@ -95,7 +97,7 @@
<element>
<action eventId="subjectEvent" id="delete" onSuccess="/users">
<params>
<param name="userid">${userid}</param>
<param name="userId">${userid}</param>
<param name="form_action">${form_action}</param>
</params>
</action>
Expand Down
Expand Up @@ -107,7 +107,8 @@ public DataContainer getData(Site site, Application application, Environment env
data = service.getNewSubject(request, fp, defaultTimezone, languages);
} else {
try {
data = service.searchSubjects(request, fp, subjectId, defaultTimezone, languages);
Integer groupId = options.getInteger(SUBJECT, "groupId");
data = service.searchSubjects(request, fp, subjectId, defaultTimezone, languages, groupId);
} catch (BusinessException ex) {
String message = request.getMessage(ex.getMessageKey(), ex.getMessageArgs());
log.error(message, ex);
Expand Down
Expand Up @@ -37,6 +37,7 @@
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import org.apache.commons.collections.comparators.ComparatorChain;
import org.apache.commons.io.FileUtils;
Expand Down Expand Up @@ -129,6 +130,7 @@
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.transaction.annotation.Transactional;

/**
Expand Down Expand Up @@ -1050,7 +1052,7 @@ private void checkSite(Request request, Site site, FieldProcessor fp, Site curre
}

public DataContainer searchSubjects(Request request, FieldProcessor fp, Integer subjectId, String defaultTimezone,
List<String> languages) throws BusinessException {
List<String> languages, Integer groupId) throws BusinessException {
DataContainer data = new DataContainer(fp);
if (subjectId != null) {
SubjectImpl subject = subjectRepository.findOne(subjectId);
Expand All @@ -1065,23 +1067,33 @@ public DataContainer searchSubjects(Request request, FieldProcessor fp, Integer
} else {
String filterParamType = "f_type";
String filterParamName = "f_name";
String filterParamGroup = "f_gid";
String typeFormRequest = request.getParameter(filterParamType);
UserType userType = null != typeFormRequest && UserType.names().contains(typeFormRequest)
? UserType.valueOf(typeFormRequest)
: null;
String name = request.getParameter(filterParamName);

Pageable pageable = fp.getPageable();
SearchQuery<SubjectImpl> searchQuery = subjectRepository.createSearchQuery();
searchQuery.setAppendEntityAlias(false);
if (StringUtils.isNotBlank(name)) {
searchQuery.like("name", "%" + name + "%");
searchQuery.contains("e.name", name);
} else {
name = "";
name = StringUtils.EMPTY;
}
if (null != userType) {
searchQuery.equals("userType", userType);
searchQuery.equals("e.userType", userType);
}
if (null != groupId) {
searchQuery.join("join e.groups g");
searchQuery.equals("g.id", groupId);
List<Order> orders = StreamSupport.stream(pageable.getSort().spliterator(), false)
.map(o -> new Order(o.getDirection(), "e." + o.getProperty())).collect(Collectors.toList());
pageable = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), new Sort(orders));
}

Page<SubjectImpl> subjects = subjectRepository.search(searchQuery, fp.getPageable());
Page<SubjectImpl> subjects = subjectRepository.search(searchQuery, pageable);
for (SubjectImpl subject : subjects) {
subject.setTypeName(getUserTypeNameProvider(request).getName(subject.getUserType()));
}
Expand All @@ -1093,9 +1105,21 @@ public DataContainer searchSubjects(Request request, FieldProcessor fp, Integer
Selection userName = selectionFactory.fromObjects(filterParamName, MessageConstants.NAME,
new String[] { name }, new String[] { name });
userName.setType(SelectionType.TEXT);

List<GroupImpl> groups = groupRepository.findAll(new Sort(Direction.ASC, "name"));
Selector groupSelector = o -> {
if (null != groupId && groupId.toString().equals(o.getValue())) {
o.setSelected(true);
}
};
Selection groupSelection = new SelectionBuilder<GroupImpl>(filterParamGroup).title(MessageConstants.GROUP)
.options(groups).defaultOption(StringUtils.EMPTY, StringUtils.EMPTY).selector(groupSelector)
.type(SelectionType.SELECT).build();

SelectionGroup filterGroup = new SelectionGroup();
filterGroup.getSelections().add(userName);
filterGroup.getSelections().add(userTypes);
filterGroup.getSelections().add(groupSelection);
data.getSelectionGroups().add(filterGroup);
data.setPage(subjects);
}
Expand Down
Expand Up @@ -112,7 +112,7 @@ DataContainer searchResources(Request request, Site site, FieldProcessor fp, Res
DataContainer searchSites(Environment environment, FieldProcessor fp, Integer siteId, String name, String domain) throws BusinessException;

DataContainer searchSubjects(Request request, FieldProcessor fp, Integer subjectId, String defaultTimezone,
List<String> languages) throws BusinessException;
List<String> languages, Integer groupId) throws BusinessException;

DataContainer searchPermissions(FieldProcessor fp, Integer permissionId, Integer appId) throws BusinessException;

Expand Down
Expand Up @@ -119,16 +119,16 @@ public void testCreateNameExists() throws Exception {

@Test
public void testDelete() throws ProcessingException, IOException {
CallableAction callableAction = getAction(SUBJECT_EVENT, "delete").withParam("userid", "2")
.withParam("form_action", "delete").getCallableAction(null);
CallableAction callableAction = getAction(SUBJECT_EVENT, "delete").withParam("userId", "2")
.withParam(FORM_ACTION, "delete").getCallableAction(null);

FieldProcessor fieldProcessor = callableAction.perform();
validate(fieldProcessor.getMessages(), differenceListener);
}

@Test
public void testShowOne() throws Exception {
CallableDataSource siteDatasource = getDataSource("user").withParam("userid", "1").getCallableDataSource();
CallableDataSource siteDatasource = getDataSource("user").withParam("userId", "1").getCallableDataSource();
siteDatasource.perform("test");

validate(siteDatasource.getDatasource(), differenceListener);
Expand All @@ -146,6 +146,13 @@ public void testShowAll() throws Exception {
validate(siteDatasource.getDatasource());
}

@Test
public void testShowAllFilterGroup() throws Exception {
CallableDataSource siteDatasource = getDataSource("users").withParam("groupId", "1").getCallableDataSource();
siteDatasource.perform("test");
validate(siteDatasource.getDatasource());
}

@Test
public void testUpdate() throws Exception {
SubjectImpl s = getSubject();
Expand All @@ -154,7 +161,7 @@ public void testUpdate() throws Exception {
SubjectForm form = new SubjectForm(s);
form.setPassword("newpassword");
form.setPasswordConfirmation("newpassword");
CallableAction callableAction = getAction(SUBJECT_EVENT, "update").withParam("userid", "1")
CallableAction callableAction = getAction(SUBJECT_EVENT, "update").withParam("userId", "1")
.withParam(FORM_ACTION, "update").getCallableAction(form);

FieldProcessor fieldProcessor = callableAction.perform();
Expand Down
11 changes: 9 additions & 2 deletions src/test/resources/xml/SubjectsTest-testShowAll.xml
Expand Up @@ -6,9 +6,10 @@
<permission ref="subject.list" mode="set"></permission>
</permissions>
<params>
<param name="userid" />
<param name="userId" />
<param name="groupId" />
</params>
<meta-data bindClass="org.appng.api.model.Subject" result-selector="${current.id eq userid}">
<meta-data bindClass="org.appng.api.model.Subject" result-selector="${current.id eq userId}">
<field name="name" type="text" binding="name">
<sort />
<label id="name">Name</label>
Expand Down Expand Up @@ -70,6 +71,12 @@
<option value="GLOBAL_USER" name="LDAP User" selected="false" />
<option value="GLOBAL_GROUP" name="LDAP Group" selected="false" />
</selection>
<selection id="f_gid" type="select">
<title id="group">Group</title>
<option value="" name="" />
<option value="1" name="admins" selected="false" />
<option value="2" name="users" selected="false" />
</selection>
</selectionGroup>
<resultset chunk="0" chunkname="users" chunksize="10" nextchunk="0" previouschunk="0" firstchunk="0"
lastchunk="0" hits="1">
Expand Down
113 changes: 113 additions & 0 deletions src/test/resources/xml/SubjectsTest-testShowAllFilterGroup.xml
@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<datasource xmlns="http://www.appng.org/schema/platform" id="users">
<config>
<title id="subjects">Users</title>
<permissions>
<permission ref="subject.list" mode="set"></permission>
</permissions>
<params>
<param name="userId" />
<param name="groupId">1</param>
</params>
<meta-data bindClass="org.appng.api.model.Subject" result-selector="${current.id eq userId}">
<field name="name" type="text" binding="name">
<sort />
<label id="name">Name</label>
</field>
<field name="realname" type="text" binding="realname">
<sort />
<label id="realname">Real name</label>
</field>
<field name="description" type="text" binding="description">
<label id="description">Description</label>
</field>
<field name="typeName" type="text" binding="typeName">
<label id="userType">userType</label>
</field>
<field name="language" type="text" binding="language">
<label id="language">Language</label>
</field>
<field name="actions" type="linkpanel" binding="actions">
<label id="actions">Actions</label>
</field>
</meta-data>
<linkpanel id="other" location="both">
<link id="other[1]" mode="intern" target="/users/user/create">
<permissions>
<permission ref="subject.create" mode="set"></permission>
</permissions>
<label id="subject.create">Create user</label>
<icon>new</icon>
</link>
</linkpanel>
<linkpanel id="actions" location="inline">
<link id="actions[1]" mode="intern" target="/users/user/update/${current.id}" default="true">
<permissions>
<permission ref="subject.edit" mode="set"></permission>
</permissions>
<label id="edit">Edit</label>
<icon>edit</icon>
</link>
<link id="actions[2]" mode="intern" target="/users?form_action=delete&amp;userid=${current.id}">
<permissions>
<permission ref="subject.delete" mode="set"></permission>
</permissions>
<label id="delete">Delete</label>
<icon>delete</icon>
<confirmation id="subject.delete.confirm" params="#{name}">Do you really want to delete the user "#{name}"?</confirmation>
</link>
</linkpanel>
</config>
<data>
<selectionGroup>
<selection id="f_name" type="text">
<title id="name">Name</title>
<option value="" name="" selected="true" />
</selection>
<selection id="f_type" type="select">
<title id="type">Type</title>
<option />
<option value="LOCAL_USER" name="Local User" selected="false" />
<option value="GLOBAL_USER" name="LDAP User" selected="false" />
<option value="GLOBAL_GROUP" name="LDAP Group" selected="false" />
</selection>
<selection id="f_gid" type="select">
<title id="group">Group</title>
<option value="" name="" />
<option value="1" name="admins" selected="true" />
<option value="2" name="users" selected="false" />
</selection>
</selectionGroup>
<resultset chunk="0" chunkname="users" chunksize="10" nextchunk="0" previouschunk="0" firstchunk="0"
lastchunk="0" hits="1">
<result>
<field name="name" type="text">
<value>admin</value>
</field>
<field name="realname" type="text">
<value>John Doe</value>
</field>
<field name="description" type="text">
<value></value>
</field>
<field name="typeName" type="text">
<value>Local User</value>
</field>
<field name="language" type="text">
<value>en</value>
</field>
<linkpanel id="actions" location="inline">
<link id="actions[1]" mode="intern" target="/users/user/update/1" default="true">
<label id="edit">Edit</label>
<icon>edit</icon>
</link>
<link id="actions[2]" mode="intern" target="/users?form_action=delete&amp;userid=1">
<label id="delete">Delete</label>
<icon>delete</icon>
<confirmation id="subject.delete.confirm" params="#{name}">Do you really want to delete the user "admin"?</confirmation>
</link>
</linkpanel>
</result>
</resultset>
</data>
</datasource>

0 comments on commit d96964a

Please sign in to comment.