Skip to content

Update for deploy to deleted #1693

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ public class Datasource extends HasIdAndAuditing {

public Datasource mergeWith(Datasource updatedDatasource) {
setName(updatedDatasource.getName());
setDatasourceStatus(updatedDatasource.getDatasourceStatus());
Optional.of(getDetailConfig())
.ifPresentOrElse(currentDetailConfig -> {
if (updatedDatasource.getDetailConfig() instanceof JsDatasourceConnectionConfig jsDatasourceConnectionConfig) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public interface OrganizationService {

Mono<Organization> getById(String id);

Mono<Organization> getByIdWithDeleted(String id);

@NonEmptyMono
Flux<Organization> getByIds(Collection<String> ids);
@NonEmptyMono
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,15 @@ public Mono<Organization> getById(String id) {
.switchIfEmpty(deferredError(UNABLE_TO_FIND_VALID_ORG, "INVALID_ORG_ID"));
}

@Override
public Mono<Organization> getByIdWithDeleted(String id) {
if(FieldName.isGID(id))
return repository.findByGid(id).next()
.switchIfEmpty(deferredError(UNABLE_TO_FIND_VALID_ORG, "INVALID_ORG_ID"));
return repository.findBySlug(id).next().switchIfEmpty(repository.findById(id))
.switchIfEmpty(deferredError(UNABLE_TO_FIND_VALID_ORG, "INVALID_ORG_ID"));
}

@Override
public Mono<OrganizationCommonSettings> getOrgCommonSettings(String orgId) {
if(FieldName.isGID(orgId))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
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 reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

Expand All @@ -26,9 +28,9 @@ public interface ApplicationApiService {

Mono<Boolean> restore(String applicationId);

Mono<ApplicationView> getEditingApplication(String applicationId);
Mono<ApplicationView> getEditingApplication(String applicationId, Boolean withDeleted);

Mono<ApplicationView> getPublishedApplication(String applicationId, ApplicationRequestType requestType);
Mono<ApplicationView> getPublishedApplication(String applicationId, ApplicationRequestType requestType, Boolean withDeleted);

Mono<Void> updateUserApplicationLastViewTime(String applicationId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
import org.lowcoder.sdk.util.ExceptionUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
Expand Down Expand Up @@ -250,15 +252,15 @@ private Mono<Boolean> updateApplicationStatus(String applicationId, ApplicationS
}

@Override
public Mono<ApplicationView> getEditingApplication(String applicationId) {
public Mono<ApplicationView> getEditingApplication(String applicationId, Boolean withDeleted) {
return applicationService.findById(applicationId).filter(application -> application.isPublicToAll() && application.isPublicToMarketplace())
.map(application -> {
ResourcePermission permission = ResourcePermission.builder().resourceRole(ResourceRole.VIEWER).build();
return permission;
})
.switchIfEmpty(checkPermissionWithReadableErrorMsg(applicationId, EDIT_APPLICATIONS))
.zipWhen(permission -> applicationService.findById(applicationId)
.delayUntil(application -> checkApplicationStatus(application, NORMAL)))
.delayUntil(application -> Boolean.TRUE.equals(withDeleted)? Mono.empty() : checkApplicationStatus(application, NORMAL)))
.zipWhen(tuple -> applicationService.getAllDependentModulesFromApplication(tuple.getT2(), false), TupleUtils::merge)
.zipWhen(tuple -> organizationService.getOrgCommonSettings(tuple.getT2().getOrganizationId()), TupleUtils::merge)
.flatMap(tuple -> {
Expand All @@ -284,10 +286,10 @@ public Mono<ApplicationView> getEditingApplication(String applicationId) {
}

@Override
public Mono<ApplicationView> getPublishedApplication(String applicationId, ApplicationRequestType requestType) {
public Mono<ApplicationView> getPublishedApplication(String applicationId, ApplicationRequestType requestType, Boolean withDeleted) {
return checkApplicationPermissionWithReadableErrorMsg(applicationId, READ_APPLICATIONS, requestType)
.zipWhen(permission -> applicationService.findById(applicationId)
.delayUntil(application -> checkApplicationStatus(application, NORMAL))
.delayUntil(application -> Boolean.TRUE.equals(withDeleted)? Mono.empty() : checkApplicationStatus(application, NORMAL))
.delayUntil(application -> checkApplicationViewRequest(application, requestType)))
.zipWhen(tuple -> applicationService.getAllDependentModulesFromApplication(tuple.getT2(), true), TupleUtils::merge)
.zipWhen(tuple -> organizationService.getOrgCommonSettings(tuple.getT2().getOrganizationId()), TupleUtils::merge)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,17 +84,17 @@ public Mono<ResponseView<ApplicationView>> delete(@PathVariable String applicati
}

@Override
public Mono<ResponseView<ApplicationView>> getEditingApplication(@PathVariable String applicationId) {
public Mono<ResponseView<ApplicationView>> getEditingApplication(@PathVariable String applicationId, @RequestParam(required = false) Boolean withDeleted) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.getEditingApplication(appId)
applicationApiService.getEditingApplication(appId, withDeleted)
.delayUntil(__ -> applicationApiService.updateUserApplicationLastViewTime(appId))
.map(ResponseView::success));
}

@Override
public Mono<ResponseView<ApplicationView>> getPublishedApplication(@PathVariable String applicationId) {
public Mono<ResponseView<ApplicationView>> getPublishedApplication(@PathVariable String applicationId, @RequestParam(required = false) Boolean withDeleted) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_ALL)
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_ALL, withDeleted)
.delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_VIEW))
.map(ResponseView::success));
Expand All @@ -103,7 +103,7 @@ public Mono<ResponseView<ApplicationView>> getPublishedApplication(@PathVariable
@Override
public Mono<ResponseView<ApplicationView>> getPublishedMarketPlaceApplication(@PathVariable String applicationId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_MARKETPLACE)
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_MARKETPLACE, false)
.delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_VIEW))
.map(ResponseView::success));
Expand All @@ -112,15 +112,16 @@ public Mono<ResponseView<ApplicationView>> getPublishedMarketPlaceApplication(@P
@Override
public Mono<ResponseView<ApplicationView>> getAgencyProfileApplication(@PathVariable String applicationId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.AGENCY_PROFILE)
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.AGENCY_PROFILE, false)
.delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_VIEW))
.map(ResponseView::success));
}

@Override
public Mono<ResponseView<ApplicationView>> update(@PathVariable String applicationId,
@RequestBody Application newApplication) {
@RequestBody Application newApplication,
@RequestParam(required = false) Boolean updateStatus) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.update(appId, newApplication)
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_UPDATE))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public interface ApplicationEndpoints
description = "Retrieve the DSL data of a Lowcoder Application in edit-mode by its ID."
)
@GetMapping("/{applicationId}")
public Mono<ResponseView<ApplicationView>> getEditingApplication(@PathVariable String applicationId);
public Mono<ResponseView<ApplicationView>> getEditingApplication(@PathVariable String applicationId, @RequestParam(required = false) Boolean withDeleted);

