From 1186c9e292ef0b38a81326aa45ee96e826043ebf Mon Sep 17 00:00:00 2001 From: Gimhan-minion Date: Thu, 10 Feb 2022 17:06:21 +0530 Subject: [PATCH] Add query param to publish an enterprise release directly --- .../common/services/ApplicationManager.java | 17 +++- .../mgt/core/impl/ApplicationManagerImpl.java | 97 ++++++++++++++++--- .../ApplicationManagementPublisherAPI.java | 5 + ...ApplicationManagementPublisherAPIImpl.java | 3 +- 4 files changed, 106 insertions(+), 16 deletions(-) diff --git a/components/application-mgt/io.entgra.application.mgt.common/src/main/java/io/entgra/application/mgt/common/services/ApplicationManager.java b/components/application-mgt/io.entgra.application.mgt.common/src/main/java/io/entgra/application/mgt/common/services/ApplicationManager.java index c3080d4092e..018f9af7d92 100644 --- a/components/application-mgt/io.entgra.application.mgt.common/src/main/java/io/entgra/application/mgt/common/services/ApplicationManager.java +++ b/components/application-mgt/io.entgra.application.mgt.common/src/main/java/io/entgra/application/mgt/common/services/ApplicationManager.java @@ -180,7 +180,18 @@ public interface ApplicationManager { */ ApplicationRelease changeLifecycleState(String releaseUuid, LifecycleChanger lifecycleChanger) throws ApplicationManagementException; - + + /** + * To get all the releases of a particular ApplicationDTO. + * + * @param applicationReleaseDTO of the ApplicationDTO Release. + * @param lifecycleChanger Lifecycle changer that contains the action and the reason for the change. + * @throws ApplicationManagementException ApplicationDTO Management Exception. + * @return + */ + ApplicationRelease changeLifecycleState(ApplicationReleaseDTO applicationReleaseDTO, LifecycleChanger lifecycleChanger) + throws ApplicationManagementException; + /** * To update release images such as icons, banner and screenshots. * @@ -208,10 +219,11 @@ public interface ApplicationManager { * * @param applicationId ID of the ApplicationDTO * @param entAppReleaseWrapper ApplicatonRelease that need to be be created. + * @param isPublished checks if application should be published * @return the unique id of the application release, if the application release succeeded else -1 */ ApplicationRelease createEntAppRelease(int applicationId, EntAppReleaseWrapper entAppReleaseWrapper, - ApplicationArtifact applicationArtifact) throws ApplicationManagementException; + ApplicationArtifact applicationArtifact, boolean isPublished) throws ApplicationManagementException; /*** * @@ -305,5 +317,4 @@ public interface ApplicationManager { String getPlistArtifact(String uuid) throws ApplicationManagementException; List getReleaseByPackageNames(List packageIds) throws ApplicationManagementException; - } diff --git a/components/application-mgt/io.entgra.application.mgt.core/src/main/java/io/entgra/application/mgt/core/impl/ApplicationManagerImpl.java b/components/application-mgt/io.entgra.application.mgt.core/src/main/java/io/entgra/application/mgt/core/impl/ApplicationManagerImpl.java index 8f484b383e6..599576f7b3a 100644 --- a/components/application-mgt/io.entgra.application.mgt.core/src/main/java/io/entgra/application/mgt/core/impl/ApplicationManagerImpl.java +++ b/components/application-mgt/io.entgra.application.mgt.core/src/main/java/io/entgra/application/mgt/core/impl/ApplicationManagerImpl.java @@ -940,18 +940,23 @@ ApplicationManagerImpl implements ApplicationManager { log.debug("Creating a new release. App Id:" + appId); } - String lifeCycleState; - if(isPublished){ - lifeCycleState = lifecycleStateManager.getInstallableState(); - } else { - lifeCycleState = lifecycleStateManager.getInitialState(); - } + String lifeCycleState = lifecycleStateManager.getInitialState(); + String[] publishStates= {"IN-REVIEW", "APPROVED", "PUBLISHED"}; applicationReleaseDTO.setCurrentState(lifeCycleState); - applicationReleaseDTO = this.applicationReleaseDAO - .createRelease(applicationReleaseDTO, appId, tenantId); + applicationReleaseDTO = this.applicationReleaseDAO.createRelease(applicationReleaseDTO, appId, tenantId); LifecycleState lifecycleState = getLifecycleStateInstance(lifeCycleState, lifeCycleState); this.lifecycleStateDAO.addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); + + if(isPublished){ + for (String state: publishStates) { + LifecycleChanger lifecycleChanger = new LifecycleChanger(); + lifecycleChanger.setAction(state); + lifecycleChanger.setReason("Updated to " + state); + this.changeLifecycleState(applicationReleaseDTO, lifecycleChanger); + } + } + applicationReleaseEntities.add(applicationReleaseDTO); applicationDTO.setApplicationReleaseDTOs(applicationReleaseEntities); Application application = APIUtil.appDtoToAppResponse(applicationDTO); @@ -1011,7 +1016,7 @@ ApplicationManagerImpl implements ApplicationManager { @Override public ApplicationRelease createEntAppRelease(int applicationId, EntAppReleaseWrapper entAppReleaseWrapper, - ApplicationArtifact applicationArtifact) throws ApplicationManagementException { + ApplicationArtifact applicationArtifact, boolean isPublished) throws ApplicationManagementException { int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); if (log.isDebugEnabled()) { log.debug("Application release creating request is received for the application id: " + applicationId); @@ -1037,15 +1042,28 @@ ApplicationManagerImpl implements ApplicationManager { ApplicationReleaseDTO applicationReleaseDTO = uploadEntAppReleaseArtifacts( APIUtil.releaseWrapperToReleaseDTO(entAppReleaseWrapper), applicationArtifact, deviceType.getName(), tenantId, true); + try { ConnectionManagerUtil.beginDBTransaction(); - String initialstate = lifecycleStateManager.getInitialState(); - applicationReleaseDTO.setCurrentState(initialstate); - LifecycleState lifecycleState = getLifecycleStateInstance(initialstate, initialstate); + String lifeCycleState = lifecycleStateManager.getInitialState(); + String[] publishStates= {"IN-REVIEW", "APPROVED", "PUBLISHED"}; + + applicationReleaseDTO.setCurrentState(lifeCycleState); + LifecycleState lifecycleState = getLifecycleStateInstance(lifeCycleState, lifeCycleState); applicationReleaseDTO = this.applicationReleaseDAO .createRelease(applicationReleaseDTO, applicationDTO.getId(), tenantId); this.lifecycleStateDAO .addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); + + if(isPublished){ + for (String state: publishStates) { + LifecycleChanger lifecycleChanger = new LifecycleChanger(); + lifecycleChanger.setAction(state); + lifecycleChanger.setReason("Updated to " + state); + this.changeLifecycleState(applicationReleaseDTO, lifecycleChanger); + } + } + ApplicationRelease applicationRelease = APIUtil.releaseDtoToRelease(applicationReleaseDTO); ConnectionManagerUtil.commitDBTransaction(); return applicationRelease; @@ -1890,6 +1908,61 @@ ApplicationManagerImpl implements ApplicationManager { ConnectionManagerUtil.closeDBConnection(); } } + + public ApplicationRelease changeLifecycleState(ApplicationReleaseDTO applicationReleaseDTO, LifecycleChanger lifecycleChanger) throws ApplicationManagementException { + + int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); + String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); + if (lifecycleChanger == null || StringUtils.isEmpty(lifecycleChanger.getAction())) { + String msg = "The Action is null or empty. Please verify the request."; + log.error(msg); + throw new BadRequestException(msg); + } + + try{ + if (lifecycleStateManager + .isValidStateChange(applicationReleaseDTO.getCurrentState(), lifecycleChanger.getAction(), userName, + tenantId)) { + if (lifecycleStateManager.isInstallableState(lifecycleChanger.getAction()) && applicationReleaseDAO + .hasExistInstallableAppRelease(applicationReleaseDTO.getUuid(), + lifecycleStateManager.getInstallableState(), tenantId)) { + String msg = "Installable application release is already registered for the application. " + + "Therefore it is not permitted to change the lifecycle state from " + + applicationReleaseDTO.getCurrentState() + " to " + lifecycleChanger.getAction(); + log.error(msg); + throw new ForbiddenException(msg); + } + LifecycleState lifecycleState = new LifecycleState(); + lifecycleState.setCurrentState(lifecycleChanger.getAction()); + lifecycleState.setPreviousState(applicationReleaseDTO.getCurrentState()); + lifecycleState.setUpdatedBy(userName); + lifecycleState.setReasonForChange(lifecycleChanger.getReason()); + applicationReleaseDTO.setCurrentState(lifecycleChanger.getAction()); + if (this.applicationReleaseDAO.updateRelease(applicationReleaseDTO, tenantId) == null) { + String msg = "Application release updating is failed/."; + log.error(msg); + throw new ApplicationManagementException(msg); + } + this.lifecycleStateDAO.addLifecycleState(lifecycleState, applicationReleaseDTO.getId(), tenantId); + return APIUtil.releaseDtoToRelease(applicationReleaseDTO); + } else { + String msg = "Invalid lifecycle state transition from '" + applicationReleaseDTO.getCurrentState() + "'" + + " to '" + lifecycleChanger.getAction() + "'"; + log.error(msg); + throw new ApplicationManagementException(msg); + } + } catch (ApplicationManagementDAOException e) { + String msg = "Error occurred when accessing application release data of application release which has the " + + "application release UUID: " + applicationReleaseDTO.getUuid(); + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } catch (LifeCycleManagementDAOException e) { + String msg = "Failed to add lifecycle state for Application release UUID: " + applicationReleaseDTO.getUuid(); + log.error(msg, e); + throw new ApplicationManagementException(msg, e); + } + } + @Override public void addApplicationCategories(List categories) throws ApplicationManagementException { diff --git a/components/application-mgt/io.entgra.application.mgt.publisher.api/src/main/java/io/entgra/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java b/components/application-mgt/io.entgra.application.mgt.publisher.api/src/main/java/io/entgra/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java index 3f37f9252af..772ac1a33dd 100644 --- a/components/application-mgt/io.entgra.application.mgt.publisher.api/src/main/java/io/entgra/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java +++ b/components/application-mgt/io.entgra.application.mgt.publisher.api/src/main/java/io/entgra/application/mgt/publisher/api/services/ApplicationManagementPublisherAPI.java @@ -613,6 +613,11 @@ public interface ApplicationManagementPublisherAPI { value = "The application release that need to be created.", required = true) @Multipart("applicationRelease") EntAppReleaseWrapper entAppReleaseWrapper, + @ApiParam( + name = "isPublished", + value = "Published state of the application" + ) + @QueryParam("is-Published") boolean isPublished, @ApiParam( name = "binaryFile", value = "Binary file of uploading application", diff --git a/components/application-mgt/io.entgra.application.mgt.publisher.api/src/main/java/io/entgra/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java b/components/application-mgt/io.entgra.application.mgt.publisher.api/src/main/java/io/entgra/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java index ee41b8b976c..155348284ff 100644 --- a/components/application-mgt/io.entgra.application.mgt.publisher.api/src/main/java/io/entgra/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java +++ b/components/application-mgt/io.entgra.application.mgt.publisher.api/src/main/java/io/entgra/application/mgt/publisher/api/services/impl/ApplicationManagementPublisherAPIImpl.java @@ -355,6 +355,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem @PathParam("deviceType") String deviceType, @PathParam("appId") int appId, @Multipart("applicationRelease") EntAppReleaseWrapper entAppReleaseWrapper, + @QueryParam("is-published") boolean isPublished, @Multipart("binaryFile") Attachment binaryFile, @Multipart("icon") Attachment iconFile, @Multipart(value = "banner", required = false) Attachment bannerFile, @@ -370,7 +371,7 @@ public class ApplicationManagementPublisherAPIImpl implements ApplicationManagem // Created new Ent App release ApplicationRelease release = applicationManager.createEntAppRelease(appId, entAppReleaseWrapper, - constructApplicationArtifact(binaryFile, iconFile, bannerFile, attachmentList)); + constructApplicationArtifact(binaryFile, iconFile, bannerFile, attachmentList), isPublished); if (release != null) { return Response.status(Response.Status.CREATED).entity(release).build(); } else {