server: Roles search by keyword (#7384)

This PR fixes #7362 and also other search criteria to use the name as an exact search where keyword is also there.

Made UI changes for roles search to make use of keyword instead of name.
This commit is contained in:
Harikrishna 2023-04-11 22:24:29 +05:30 committed by GitHub
parent b774ee5d11
commit 65512af779
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 26 additions and 21 deletions

View File

@ -80,7 +80,7 @@ public interface RoleService {
*/
List<Role> findRolesByName(String name);
Pair<List<Role>, Integer> findRolesByName(String name, Long startIndex, Long limit);
Pair<List<Role>, Integer> findRolesByName(String name, String keyword, Long startIndex, Long limit);
/**
* Find all roles by {@link RoleType}. If the role type is {@link RoleType#Admin}, the calling account must be a root admin, otherwise we return an empty list.

View File

@ -105,8 +105,8 @@ public class ListRolesCmd extends BaseListCmd {
Pair<List<Role>, Integer> roles;
if (getId() != null && getId() > 0L) {
roles = new Pair<List<Role>, Integer>(Collections.singletonList(roleService.findRole(getId())), 1);
} else if (StringUtils.isNotBlank(getName())) {
roles = roleService.findRolesByName(getName(), getStartIndex(), getPageSizeVal());
} else if (StringUtils.isNotBlank(getName()) || StringUtils.isNotBlank(getKeyword())) {
roles = roleService.findRolesByName(getName(), getKeyword(), getStartIndex(), getPageSizeVal());
} else if (getRoleType() != null) {
roles = roleService.findRolesByType(getRoleType(), getStartIndex(), getPageSizeVal());
} else {

View File

@ -28,7 +28,7 @@ import java.util.List;
public interface RoleDao extends GenericDao<RoleVO, Long> {
List<RoleVO> findAllByName(String roleName);
Pair<List<RoleVO>, Integer> findAllByName(final String roleName, Long offset, Long limit);
Pair<List<RoleVO>, Integer> findAllByName(final String roleName, String keyword, Long offset, Long limit);
List<RoleVO> findAllByRoleType(RoleType type);
List<RoleVO> findByName(String roleName);

View File

@ -25,6 +25,7 @@ import com.cloud.utils.db.SearchCriteria;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.acl.RoleVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.List;
@ -54,13 +55,19 @@ public class RoleDaoImpl extends GenericDaoBase<RoleVO, Long> implements RoleDao
@Override
public List<RoleVO> findAllByName(final String roleName) {
return findAllByName(roleName, null, null).first();
return findAllByName(roleName, null, null, null).first();
}
@Override
public Pair<List<RoleVO>, Integer> findAllByName(final String roleName, Long offset, Long limit) {
public Pair<List<RoleVO>, Integer> findAllByName(final String roleName, String keyword, Long offset, Long limit) {
SearchCriteria<RoleVO> sc = RoleByNameSearch.create();
sc.setParameters("roleName", "%" + roleName + "%");
if (StringUtils.isNotEmpty(roleName)) {
sc.setParameters("roleName", roleName);
}
if (StringUtils.isNotEmpty(keyword)) {
sc.setParameters("roleName", "%" + keyword + "%");
}
return searchAndCount(sc, new Filter(RoleVO.class, "id", true, offset, limit));
}

View File

@ -287,7 +287,7 @@ public class MetricsServiceImpl extends MutualExclusiveIdsManagerBase implements
SearchBuilder<VMInstanceVO> sb = vmInstanceDao.createSearchBuilder();
sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
sb.and("type", sb.entity().getType(), SearchCriteria.Op.NEQ);
@ -340,7 +340,7 @@ public class MetricsServiceImpl extends MutualExclusiveIdsManagerBase implements
SearchBuilder<VolumeVO> sb = volumeDao.createSearchBuilder();
sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
SearchCriteria<VolumeVO> sc = sb.create();

View File

@ -1391,7 +1391,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
final SearchBuilder<VpcVO> sb = vpcDao.createSearchBuilder();
_accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
sb.and("displayText", sb.entity().getDisplayText(), SearchCriteria.Op.LIKE);
sb.and("vpcOfferingId", sb.entity().getVpcOfferingId(), SearchCriteria.Op.EQ);

View File

@ -4580,7 +4580,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
final SearchCriteria<UserDataVO> sc = sb.create();
_accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);

View File

@ -357,13 +357,13 @@ public class RoleManagerImpl extends ManagerBase implements RoleService, Configu
@Override
public List<Role> findRolesByName(String name) {
return findRolesByName(name, null, null).first();
return findRolesByName(name, null, null, null).first();
}
@Override
public Pair<List<Role>, Integer> findRolesByName(String name, Long startIndex, Long limit) {
if (StringUtils.isNotBlank(name)) {
Pair<List<RoleVO>, Integer> data = roleDao.findAllByName(name, startIndex, limit);
public Pair<List<Role>, Integer> findRolesByName(String name, String keyword, Long startIndex, Long limit) {
if (StringUtils.isNotBlank(name) || StringUtils.isNotBlank(keyword)) {
Pair<List<RoleVO>, Integer> data = roleDao.findAllByName(name, keyword, startIndex, limit);
int removed = removeRootAdminRolesIfNeeded(data.first());
return new Pair<List<Role>,Integer>(ListUtils.toListOfInterface(data.first()), Integer.valueOf(data.second() - removed));
}

View File

@ -223,7 +223,7 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager {
final Filter searchFilter = new Filter(BackupOfferingVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
SearchBuilder<BackupOfferingVO> sb = backupOfferingDao.createSearchBuilder();
sb.and("zone_id", sb.entity().getZoneId(), SearchCriteria.Op.EQ);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ);
final SearchCriteria<BackupOfferingVO> sc = sb.create();

View File

@ -166,7 +166,7 @@ public class RoleManagerImplTest {
String roleName = "roleName";
List<Role> roles = new ArrayList<>();
Pair<ArrayList<RoleVO>, Integer> toBeReturned = new Pair(roles, 0);
Mockito.doReturn(toBeReturned).when(roleDaoMock).findAllByName(roleName, null, null);
Mockito.doReturn(toBeReturned).when(roleDaoMock).findAllByName(roleName, null, null, null);
roleManagerImpl.findRolesByName(roleName);
Mockito.verify(roleManagerImpl).removeRootAdminRolesIfNeeded(roles);

View File

@ -1609,9 +1609,7 @@ export default {
if ('searchQuery' in opts) {
const value = opts.searchQuery
if (value && value.length > 0) {
if (this.$route.name === 'role') {
query.name = value
} else if (this.$route.name === 'quotaemailtemplate') {
if (this.$route.name === 'quotaemailtemplate') {
query.templatetype = value
} else if (this.$route.name === 'globalsetting') {
query.name = value

View File

@ -920,7 +920,7 @@ describe('Views > AutogenView.vue', () => {
await flushPromises()
expect(router.currentRoute.value.path).toEqual('/role')
expect(router.currentRoute.value.query).toEqual({ name: 'test-value', q: 'test-value', page: '1', pagesize: '20' })
expect(router.currentRoute.value.query).toEqual({ keyword: 'test-value', q: 'test-value', page: '1', pagesize: '20' })
done()
})