From cacd5ec742e8421a011a35a0568842cc56ade7e5 Mon Sep 17 00:00:00 2001 From: Kavin Prathaban Date: Tue, 3 Dec 2024 09:08:22 +0000 Subject: [PATCH] Add validation for having pending operations while app installation (#550) ## Purpose Fixes https://roadmap.entgra.net/issues/11578 Co-authored-by: prathabanKavin Reviewed-on: https://repository.entgra.net/community/device-mgt-core/pulls/550 Co-authored-by: Kavin Prathaban Co-committed-by: Kavin Prathaban --- .../core/impl/SubscriptionManagerImpl.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java index 92f0734c9f..e9ce69d67d 100644 --- a/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java +++ b/components/application-mgt/io.entgra.device.mgt.core.application.mgt.core/src/main/java/io/entgra/device/mgt/core/application/mgt/core/impl/SubscriptionManagerImpl.java @@ -707,6 +707,25 @@ public class SubscriptionManagerImpl implements SubscriptionManager { } } + /** + * Validates if all devices in the subscription have pending operations for the application. + * + * @param devices List of {@link Device} + * @param subscribingDeviceIdHolder Subscribing device id holder. + * @throws BadRequestException if incompatible data is found with validate pending app operations request + */ + private void validatePendingAppSubscription(List devices, SubscribingDeviceIdHolder subscribingDeviceIdHolder) throws BadRequestException{ + Set deviceIdentifiers = devices.stream() + .map(device -> new DeviceIdentifier(device.getDeviceIdentifier(), device.getType())) + .collect(Collectors.toSet()); + Set skippedDevices = subscribingDeviceIdHolder.getSkippedDevices().keySet(); + if (skippedDevices.containsAll(deviceIdentifiers) && deviceIdentifiers.containsAll(skippedDevices)) { + String msg = "All devices in the subscription have pending operations for this application."; + log.error(msg); + throw new BadRequestException(msg); + } + } + /** * This method perform given action (i.e APP INSTALL or APP UNINSTALL) on given set of devices. * @@ -741,6 +760,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager { Map> deviceIdentifierMap = new HashMap<>(); if (SubAction.INSTALL.toString().equalsIgnoreCase(action)) { + validatePendingAppSubscription(devices, subscribingDeviceIdHolder); deviceIdentifiers.addAll(new ArrayList<>(subscribingDeviceIdHolder.getAppInstallableDevices().keySet())); deviceIdentifiers.addAll(new ArrayList<>(subscribingDeviceIdHolder.getAppReInstallableDevices().keySet())); if (!isOperationReExecutingDisabled) {