From 806d681f78c156bc5e6582b659d2d4b14c6eb14b Mon Sep 17 00:00:00 2001 From: Stuart Caunt Date: Tue, 3 Dec 2024 13:16:07 +0100 Subject: [PATCH] Add InstanceSessionResolver to obtain instance entities for instanceSessions when requested by the client. --- .../business/services/InstanceService.java | 8 ++++ .../services/InstanceServiceTest.java | 4 +- .../core/domain/filters/InstanceFilter.java | 12 +++--- .../repositories/InstanceRepository.java | 10 ++--- .../services/DesktopSessionService.java | 3 +- .../resolvers/InstanceSessionResolver.java | 39 +++++++++++++++++++ .../graphql/types/InstanceSessionType.java | 7 ++++ 7 files changed, 70 insertions(+), 13 deletions(-) create mode 100644 visa-web-graphql/src/main/java/eu/ill/visa/web/graphql/resolvers/InstanceSessionResolver.java diff --git a/visa-business/src/main/java/eu/ill/visa/business/services/InstanceService.java b/visa-business/src/main/java/eu/ill/visa/business/services/InstanceService.java index 65e6e83d..4a2105cc 100644 --- a/visa-business/src/main/java/eu/ill/visa/business/services/InstanceService.java +++ b/visa-business/src/main/java/eu/ill/visa/business/services/InstanceService.java @@ -150,6 +150,14 @@ public void save(Instance instance) { } } + public List getAll(final InstanceFilter filter) { + return this.getAll(filter, null, null); + } + + public List getAll(final InstanceFilter filter, final OrderBy orderBy) { + return this.getAll(filter, orderBy, null); + } + public List getAll(final InstanceFilter filter, final OrderBy orderBy, final Pagination pagination) { return this.repository.getAll(filter, orderBy, pagination); } diff --git a/visa-business/src/test/java/eu/ill/visa/business/services/InstanceServiceTest.java b/visa-business/src/test/java/eu/ill/visa/business/services/InstanceServiceTest.java index 4f8bec06..fbee09c7 100644 --- a/visa-business/src/test/java/eu/ill/visa/business/services/InstanceServiceTest.java +++ b/visa-business/src/test/java/eu/ill/visa/business/services/InstanceServiceTest.java @@ -275,7 +275,7 @@ public void instancesForInstrumentScientistWithFilters() { assertNotNull(user1); InstanceFilter filter = new InstanceFilter(); - filter.setId(1000L); + filter.setIds(List.of(1000L)); List instances = this.instanceService.getAllForInstrumentScientist(user1, filter, null, null); assertEquals(1, instances.size()); @@ -316,7 +316,7 @@ public void instancesAllForScientificSupportWithFilters() { assertEquals(2 , instances.size()); filter = new InstanceFilter(); - filter.setId(1008L); + filter.setIds(List.of(1008L)); instances = this.instanceService.getAllForInstrumentControlSupport(filter, null, null); assertEquals(1 , instances.size()); diff --git a/visa-core/src/main/java/eu/ill/visa/core/domain/filters/InstanceFilter.java b/visa-core/src/main/java/eu/ill/visa/core/domain/filters/InstanceFilter.java index 7d4d4b8d..8a49fba8 100644 --- a/visa-core/src/main/java/eu/ill/visa/core/domain/filters/InstanceFilter.java +++ b/visa-core/src/main/java/eu/ill/visa/core/domain/filters/InstanceFilter.java @@ -4,10 +4,12 @@ import eu.ill.visa.core.entity.enumerations.InstanceState; import jakarta.ws.rs.QueryParam; +import java.util.List; + public class InstanceFilter { @QueryParam("id") - private Long id; + private List ids; @QueryParam("nameLike") private String nameLike; @@ -27,12 +29,12 @@ public class InstanceFilter { @QueryParam("ownerId") private String ownerId; - public Long getId() { - return id; + public List getIds() { + return ids; } - public void setId(Long id) { - this.id = id; + public void setIds(List ids) { + this.ids = ids; } public String getNameLike() { diff --git a/visa-persistence/src/main/java/eu/ill/visa/persistence/repositories/InstanceRepository.java b/visa-persistence/src/main/java/eu/ill/visa/persistence/repositories/InstanceRepository.java index df6faf0b..7a30a20e 100644 --- a/visa-persistence/src/main/java/eu/ill/visa/persistence/repositories/InstanceRepository.java +++ b/visa-persistence/src/main/java/eu/ill/visa/persistence/repositories/InstanceRepository.java @@ -205,8 +205,8 @@ protected List convertFilterToPredicates(final InstanceFilter filter, final List predicates = new ArrayList<>(); - if (filter.getId() != null) { - predicates.add(cb.equal(root.get("id"), filter.getId())); + if (filter.getIds() != null && !filter.getIds().isEmpty()) { + predicates.add(root.get("id").in(filter.getIds())); } if (filter.getNameLike() != null) { @@ -511,9 +511,9 @@ public Instance getDeletedInstanceByComputeId(String computeId) { private TypedQuery createFilteredQuery(String queryString, InstanceFilter filter, OrderBy orderBy, Pagination pagination, Class type) { List> queryParameters = new ArrayList<>(); - if (filter != null && filter.getId() != null) { - queryString += " AND i.id = :id"; - queryParameters.add(new SimpleEntry<>("id", filter.getId())); + if (filter != null && filter.getIds() != null && !filter.getIds().isEmpty()) { + queryString += " AND i.id IN (:ids)"; + queryParameters.add(new SimpleEntry<>("ids", filter.getIds())); } if (filter != null && filter.getNameLike() != null) { queryString += " AND LOWER(i.name) like LOWER(:name)"; diff --git a/visa-remote-desktop/src/main/java/eu/ill/visa/vdi/business/services/DesktopSessionService.java b/visa-remote-desktop/src/main/java/eu/ill/visa/vdi/business/services/DesktopSessionService.java index d41e3c78..bc29c8e1 100644 --- a/visa-remote-desktop/src/main/java/eu/ill/visa/vdi/business/services/DesktopSessionService.java +++ b/visa-remote-desktop/src/main/java/eu/ill/visa/vdi/business/services/DesktopSessionService.java @@ -3,6 +3,7 @@ import eu.ill.visa.broker.EventDispatcher; import eu.ill.visa.broker.MessageBroker; import eu.ill.visa.business.services.*; +import eu.ill.visa.core.domain.fetches.InstanceFetch; import eu.ill.visa.core.entity.Instance; import eu.ill.visa.core.entity.InstanceSession; import eu.ill.visa.core.entity.enumerations.InstanceActivityType; @@ -311,7 +312,7 @@ private void onSessionLocked(final Long sessionId, final ConnectedUser user) { desktopSession.filterMembers(desktopSessionMember -> !desktopSessionMember.connectedUser().getRole().equals(InstanceMemberRole.OWNER)) .forEach(desktopSessionMember -> { - final Instance instance = this.instanceService.getFullById(desktopSession.getInstanceId()); + final Instance instance = this.instanceService.getById(desktopSession.getInstanceId(), List.of(InstanceFetch.members)); if (desktopSessionMember.connectedUser().isRole(InstanceMemberRole.SUPPORT) && instanceSessionService.canConnectWhileOwnerAway(instance, desktopSessionMember.connectedUser().getId())) { this.eventDispatcher.sendEventToClient(desktopSessionMember.clientId(), USER_DISCONNECTED_EVENT, new UserDisconnectedEvent(user, desktopSession.getInstanceId())); diff --git a/visa-web-graphql/src/main/java/eu/ill/visa/web/graphql/resolvers/InstanceSessionResolver.java b/visa-web-graphql/src/main/java/eu/ill/visa/web/graphql/resolvers/InstanceSessionResolver.java new file mode 100644 index 00000000..175a83a5 --- /dev/null +++ b/visa-web-graphql/src/main/java/eu/ill/visa/web/graphql/resolvers/InstanceSessionResolver.java @@ -0,0 +1,39 @@ +package eu.ill.visa.web.graphql.resolvers; + +import eu.ill.visa.business.services.InstanceService; +import eu.ill.visa.core.domain.filters.InstanceFilter; +import eu.ill.visa.core.entity.Instance; +import eu.ill.visa.web.graphql.types.InstanceSessionType; +import eu.ill.visa.web.graphql.types.InstanceType; +import jakarta.inject.Inject; +import org.eclipse.microprofile.graphql.GraphQLApi; +import org.eclipse.microprofile.graphql.Source; + +import java.util.List; + + +@GraphQLApi +public class InstanceSessionResolver { + + private final InstanceService instanceService; + + @Inject + public InstanceSessionResolver(final InstanceService instanceService) { + this.instanceService = instanceService; + } + + public List instance(@Source List instanceSessions) { + final InstanceFilter instanceFilter = new InstanceFilter(); + instanceFilter.setIds(instanceSessions.stream().map(InstanceSessionType::getInstanceId).toList()); + List instances = this.instanceService.getAll(instanceFilter); + + return instanceSessions.stream().map(instanceSessionType -> { + return instances.stream().filter(instance -> instance.getId().equals(instanceSessionType.getInstanceId())).findFirst().orElse(null); + }) + .map(instance -> instance == null ? null : new InstanceType(instance)) + .toList(); + } + + +} + diff --git a/visa-web-graphql/src/main/java/eu/ill/visa/web/graphql/types/InstanceSessionType.java b/visa-web-graphql/src/main/java/eu/ill/visa/web/graphql/types/InstanceSessionType.java index fbc1634c..912e71f0 100644 --- a/visa-web-graphql/src/main/java/eu/ill/visa/web/graphql/types/InstanceSessionType.java +++ b/visa-web-graphql/src/main/java/eu/ill/visa/web/graphql/types/InstanceSessionType.java @@ -13,11 +13,14 @@ public class InstanceSessionType { private final @NotNull Long id; private final @NotNull String connectionId; private final @NotNull boolean current; + @AdaptToScalar(Scalar.Int.class) + private final @NotNull Long instanceId; public InstanceSessionType(final InstanceSession session) { this.id = session.getId(); this.connectionId = session.getConnectionId(); this.current = session.getCurrent(); + this.instanceId = session.getInstanceId(); } public Long getId() { @@ -31,4 +34,8 @@ public String getConnectionId() { public boolean isCurrent() { return current; } + + public @NotNull Long getInstanceId() { + return instanceId; + } }