From ccb96aeb1375dd8bfdd84824ff28785ff5f6f039 Mon Sep 17 00:00:00 2001 From: gkolokythas Date: Thu, 26 Sep 2019 12:44:39 +0300 Subject: [PATCH] Fixes bug on DMP's filter Role. --- .../eu/eudat/data/dao/entities/DMPDao.java | 3 +- .../eudat/data/dao/entities/DMPDaoImpl.java | 178 +++++++++--------- .../logic/managers/DashBoardManager.java | 15 +- .../managers/DataManagementPlanManager.java | 7 +- .../eu/eudat/logic/managers/UserManager.java | 9 +- 5 files changed, 111 insertions(+), 101 deletions(-) diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDao.java index 03cf68d74..3073e1857 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDao.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDao.java @@ -8,6 +8,7 @@ import eu.eudat.data.entities.UserDMP; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; +import java.util.List; import java.util.UUID; public interface DMPDao extends DatabaseAccessLayer { @@ -16,6 +17,6 @@ public interface DMPDao extends DatabaseAccessLayer { QueryableList getUserDmps(DatasetWizardUserDmpCriteria datasetWizardAutocompleteRequest, UserInfo userInfo); - QueryableList getAuthenticated(QueryableList query, UUID principalId); + QueryableList getAuthenticated(QueryableList query, UUID principalId, List roles); } \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java index 5e527ebf7..e1c92d6d8 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java @@ -5,7 +5,6 @@ import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; import eu.eudat.data.dao.criteria.DatasetWizardUserDmpCriteria; import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.DMP; -import eu.eudat.data.entities.UserDMP; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.types.FieldSelectionType; @@ -14,110 +13,119 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import javax.persistence.criteria.Join; import javax.persistence.criteria.JoinType; import java.util.Arrays; +import java.util.List; import java.util.UUID; import java.util.concurrent.CompletableFuture; @Component("dMPDao") public class DMPDaoImpl extends DatabaseAccess implements DMPDao { + @Autowired + public DMPDaoImpl(DatabaseService databaseService) { + super(databaseService); + } - @Autowired - public DMPDaoImpl(DatabaseService databaseService) { - super(databaseService); - } - - @Override - public QueryableList getWithCriteria(DataManagementPlanCriteria criteria) { - QueryableList query = getDatabaseService().getQueryable(DMP.getHints(), DMP.class); - if (criteria.getLike() != null && !criteria.getLike().isEmpty()) - query.where((builder, root) -> builder.or( - builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%"), - builder.like(builder.upper(root.get("description")), "%" + criteria.getLike().toUpperCase() + "%"))); - if (criteria.getPeriodEnd() != null) - query.where((builder, root) -> builder.lessThan(root.get("created"), criteria.getPeriodEnd())); - if (criteria.getPeriodStart() != null) - query.where((builder, root) -> builder.greaterThan(root.get("created"), criteria.getPeriodStart())); - if (criteria.getGrants() != null && !criteria.getGrants().isEmpty()) - query.where(((builder, root) -> root.get("grant").in(criteria.getGrants()))); - if (!criteria.getAllVersions()) - query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("version"), - query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), - nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); - if (criteria.getGroupIds() != null && !criteria.getGroupIds().isEmpty()) - query.where((builder, root) -> root.get("groupId").in(criteria.getGroupIds())); - if (criteria.getStatus() != null) { - if (criteria.getStatus() == DMP.DMPStatus.FINALISED.getValue()) { - query.where((builder, root) -> builder.and(builder.equal(root.get("status"), DMP.DMPStatus.FINALISED.getValue()), builder.notEqual(root.get("isPublic"), true))); - } else if (criteria.getStatus() == DMP.DMPStatus.ACTIVE.getValue()) { - query.where((builder, root) -> builder.equal(root.get("status"), DMP.DMPStatus.ACTIVE.getValue())); - } - } - if (criteria.getIsPublic()) - query.where(((builder, root) -> builder.equal(root.get("isPublic"), true))); - if (criteria.getRole() != null) { + @Override + public QueryableList getWithCriteria(DataManagementPlanCriteria criteria) { + QueryableList query = getDatabaseService().getQueryable(DMP.getHints(), DMP.class); + if (criteria.getLike() != null && !criteria.getLike().isEmpty()) + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + criteria.getLike().toUpperCase() + "%"))); + if (criteria.getPeriodEnd() != null) + query.where((builder, root) -> builder.lessThan(root.get("created"), criteria.getPeriodEnd())); + if (criteria.getPeriodStart() != null) + query.where((builder, root) -> builder.greaterThan(root.get("created"), criteria.getPeriodStart())); + if (criteria.getGrants() != null && !criteria.getGrants().isEmpty()) + query.where(((builder, root) -> root.get("grant").in(criteria.getGrants()))); + if (!criteria.getAllVersions()) + query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("version"), + query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), + nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); + if (criteria.getGroupIds() != null && !criteria.getGroupIds().isEmpty()) + query.where((builder, root) -> root.get("groupId").in(criteria.getGroupIds())); + if (criteria.getStatus() != null) { + if (criteria.getStatus() == DMP.DMPStatus.FINALISED.getValue()) { + query.where((builder, root) -> builder.and(builder.equal(root.get("status"), DMP.DMPStatus.FINALISED.getValue()), builder.notEqual(root.get("isPublic"), true))); + } else if (criteria.getStatus() == DMP.DMPStatus.ACTIVE.getValue()) { + query.where((builder, root) -> builder.equal(root.get("status"), DMP.DMPStatus.ACTIVE.getValue())); + } + } + if (criteria.getIsPublic()) + query.where(((builder, root) -> builder.equal(root.get("isPublic"), true))); + /*if (criteria.getRole() != null) { if (criteria.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())) { query.where((builder, root) -> builder.equal(root.join("users", JoinType.LEFT).get("role"), UserDMP.UserDMPRoles.OWNER.getValue())); } else if (criteria.getRole().equals(UserDMP.UserDMPRoles.USER.getValue())) { query.where((builder, root) -> builder.equal(root.join("users", JoinType.LEFT).get("role"), UserDMP.UserDMPRoles.USER.getValue())); } - } - if (criteria.getOrganisations() != null && !criteria.getOrganisations().isEmpty()) { - query.where((builder, root) -> root.join("organisations").get("reference").in(criteria.getOrganisations())); - } - if (criteria.getCollaborators() != null && !criteria.getCollaborators().isEmpty()) { - query.where((builder, root) -> root.join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id").in(criteria.getCollaborators())); - } - if (criteria.getDatasetTemplates() != null && !criteria.getDatasetTemplates().isEmpty()) { - query.where((builder, root) -> root.join("associatedDmps", JoinType.LEFT).get("id").in(criteria.getDatasetTemplates())); - } - query.where((builder, root) -> builder.notEqual(root.get("status"), DMP.DMPStatus.DELETED.getValue())); - return query; - } + }*/ + if (criteria.getOrganisations() != null && !criteria.getOrganisations().isEmpty()) { + query.where((builder, root) -> root.join("organisations").get("reference").in(criteria.getOrganisations())); + } + if (criteria.getCollaborators() != null && !criteria.getCollaborators().isEmpty()) { + query.where((builder, root) -> root.join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id").in(criteria.getCollaborators())); + } + if (criteria.getDatasetTemplates() != null && !criteria.getDatasetTemplates().isEmpty()) { + query.where((builder, root) -> root.join("associatedDmps", JoinType.LEFT).get("id").in(criteria.getDatasetTemplates())); + } + query.where((builder, root) -> builder.notEqual(root.get("status"), DMP.DMPStatus.DELETED.getValue())); + return query; + } - public QueryableList getAuthenticated(QueryableList query, UUID principal) { - query.where((builder, root) -> builder.equal(root.join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), principal)); - return query; - } + public QueryableList getAuthenticated(QueryableList query, UUID principal, List roles) { + if (roles != null && !roles.isEmpty()) { + query.where((builder, root) -> { + Join userJoin = root.join("users", JoinType.LEFT); + return builder.and(builder.equal(userJoin.join("user", JoinType.LEFT).get("id"), principal), userJoin.get("role").in(roles)); + }); + } else { + query.where((builder, root) -> builder.equal(root.join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), principal)); + } - @Override - public DMP createOrUpdate(DMP item) { - return this.getDatabaseService().createOrUpdate(item, DMP.class); - } + return query; + } - @Override - public DMP find(UUID id) { - return getDatabaseService().getQueryable(DMP.class).where((builder, root) -> builder.equal((root.get("id")), id)).getSingle(); - } + @Override + public DMP createOrUpdate(DMP item) { + return this.getDatabaseService().createOrUpdate(item, DMP.class); + } - @Override - public QueryableList getUserDmps(DatasetWizardUserDmpCriteria datasetWizardUserDmpCriteria, UserInfo userInfo) { - QueryableList query = getDatabaseService().getQueryable(DMP.class).where((builder, root) -> builder.or(builder.equal(root.get("creator"), userInfo), builder.isMember(userInfo, root.get("users")))); - if (datasetWizardUserDmpCriteria.getLike() != null && !datasetWizardUserDmpCriteria.getLike().isEmpty()) { - query.where((builder, root) -> builder.like(root.get("label"), "%" + datasetWizardUserDmpCriteria.getLike() + "%")); - } - return query; - } + @Override + public DMP find(UUID id) { + return getDatabaseService().getQueryable(DMP.class).where((builder, root) -> builder.equal((root.get("id")), id)).getSingle(); + } - @Override - public void delete(DMP item) { - this.getDatabaseService().delete(item); - } + @Override + public QueryableList getUserDmps(DatasetWizardUserDmpCriteria datasetWizardUserDmpCriteria, UserInfo userInfo) { + QueryableList query = getDatabaseService().getQueryable(DMP.class).where((builder, root) -> builder.or(builder.equal(root.get("creator"), userInfo), builder.isMember(userInfo, root.get("users")))); + if (datasetWizardUserDmpCriteria.getLike() != null && !datasetWizardUserDmpCriteria.getLike().isEmpty()) { + query.where((builder, root) -> builder.like(root.get("label"), "%" + datasetWizardUserDmpCriteria.getLike() + "%")); + } + return query; + } - @Override - public QueryableList asQueryable() { - return this.getDatabaseService().getQueryable(DMP.class); - } + @Override + public void delete(DMP item) { + this.getDatabaseService().delete(item); + } - @Async - @Override - public CompletableFuture createOrUpdateAsync(DMP item) { - return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); - } + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(DMP.class); + } - @Override - public DMP find(UUID id, String hint) { - throw new UnsupportedOperationException(); - } + @Async + @Override + public CompletableFuture createOrUpdateAsync(DMP item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public DMP find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 42746c11c..d351e492b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -8,10 +8,7 @@ import eu.eudat.data.dao.entities.DMPDao; import eu.eudat.data.dao.entities.DatasetDao; import eu.eudat.data.dao.entities.OrganisationDao; import eu.eudat.data.dao.entities.GrantDao; -import eu.eudat.data.entities.DMP; -import eu.eudat.data.entities.Dataset; -import eu.eudat.data.entities.Grant; -import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.entities.*; import eu.eudat.logic.builders.model.models.RecentActivityDataBuilder; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.operations.DatabaseRepository; @@ -79,9 +76,9 @@ public class DashBoardManager { DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); dataManagementPlanCriteria.setAllVersions(false); GrantCriteria grantCriteria = new GrantCriteria(); - OrganisationCriteria organisationCriteria = new OrganisationCriteria(); - CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId()).countAsync() + List roles = new LinkedList<>(); + CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles).countAsync() .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); CompletableFuture datasetFuture = datasetRepository.getAuthenticated(datasetRepository.getWithCriteria(datasetCriteria), user).countAsync() .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); @@ -108,7 +105,8 @@ public class DashBoardManager { GrantCriteria grantCriteria = new GrantCriteria(); RecentActivityDataBuilder recentActivityDataBuilder = apiContext.getOperationsContext().getBuilderFactory().getBuilder(RecentActivityDataBuilder.class); - CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId()) + List roles = new LinkedList<>(); + CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles) .withHint("dmpRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) @@ -141,8 +139,9 @@ public class DashBoardManager { DatasetDao datasetRepository = databaseRepository.getDatasetDao(); GrantDao grantRepository = databaseRepository.getGrantDao(); + List roles = new LinkedList<>(); List searchBarItems = new LinkedList<>(); - CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.asQueryable(), principal.getId()) + CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.asQueryable(), principal.getId(), roles) .withHint("dmpRecentActivity") .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) .orderBy((builder, root) -> builder.desc(root.get("modified"))) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index d2fc9acc1..7a195f05a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -92,7 +92,9 @@ public class DataManagementPlanManager { public DataTableData getPaged(DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal, String fieldsGroup) throws Exception { UUID principalID = principal.getId(); QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()); - QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, principalID); + List roles = new LinkedList<>(); + if (dataManagementPlanTableRequest.getCriteria().getRole() != null) roles.add(dataManagementPlanTableRequest.getCriteria().getRole()); + QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, principalID, roles); QueryableList pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); DataTableData dataTable = new DataTableData<>(); @@ -363,7 +365,8 @@ public class DataManagementPlanManager { public List getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria, Principal principal) throws IllegalAccessException, InstantiationException { UUID principalID = principal.getId(); QueryableList items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlan.class)); - QueryableList authenticatedItems = dmpsRepository.getAuthenticated(items, principalID); + List roles = new LinkedList<>(); + QueryableList authenticatedItems = dmpsRepository.getAuthenticated(items, principalID, roles); List datamanagementPlans = authenticatedItems.select(item -> new DataManagementPlan().fromDataModel(item)); return datamanagementPlans; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java index 364723317..564568ad5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java @@ -3,6 +3,7 @@ package eu.eudat.logic.managers; import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.data.dao.entities.UserInfoDao; import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.UserDMP; import eu.eudat.data.entities.UserInfo; import eu.eudat.data.entities.UserRole; import eu.eudat.data.query.items.table.userinfo.UserInfoTableRequestItem; @@ -28,10 +29,7 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; @Component @@ -66,7 +64,8 @@ public class UserManager { public UserProfile getSingle(UUID userId) throws Exception { eu.eudat.data.entities.UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(userId); UserProfile profile = new UserProfile().fromDataModel(user); - List dmps = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable(), userId).take(5).toList(); + List roles = new LinkedList<>(); + List dmps = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable(), userId, roles).take(5).toList(); profile.setAssociatedDmps(dmps.stream().map(x -> new DataManagementPlan().fromDataModel(x)).collect(Collectors.toList())); return profile; }