@Operation(
tags = TAG_APPLICATION_MANAGEMENT,
Expand All @@ -98,7 +98,7 @@ public interface ApplicationEndpoints
description = "Retrieve the DSL data of a Lowcoder Application in view-mode by its ID."
)
@GetMapping("/{applicationId}/view")
public Mono<ResponseView<ApplicationView>> getPublishedApplication(@PathVariable String applicationId);
public Mono<ResponseView<ApplicationView>> getPublishedApplication(@PathVariable String applicationId, @RequestParam(required = false) Boolean withDeleted);

@Operation(
tags = TAG_APPLICATION_MANAGEMENT,
Expand Down Expand Up @@ -126,7 +126,8 @@ public interface ApplicationEndpoints
)
@PutMapping("/{applicationId}")
public Mono<ResponseView<ApplicationView>> update(@PathVariable String applicationId,
@RequestBody Application newApplication);
@RequestBody Application newApplication,
@RequestParam(required = false) Boolean updateStatus);

@Operation(
tags = TAG_APPLICATION_MANAGEMENT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import java.util.Map;

import org.lowcoder.domain.datasource.model.DatasourceStatus;

import lombok.Getter;
import lombok.Setter;

Expand All @@ -14,6 +16,7 @@ public class UpsertDatasourceRequest {
private String name;
private String type;
private String organizationId;
private DatasourceStatus status;

private Map<String, Object> datasourceConfig;
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public Datasource resolve(UpsertDatasourceRequest dto) {
datasource.setName(dto.getName());
datasource.setType(dto.getType());
datasource.setOrganizationId(dto.getOrganizationId());
datasource.setDatasourceStatus(dto.getStatus());
if (datasourceMetaInfoService.isJsDatasourcePlugin(datasource.getType())) {
datasource.setDetailConfig(JsonUtils.fromJson(JsonUtils.toJson(dto.getDatasourceConfig()), JsDatasourceConnectionConfig.class));
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@ public Mono<Boolean> update(String orgId, UpdateOrgRequest updateOrgRequest) {
updateOrg.setContactEmail(updateOrgRequest.getContactEmail());
updateOrg.setContactPhoneNumber(updateOrgRequest.getContactPhoneNumber());
updateOrg.setContactName(updateOrgRequest.getContactName());
updateOrg.setState(updateOrgRequest.getState());
return organizationService.update(orgId, updateOrg);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,9 +194,9 @@ public Mono<ResponseView<Organization>> updateSlug(@PathVariable String orgId, @
}

@Override
public Mono<ResponseView<Organization>> getOrganization(@PathVariable String orgId) {
public Mono<ResponseView<Organization>> getOrganization(@PathVariable String orgId, @RequestParam(required = false) Boolean withDeleted) {
return gidService.convertOrganizationIdToObjectId(orgId)
.flatMap(id -> organizationService.getById(id))
.flatMap(id -> Boolean.TRUE.equals(withDeleted) ? organizationService.getByIdWithDeleted(id) : organizationService.getById(id))
.switchIfEmpty(Mono.error(new BizException(BizError.ORGANIZATION_NOT_FOUND, "ORGANIZATION_NOT_FOUND")))
.map(ResponseView::success);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ public Mono<ResponseView<Boolean>> removeUserFromOrg(@PathVariable String orgId,
description = "Retrieve details of a specific Organization within Lowcoder using its unique ID."
)
@GetMapping("/{orgId}")
public Mono<ResponseView<Organization>> getOrganization(@PathVariable String orgId);
public Mono<ResponseView<Organization>> getOrganization(@PathVariable String orgId, @RequestParam(required = false) Boolean withDeleted);

public record UpdateOrgCommonSettingsRequest(String key, Object value) {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.lowcoder.api.usermanagement.view;

import org.lowcoder.domain.organization.model.OrganizationState;

public class UpdateOrgRequest {

private String orgName;
Expand All @@ -10,6 +12,16 @@ public class UpdateOrgRequest {

private String contactPhoneNumber;

private OrganizationState state;

public OrganizationState getState() {
return state;
}

public void setState(OrganizationState state) {
this.state = state;
}

public String getOrgName() {
return orgName;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public void testUpdateApplicationFailedDueToLackOfDatasourcePermissions() {
public void testUpdateEditingStateSuccess() {
Mono<ApplicationView> applicationViewMono = applicationApiService.create(new CreateApplicationRequest("org01", null, "app1", ApplicationType.APPLICATION.getValue(), Map.of("comp", "list"), null, null, null));
Mono<ApplicationView> updateEditStateMono = applicationViewMono.delayUntil(app -> applicationApiService.updateEditState(app.getApplicationInfoView().getApplicationId(), new ApplicationEndpoints.UpdateEditStateRequest(true)));
Mono<ApplicationView> app = updateEditStateMono.flatMap(applicationView -> applicationApiService.getEditingApplication(applicationView.getApplicationInfoView().getApplicationId()));
Mono<ApplicationView> app = updateEditStateMono.flatMap(applicationView -> applicationApiService.getEditingApplication(applicationView.getApplicationInfoView().getApplicationId(), false));
StepVerifier.create(app)
.assertNext(application -> {
Assertions.assertEquals("user01", application.getApplicationInfoView().getEditingUserId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,12 +144,12 @@ public void testPublishApplication() {
.cache();

// edit dsl before publish
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id)))
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id, false)))
.assertNext(applicationView -> Assertions.assertEquals(Map.of("comp", "list"), applicationView.getApplicationDSL()))
.verifyComplete();

// published dsl before publish
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getPublishedApplication(id, ApplicationRequestType.PUBLIC_TO_ALL)))
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getPublishedApplication(id, ApplicationRequestType.PUBLIC_TO_ALL, false)))
.assertNext(applicationView -> Assertions.assertEquals(Map.of("comp", "list"), applicationView.getApplicationDSL()))
.verifyComplete();

Expand All @@ -158,12 +158,12 @@ public void testPublishApplication() {
.delayUntil(id -> applicationApiService.publish(id, new ApplicationPublishRequest("Test Publish", "1.0.0"))).cache();

// edit dsl after publish
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id)))
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id, false)))
.assertNext(applicationView -> Assertions.assertEquals(Map.of("comp", "list"), applicationView.getApplicationDSL()))
.verifyComplete();

// published dsl after publish
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getPublishedApplication(id, ApplicationRequestType.PUBLIC_TO_ALL)))
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getPublishedApplication(id, ApplicationRequestType.PUBLIC_TO_ALL, false)))
.assertNext(applicationView -> Assertions.assertEquals(Map.of("comp", "list"), applicationView.getApplicationDSL()))
.verifyComplete();

