mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
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:
parent
b774ee5d11
commit
65512af779
@ -80,7 +80,7 @@ public interface RoleService {
|
|||||||
*/
|
*/
|
||||||
List<Role> findRolesByName(String name);
|
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.
|
* 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.
|
||||||
|
|||||||
@ -105,8 +105,8 @@ public class ListRolesCmd extends BaseListCmd {
|
|||||||
Pair<List<Role>, Integer> roles;
|
Pair<List<Role>, Integer> roles;
|
||||||
if (getId() != null && getId() > 0L) {
|
if (getId() != null && getId() > 0L) {
|
||||||
roles = new Pair<List<Role>, Integer>(Collections.singletonList(roleService.findRole(getId())), 1);
|
roles = new Pair<List<Role>, Integer>(Collections.singletonList(roleService.findRole(getId())), 1);
|
||||||
} else if (StringUtils.isNotBlank(getName())) {
|
} else if (StringUtils.isNotBlank(getName()) || StringUtils.isNotBlank(getKeyword())) {
|
||||||
roles = roleService.findRolesByName(getName(), getStartIndex(), getPageSizeVal());
|
roles = roleService.findRolesByName(getName(), getKeyword(), getStartIndex(), getPageSizeVal());
|
||||||
} else if (getRoleType() != null) {
|
} else if (getRoleType() != null) {
|
||||||
roles = roleService.findRolesByType(getRoleType(), getStartIndex(), getPageSizeVal());
|
roles = roleService.findRolesByType(getRoleType(), getStartIndex(), getPageSizeVal());
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -28,7 +28,7 @@ import java.util.List;
|
|||||||
public interface RoleDao extends GenericDao<RoleVO, Long> {
|
public interface RoleDao extends GenericDao<RoleVO, Long> {
|
||||||
List<RoleVO> findAllByName(String roleName);
|
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> findAllByRoleType(RoleType type);
|
||||||
List<RoleVO> findByName(String roleName);
|
List<RoleVO> findByName(String roleName);
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import com.cloud.utils.db.SearchCriteria;
|
|||||||
|
|
||||||
import org.apache.cloudstack.acl.RoleType;
|
import org.apache.cloudstack.acl.RoleType;
|
||||||
import org.apache.cloudstack.acl.RoleVO;
|
import org.apache.cloudstack.acl.RoleVO;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -54,13 +55,19 @@ public class RoleDaoImpl extends GenericDaoBase<RoleVO, Long> implements RoleDao
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<RoleVO> findAllByName(final String roleName) {
|
public List<RoleVO> findAllByName(final String roleName) {
|
||||||
return findAllByName(roleName, null, null).first();
|
return findAllByName(roleName, null, null, null).first();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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();
|
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));
|
return searchAndCount(sc, new Filter(RoleVO.class, "id", true, offset, limit));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -287,7 +287,7 @@ public class MetricsServiceImpl extends MutualExclusiveIdsManagerBase implements
|
|||||||
|
|
||||||
SearchBuilder<VMInstanceVO> sb = vmInstanceDao.createSearchBuilder();
|
SearchBuilder<VMInstanceVO> sb = vmInstanceDao.createSearchBuilder();
|
||||||
sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN);
|
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("state", sb.entity().getState(), SearchCriteria.Op.EQ);
|
||||||
sb.and("type", sb.entity().getType(), SearchCriteria.Op.NEQ);
|
sb.and("type", sb.entity().getType(), SearchCriteria.Op.NEQ);
|
||||||
|
|
||||||
@ -340,7 +340,7 @@ public class MetricsServiceImpl extends MutualExclusiveIdsManagerBase implements
|
|||||||
|
|
||||||
SearchBuilder<VolumeVO> sb = volumeDao.createSearchBuilder();
|
SearchBuilder<VolumeVO> sb = volumeDao.createSearchBuilder();
|
||||||
sb.and("idIN", sb.entity().getId(), SearchCriteria.Op.IN);
|
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("state", sb.entity().getState(), SearchCriteria.Op.EQ);
|
||||||
|
|
||||||
SearchCriteria<VolumeVO> sc = sb.create();
|
SearchCriteria<VolumeVO> sc = sb.create();
|
||||||
|
|||||||
@ -1391,7 +1391,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
|
|||||||
final SearchBuilder<VpcVO> sb = vpcDao.createSearchBuilder();
|
final SearchBuilder<VpcVO> sb = vpcDao.createSearchBuilder();
|
||||||
_accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
|
_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("id", sb.entity().getId(), SearchCriteria.Op.EQ);
|
||||||
sb.and("displayText", sb.entity().getDisplayText(), SearchCriteria.Op.LIKE);
|
sb.and("displayText", sb.entity().getDisplayText(), SearchCriteria.Op.LIKE);
|
||||||
sb.and("vpcOfferingId", sb.entity().getVpcOfferingId(), SearchCriteria.Op.EQ);
|
sb.and("vpcOfferingId", sb.entity().getVpcOfferingId(), SearchCriteria.Op.EQ);
|
||||||
|
|||||||
@ -4580,7 +4580,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||||||
|
|
||||||
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
|
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.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();
|
final SearchCriteria<UserDataVO> sc = sb.create();
|
||||||
_accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
|
_accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
|
||||||
|
|
||||||
|
|||||||
@ -357,13 +357,13 @@ public class RoleManagerImpl extends ManagerBase implements RoleService, Configu
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Role> findRolesByName(String name) {
|
public List<Role> findRolesByName(String name) {
|
||||||
return findRolesByName(name, null, null).first();
|
return findRolesByName(name, null, null, null).first();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Pair<List<Role>, Integer> findRolesByName(String name, Long startIndex, Long limit) {
|
public Pair<List<Role>, Integer> findRolesByName(String name, String keyword, Long startIndex, Long limit) {
|
||||||
if (StringUtils.isNotBlank(name)) {
|
if (StringUtils.isNotBlank(name) || StringUtils.isNotBlank(keyword)) {
|
||||||
Pair<List<RoleVO>, Integer> data = roleDao.findAllByName(name, startIndex, limit);
|
Pair<List<RoleVO>, Integer> data = roleDao.findAllByName(name, keyword, startIndex, limit);
|
||||||
int removed = removeRootAdminRolesIfNeeded(data.first());
|
int removed = removeRootAdminRolesIfNeeded(data.first());
|
||||||
return new Pair<List<Role>,Integer>(ListUtils.toListOfInterface(data.first()), Integer.valueOf(data.second() - removed));
|
return new Pair<List<Role>,Integer>(ListUtils.toListOfInterface(data.first()), Integer.valueOf(data.second() - removed));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -223,7 +223,7 @@ public class BackupManagerImpl extends ManagerBase implements BackupManager {
|
|||||||
final Filter searchFilter = new Filter(BackupOfferingVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
|
final Filter searchFilter = new Filter(BackupOfferingVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
|
||||||
SearchBuilder<BackupOfferingVO> sb = backupOfferingDao.createSearchBuilder();
|
SearchBuilder<BackupOfferingVO> sb = backupOfferingDao.createSearchBuilder();
|
||||||
sb.and("zone_id", sb.entity().getZoneId(), SearchCriteria.Op.EQ);
|
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();
|
final SearchCriteria<BackupOfferingVO> sc = sb.create();
|
||||||
|
|
||||||
|
|||||||
@ -166,7 +166,7 @@ public class RoleManagerImplTest {
|
|||||||
String roleName = "roleName";
|
String roleName = "roleName";
|
||||||
List<Role> roles = new ArrayList<>();
|
List<Role> roles = new ArrayList<>();
|
||||||
Pair<ArrayList<RoleVO>, Integer> toBeReturned = new Pair(roles, 0);
|
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);
|
roleManagerImpl.findRolesByName(roleName);
|
||||||
Mockito.verify(roleManagerImpl).removeRootAdminRolesIfNeeded(roles);
|
Mockito.verify(roleManagerImpl).removeRootAdminRolesIfNeeded(roles);
|
||||||
|
|||||||
@ -1609,9 +1609,7 @@ export default {
|
|||||||
if ('searchQuery' in opts) {
|
if ('searchQuery' in opts) {
|
||||||
const value = opts.searchQuery
|
const value = opts.searchQuery
|
||||||
if (value && value.length > 0) {
|
if (value && value.length > 0) {
|
||||||
if (this.$route.name === 'role') {
|
if (this.$route.name === 'quotaemailtemplate') {
|
||||||
query.name = value
|
|
||||||
} else if (this.$route.name === 'quotaemailtemplate') {
|
|
||||||
query.templatetype = value
|
query.templatetype = value
|
||||||
} else if (this.$route.name === 'globalsetting') {
|
} else if (this.$route.name === 'globalsetting') {
|
||||||
query.name = value
|
query.name = value
|
||||||
|
|||||||
@ -920,7 +920,7 @@ describe('Views > AutogenView.vue', () => {
|
|||||||
await flushPromises()
|
await flushPromises()
|
||||||
|
|
||||||
expect(router.currentRoute.value.path).toEqual('/role')
|
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()
|
done()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user