diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java index a1b655bbe9..2762309f71 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java @@ -1,6 +1,9 @@ package org.lowcoder.api.application; -import jakarta.annotation.Nonnull; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.lowcoder.api.application.view.ApplicationInfoView; import org.lowcoder.api.application.view.ApplicationPermissionView; import org.lowcoder.api.application.view.ApplicationPublishRequest; @@ -10,14 +13,11 @@ import org.lowcoder.domain.permission.model.ResourceAction; import org.lowcoder.domain.permission.model.ResourcePermission; import org.lowcoder.domain.permission.model.ResourceRole; -import org.springframework.web.bind.annotation.PathVariable; +import jakarta.annotation.Nonnull; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.List; -import java.util.Set; - public interface ApplicationApiService { Mono create(ApplicationEndpoints.CreateApplicationRequest createApplicationRequest); @@ -39,6 +39,8 @@ public interface ApplicationApiService { Mono publish(String applicationId, ApplicationPublishRequest applicationPublishRequest); + Mono publishWithRollback(String applicationId, ApplicationPublishRequest applicationPublishRequest, Map rollbackDsl); + Mono updateEditState(String applicationId, ApplicationEndpoints.UpdateEditStateRequest updateEditStateRequest); Mono grantPermission(String applicationId, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java index 66b62b258b..ab9f834c49 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java @@ -1,12 +1,30 @@ package org.lowcoder.api.application; -import com.github.f4b6a3.uuid.UuidCreator; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import jakarta.annotation.Nonnull; -import jakarta.annotation.Nullable; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import static org.lowcoder.domain.application.model.ApplicationStatus.NORMAL; +import static org.lowcoder.domain.permission.model.ResourceAction.EDIT_APPLICATIONS; +import static org.lowcoder.domain.permission.model.ResourceAction.MANAGE_APPLICATIONS; +import static org.lowcoder.domain.permission.model.ResourceAction.PUBLISH_APPLICATIONS; +import static org.lowcoder.domain.permission.model.ResourceAction.READ_APPLICATIONS; +import static org.lowcoder.domain.permission.model.ResourceAction.USE_DATASOURCES; +import static org.lowcoder.sdk.exception.BizError.ILLEGAL_APPLICATION_PERMISSION_ID; +import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; +import static org.lowcoder.sdk.exception.BizError.NOT_AUTHORIZED; +import static org.lowcoder.sdk.exception.BizError.NO_PERMISSION_TO_REQUEST_APP; +import static org.lowcoder.sdk.exception.BizError.USER_NOT_SIGNED_IN; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; +import static org.lowcoder.sdk.util.ExceptionUtils.ofErrorWithHeaders; + +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.SetUtils; import org.apache.commons.lang3.ObjectUtils; @@ -27,21 +45,26 @@ import org.lowcoder.api.usermanagement.OrgDevChecker; import org.lowcoder.api.usermanagement.view.GroupView; import org.lowcoder.api.usermanagement.view.OrgMemberListView; -import org.lowcoder.domain.application.model.*; +import org.lowcoder.domain.application.model.Application; +import org.lowcoder.domain.application.model.ApplicationRequestType; +import org.lowcoder.domain.application.model.ApplicationStatus; +import org.lowcoder.domain.application.model.ApplicationType; +import org.lowcoder.domain.application.model.ApplicationVersion; import org.lowcoder.domain.application.service.ApplicationHistorySnapshotService; import org.lowcoder.domain.application.service.ApplicationRecordService; import org.lowcoder.domain.application.service.ApplicationService; import org.lowcoder.domain.datasource.model.Datasource; import org.lowcoder.domain.datasource.service.DatasourceService; import org.lowcoder.domain.folder.service.FolderElementRelationService; -import org.lowcoder.domain.group.model.Group; -import org.lowcoder.domain.group.model.GroupMember; import org.lowcoder.domain.interaction.UserApplicationInteractionService; -import org.lowcoder.domain.organization.model.OrgMember; import org.lowcoder.domain.organization.model.Organization; import org.lowcoder.domain.organization.service.OrgMemberService; import org.lowcoder.domain.organization.service.OrganizationService; -import org.lowcoder.domain.permission.model.*; +import org.lowcoder.domain.permission.model.ResourceAction; +import org.lowcoder.domain.permission.model.ResourceHolder; +import org.lowcoder.domain.permission.model.ResourcePermission; +import org.lowcoder.domain.permission.model.ResourceRole; +import org.lowcoder.domain.permission.model.ResourceType; import org.lowcoder.domain.permission.service.ResourcePermissionService; import org.lowcoder.domain.permission.solution.SuggestAppAdminSolutionService; import org.lowcoder.domain.plugin.service.DatasourceMetaInfoService; @@ -56,22 +79,18 @@ import org.lowcoder.sdk.util.ExceptionUtils; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.PathVariable; +import com.github.f4b6a3.uuid.UuidCreator; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; -import reactor.util.function.Tuple2; - -import java.time.Duration; -import java.time.Instant; -import java.util.*; -import java.util.stream.Collectors; - -import static org.lowcoder.domain.application.model.ApplicationStatus.NORMAL; -import static org.lowcoder.domain.permission.model.ResourceAction.*; -import static org.lowcoder.sdk.exception.BizError.*; -import static org.lowcoder.sdk.util.ExceptionUtils.*; @RequiredArgsConstructor @Service @@ -398,6 +417,27 @@ public Mono publish(String applicationId, ApplicationPublishReq .build()))); } + @Override + public Mono publishWithRollback(String applicationId, ApplicationPublishRequest applicationPublishRequest, Map rollbackDsl) { + return checkApplicationStatus(applicationId, NORMAL) + .then(sessionUserService.getVisitorId()) + .flatMap(userId -> resourcePermissionService.checkAndReturnMaxPermission(userId, + applicationId, PUBLISH_APPLICATIONS)) + .delayUntil(__ -> applicationService.findById(applicationId) + .map(application -> ApplicationVersion.builder() + .tag(applicationPublishRequest.tag()) + .commitMessage(applicationPublishRequest.commitMessage()) + .applicationId(application.getId()) + .applicationDSL(rollbackDsl) // Use the rollback DSL instead of current editing DSL + .build()) + .flatMap(applicationRecordService::insert)) + .flatMap(permission -> applicationService.findById(applicationId) + .flatMap(applicationUpdated -> buildView(applicationUpdated, permission.getResourceRole().getValue()).map(appInfoView -> ApplicationView.builder() + .applicationInfoView(appInfoView) + .applicationDSL(rollbackDsl) // Return the rollback DSL in the response + .build()))); + } + @Override public Mono updateEditState(String applicationId, ApplicationEndpoints.UpdateEditStateRequest updateEditStateRequest) { return checkApplicationStatus(applicationId, NORMAL) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java index cfec54a132..83b5a3e1a4 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java @@ -1,7 +1,24 @@ package org.lowcoder.api.application; -import lombok.RequiredArgsConstructor; -import org.lowcoder.api.application.view.*; +import static org.apache.commons.collections4.SetUtils.emptyIfNull; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_CREATE; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_DELETE; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_RECYCLED; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_RESTORE; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_UPDATE; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_VIEW; +import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.lowcoder.api.application.view.ApplicationInfoView; +import org.lowcoder.api.application.view.ApplicationPermissionView; +import org.lowcoder.api.application.view.ApplicationPublishRequest; +import org.lowcoder.api.application.view.ApplicationView; +import org.lowcoder.api.application.view.MarketplaceApplicationInfoView; import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.home.UserHomeApiService; @@ -18,17 +35,10 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; -import java.util.List; -import java.util.Objects; - -import static org.apache.commons.collections4.SetUtils.emptyIfNull; -import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.*; -import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; +import lombok.RequiredArgsConstructor; import reactor.core.publisher.Flux; -import java.util.Map; +import reactor.core.publisher.Mono; @RequiredArgsConstructor @RestController @@ -157,14 +167,32 @@ public Mono> publish(@PathVariable String applicat }) .switchIfEmpty(Mono.just("1.0.0")) .delayUntil(newtag -> { - ApplicationPublishRequest req = Objects.requireNonNullElse(applicationPublishRequest, new ApplicationPublishRequest("", newtag)); + ApplicationPublishRequest req = Objects.requireNonNullElse(applicationPublishRequest, new ApplicationPublishRequest("", newtag, null)); return businessEventPublisher.publishApplicationPublishEvent(appId, req).then(Mono.defer(() -> { if(newtag.equals(req.tag())) { return businessEventPublisher.publishApplicationVersionChangeEvent(appId, newtag); } else return Mono.empty(); })); }) - .flatMap(newtag -> applicationApiService.publish(appId, Objects.requireNonNullElse(applicationPublishRequest, new ApplicationPublishRequest("", newtag)))) + .flatMap(newtag -> { + ApplicationPublishRequest req = Objects.requireNonNullElse(applicationPublishRequest, new ApplicationPublishRequest("", newtag, null)); + + // If rollback is requested, get the DSL from the specified version + if (req.rollbackToVersionId() != null && !req.rollbackToVersionId().isEmpty()) { + return applicationRecordService.getById(req.rollbackToVersionId()) + .flatMap(rollbackVersion -> { + // Create a new request with the rollback DSL + ApplicationPublishRequest rollbackRequest = new ApplicationPublishRequest( + req.commitMessage(), + req.tag(), + req.rollbackToVersionId() + ); + return applicationApiService.publishWithRollback(appId, rollbackRequest, rollbackVersion.getApplicationDSL()); + }); + } else { + return applicationApiService.publish(appId, req); + } + }) .map(ResponseView::success)); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordApiService.java index 9ea29e9c87..c421ab6a12 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordApiService.java @@ -1,11 +1,12 @@ package org.lowcoder.api.application; +import java.util.List; +import java.util.Map; + import org.lowcoder.api.application.view.ApplicationRecordMetaView; import org.lowcoder.domain.application.model.ApplicationCombineId; -import reactor.core.publisher.Mono; -import java.util.List; -import java.util.Map; +import reactor.core.publisher.Mono; public interface ApplicationRecordApiService { Mono> getRecordDSLFromApplicationCombineId(ApplicationCombineId applicationCombineId); @@ -13,4 +14,6 @@ public interface ApplicationRecordApiService { Mono delete(String id); Mono> getByApplicationId(String applicationId); + + Mono> getVersionDsl(String applicationRecordId); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordApiServiceImpl.java index 6dc204218e..7097730089 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordApiServiceImpl.java @@ -1,25 +1,26 @@ package org.lowcoder.api.application; -import lombok.RequiredArgsConstructor; -import org.lowcoder.api.home.SessionUserService; +import static org.lowcoder.api.util.ViewBuilder.multiBuild; +import static org.lowcoder.sdk.exception.BizError.APPLICATION_AND_ORG_NOT_MATCH; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; + +import java.util.List; +import java.util.Map; + import org.lowcoder.api.application.view.ApplicationRecordMetaView; +import org.lowcoder.api.home.SessionUserService; import org.lowcoder.api.usermanagement.OrgDevChecker; -import org.lowcoder.domain.application.model.ApplicationVersion; -import org.lowcoder.domain.organization.model.OrgMember; import org.lowcoder.domain.application.model.Application; import org.lowcoder.domain.application.model.ApplicationCombineId; +import org.lowcoder.domain.application.model.ApplicationVersion; import org.lowcoder.domain.application.service.ApplicationRecordService; import org.lowcoder.domain.application.service.ApplicationService; +import org.lowcoder.domain.organization.model.OrgMember; import org.lowcoder.domain.user.service.UserService; import org.springframework.stereotype.Service; -import reactor.core.publisher.Mono; -import java.util.List; -import java.util.Map; - -import static org.lowcoder.api.util.ViewBuilder.multiBuild; -import static org.lowcoder.sdk.exception.BizError.APPLICATION_AND_ORG_NOT_MATCH; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; +import lombok.RequiredArgsConstructor; +import reactor.core.publisher.Mono; @RequiredArgsConstructor @Service @@ -60,6 +61,13 @@ public Mono> getByApplicationId(String applicati )); } + @Override + public Mono> getVersionDsl(String applicationRecordId) { + return checkApplicationRecordViewPermission(new ApplicationCombineId(null, applicationRecordId)) + .then(applicationRecordService.getById(applicationRecordId)) + .map(ApplicationVersion::getApplicationDSL); + } + Mono checkApplicationRecordManagementPermission(String applicationRecordId) { return orgDevChecker.checkCurrentOrgDev() diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordController.java index 5addbe8d10..b9292b03eb 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordController.java @@ -1,17 +1,17 @@ package org.lowcoder.api.application; -import lombok.RequiredArgsConstructor; -import org.lowcoder.api.framework.view.ResponseView; -import org.lowcoder.api.application.ApplicationRecordApiService; +import java.util.List; +import java.util.Map; + import org.lowcoder.api.application.view.ApplicationRecordMetaView; +import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.domain.application.model.ApplicationCombineId; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; -import java.util.List; -import java.util.Map; +import lombok.RequiredArgsConstructor; +import reactor.core.publisher.Mono; @RequiredArgsConstructor @RestController @@ -38,4 +38,9 @@ public Mono>> dslById(@RequestParam(name = "app .map(ResponseView::success); } + @Override + public Mono>> getVersionDsl(@PathVariable String applicationRecordId) { + return applicationRecordApiService.getVersionDsl(applicationRecordId) + .map(ResponseView::success); + } } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordEndpoints.java index d1c7603418..288f723477 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationRecordEndpoints.java @@ -1,15 +1,21 @@ package org.lowcoder.api.application; -import io.swagger.v3.oas.annotations.Operation; -import org.lowcoder.api.framework.view.ResponseView; -import org.lowcoder.api.application.view.ApplicationRecordMetaView; -import org.springframework.web.bind.annotation.*; -import reactor.core.publisher.Mono; +import static org.lowcoder.infra.constant.NewUrl.APPLICATION_RECORD_URL; import java.util.List; import java.util.Map; -import static org.lowcoder.infra.constant.NewUrl.APPLICATION_RECORD_URL; +import org.lowcoder.api.application.view.ApplicationRecordMetaView; +import org.lowcoder.api.framework.view.ResponseView; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.v3.oas.annotations.Operation; +import reactor.core.publisher.Mono; @RestController @RequestMapping(value = APPLICATION_RECORD_URL) @@ -45,4 +51,13 @@ public interface ApplicationRecordEndpoints public Mono>> dslById(@RequestParam(name = "applicationId") String applicationId, @RequestParam(name = "applicationRecordId") String applicationRecordId); + @Operation( + tags = TAG_APPLICATION_RECORDS, + operationId = "getVersionDsl", + summary = "Get DSL from specific version", + description = "Retrieve the DSL data from a specific application version for rollback preview" + ) + @GetMapping("/{applicationRecordId}/dsl") + public Mono>> getVersionDsl(@PathVariable String applicationRecordId); + } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationPublishRequest.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationPublishRequest.java index f69cf3bb97..f69855e953 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationPublishRequest.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationPublishRequest.java @@ -1,5 +1,5 @@ package org.lowcoder.api.application.view; -public record ApplicationPublishRequest(String commitMessage, String tag) { +public record ApplicationPublishRequest(String commitMessage, String tag, String rollbackToVersionId) { } diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java index 0a4fdd3f64..77539a7c3d 100644 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationApiServiceTest.java @@ -1,10 +1,12 @@ package org.lowcoder.api.application; -import lombok.extern.slf4j.Slf4j; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.lowcoder.api.application.ApplicationEndpoints.CreateApplicationRequest; @@ -21,24 +23,20 @@ import org.lowcoder.domain.application.model.ApplicationStatus; import org.lowcoder.domain.application.model.ApplicationType; import org.lowcoder.domain.application.service.ApplicationService; -import org.lowcoder.domain.solutions.TemplateSolutionService; - +import org.lowcoder.domain.permission.model.ResourceAction; import org.lowcoder.domain.permission.model.ResourceHolder; import org.lowcoder.domain.permission.model.ResourceRole; -import org.lowcoder.domain.permission.model.ResourceAction; -import org.lowcoder.domain.permission.model.ResourcePermission; +import org.lowcoder.domain.solutions.TemplateSolutionService; import org.lowcoder.sdk.constants.FieldName; import org.lowcoder.sdk.exception.BizError; import org.lowcoder.sdk.exception.BizException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; + +import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; - -import java.util.List; -import java.util.Map; -import java.util.Set; @SpringBootTest //@RunWith(SpringRunner.class) @ActiveProfiles("ApplicationApiServiceTest") @@ -202,7 +200,7 @@ public void testGetPublishedApplication() { // Publish the application Mono publishedAppIdMono = appIdMono - .delayUntil(appId -> applicationApiService.publish(appId, new ApplicationPublishRequest("Initial Publish", "1.0.0"))) + .delayUntil(appId -> applicationApiService.publish(appId, new ApplicationPublishRequest("Initial Publish", "1.0.0", null))) .cache(); // Retrieve the published application and verify its properties @@ -264,7 +262,7 @@ public void testPublishFunction() { .cache(); // Step 2: Publish the application - ApplicationPublishRequest publishRequest = new ApplicationPublishRequest("Initial Publish", "1.0.0"); + ApplicationPublishRequest publishRequest = new ApplicationPublishRequest("Initial Publish", "1.0.0", null); Mono publishedAppMono = appIdMono .delayUntil(appId -> applicationApiService.publish(appId, publishRequest)) .flatMap(appId -> applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_ALL, false)); @@ -652,7 +650,7 @@ public void testPublishApplication() { // publish applicationIdMono = applicationIdMono - .delayUntil(id -> applicationApiService.publish(id, new ApplicationPublishRequest("Test Publish", "1.0.0"))).cache(); + .delayUntil(id -> applicationApiService.publish(id, new ApplicationPublishRequest("Test Publish", "1.0.0", null))).cache(); // edit dsl after publish StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id, false))) @@ -680,7 +678,7 @@ public void testPublishApplication() { // publish 2 applicationIdMono = applicationIdMono - .delayUntil(id -> applicationApiService.publish(id, new ApplicationPublishRequest("Test Publish 2", "2.0.0"))).cache(); + .delayUntil(id -> applicationApiService.publish(id, new ApplicationPublishRequest("Test Publish 2", "2.0.0", null))).cache(); // edit dsl after publish StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id, false))) @@ -694,7 +692,7 @@ public void testPublishApplication() { // publish 3 applicationIdMono = applicationIdMono - .delayUntil(id -> applicationApiService.publish(id, new ApplicationPublishRequest("Same tag", "2.0.0"))).cache(); + .delayUntil(id -> applicationApiService.publish(id, new ApplicationPublishRequest("Same tag", "2.0.0", null))).cache(); // Error StepVerifier.create(applicationIdMono) diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationEndpointsTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationEndpointsTest.java index c09bc9d63a..db2c0cf6d4 100644 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationEndpointsTest.java +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/application/ApplicationEndpointsTest.java @@ -1,9 +1,28 @@ package org.lowcoder.api.application; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; + +import java.util.HashMap; +import java.util.List; +import java.util.Set; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.lowcoder.api.application.ApplicationEndpoints.*; -import org.lowcoder.api.application.view.*; +import org.lowcoder.api.application.ApplicationEndpoints.ApplicationAsAgencyProfileRequest; +import org.lowcoder.api.application.ApplicationEndpoints.ApplicationPublicToAllRequest; +import org.lowcoder.api.application.ApplicationEndpoints.ApplicationPublicToMarketplaceRequest; +import org.lowcoder.api.application.ApplicationEndpoints.BatchAddPermissionRequest; +import org.lowcoder.api.application.ApplicationEndpoints.CreateApplicationRequest; +import org.lowcoder.api.application.ApplicationEndpoints.UpdateEditStateRequest; +import org.lowcoder.api.application.ApplicationEndpoints.UpdatePermissionRequest; +import org.lowcoder.api.application.view.ApplicationInfoView; +import org.lowcoder.api.application.view.ApplicationPermissionView; +import org.lowcoder.api.application.view.ApplicationPublishRequest; +import org.lowcoder.api.application.view.ApplicationView; +import org.lowcoder.api.application.view.MarketplaceApplicationInfoView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.home.UserHomeApiService; import org.lowcoder.api.home.UserHomepageView; @@ -15,16 +34,10 @@ import org.lowcoder.domain.application.service.ApplicationRecordService; import org.lowcoder.domain.permission.model.ResourceRole; import org.mockito.Mockito; + +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; -import reactor.core.publisher.Flux; - -import java.util.HashMap; -import java.util.List; -import java.util.Set; - -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.when; class ApplicationEndpointsTest { @@ -1141,7 +1154,7 @@ void testPublish_success() { void testPublish_withPublishRequest() { // Mock the service responses with publish request ApplicationView mockApplicationView = createMockApplicationView(); - ApplicationPublishRequest publishRequest = new ApplicationPublishRequest("test-tag", "1.0.0"); + ApplicationPublishRequest publishRequest = new ApplicationPublishRequest("test-tag", "1.0.0", null); when(applicationRecordService.getLatestRecordByApplicationId(TEST_APPLICATION_ID)) .thenReturn(Mono.empty()); when(applicationApiService.publish(TEST_APPLICATION_ID, publishRequest))