Expand All @@ -172,12 +172,12 @@ public void testPublishApplication() {
.delayUntil(id -> applicationApiService.update(id, Application.builder().editingApplicationDSL(Map.of("comp", "table")).build())).cache();

// edit dsl after publish
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id)))
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id, false)))
.assertNext(applicationView -> Assertions.assertEquals(Map.of("comp", "table"), applicationView.getApplicationDSL()))
.verifyComplete();

// published dsl after publish
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getPublishedApplication(id, ApplicationRequestType.PUBLIC_TO_ALL)))
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getPublishedApplication(id, ApplicationRequestType.PUBLIC_TO_ALL, false)))
.assertNext(applicationView -> Assertions.assertEquals(Map.of("comp", "list"), applicationView.getApplicationDSL()))
.verifyComplete();

Expand All @@ -186,12 +186,12 @@ public void testPublishApplication() {
.delayUntil(id -> applicationApiService.publish(id, new ApplicationPublishRequest("Test Publish 2", "2.0.0"))).cache();

// edit dsl after publish
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id)))
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getEditingApplication(id, false)))
.assertNext(applicationView -> Assertions.assertEquals(Map.of("comp", "table"), applicationView.getApplicationDSL()))
.verifyComplete();

// published dsl after publish
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getPublishedApplication(id, ApplicationRequestType.PUBLIC_TO_ALL)))
StepVerifier.create(applicationIdMono.flatMap(id -> applicationApiService.getPublishedApplication(id, ApplicationRequestType.PUBLIC_TO_ALL, false)))
.assertNext(applicationView -> Assertions.assertEquals(Map.of("comp", "table"), applicationView.getApplicationDSL()))
.verifyComplete();

Expand Down
Loading