diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ce/MappedImportableResourcesCE_DTO.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ce/MappedImportableResourcesCE_DTO.java index 58363cdf2e..2424ec26dd 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ce/MappedImportableResourcesCE_DTO.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ce/MappedImportableResourcesCE_DTO.java @@ -3,6 +3,7 @@ package com.appsmith.server.dtos.ce; import com.appsmith.external.models.Datasource; import com.appsmith.external.models.DatasourceStorage; import com.appsmith.server.domains.Context; +import com.appsmith.server.domains.CustomJSLib; import com.appsmith.server.dtos.CustomJSLibContextDTO; import com.appsmith.server.dtos.ImportActionCollectionResultDTO; import com.appsmith.server.dtos.ImportActionResultDTO; @@ -50,4 +51,6 @@ public class MappedImportableResourcesCE_DTO { Map> datasourceDryRunQueries = new HashMap<>(); Map> datasourceStorageDryRunQueries = new HashMap<>(); + + Map> customJSLibsDryOps = new HashMap<>(); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/jslibs/base/CustomJSLibServiceCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/jslibs/base/CustomJSLibServiceCE.java index ea9731a860..bf588a0fbf 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/jslibs/base/CustomJSLibServiceCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/jslibs/base/CustomJSLibServiceCE.java @@ -9,6 +9,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.List; +import java.util.Map; import java.util.Set; public interface CustomJSLibServiceCE extends CrudService { @@ -32,6 +33,12 @@ public interface CustomJSLibServiceCE extends CrudService { Mono persistCustomJSLibMetaDataIfDoesNotExistAndGetDTO( CustomJSLib jsLib, Boolean isForceInstall); + Mono persistCustomJSLibMetaDataIfDoesNotExistAndGetDTO( + CustomJSLib jsLib, + Boolean isForceInstall, + Map> customJSLibsDryOps, + boolean isDryOps); + Flux getAllVisibleJSLibsInContext( @NotNull String contextId, CreatorContextType contextType, String branchName, Boolean isViewMode); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/jslibs/base/CustomJSLibServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/jslibs/base/CustomJSLibServiceCEImpl.java index 90e276c5db..7abf231ae9 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/jslibs/base/CustomJSLibServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/jslibs/base/CustomJSLibServiceCEImpl.java @@ -4,6 +4,7 @@ import com.appsmith.external.models.CreatorContextType; import com.appsmith.server.domains.Application; import com.appsmith.server.domains.CustomJSLib; import com.appsmith.server.dtos.CustomJSLibContextDTO; +import com.appsmith.server.dtos.DBOpsType; import com.appsmith.server.jslibs.context.ContextBasedJsLibService; import com.appsmith.server.repositories.CustomJSLibRepository; import com.appsmith.server.services.AnalyticsService; @@ -14,8 +15,10 @@ import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -73,11 +76,27 @@ public class CustomJSLibServiceCEImpl extends BaseService persistCustomJSLibMetaDataIfDoesNotExistAndGetDTO( CustomJSLib jsLib, Boolean isForceInstall) { + return persistCustomJSLibMetaDataIfDoesNotExistAndGetDTO(jsLib, isForceInstall, null, false); + } + + @Override + public Mono persistCustomJSLibMetaDataIfDoesNotExistAndGetDTO( + CustomJSLib jsLib, + Boolean isForceInstall, + Map> customJSLibsDryOps, + boolean isDryOps) { return repository .findUniqueCustomJsLib(jsLib) // Read more why Mono.defer is used here. // https://stackoverflow.com/questions/54373920/mono-switchifempty-is-always-called - .switchIfEmpty(Mono.defer(() -> repository.save(jsLib))) + .switchIfEmpty(Mono.defer(() -> { + if (isDryOps) { + jsLib.updateForBulkWriteOperation(); + addDryOpsForEntity(DBOpsType.SAVE.name(), customJSLibsDryOps, jsLib); + return Mono.just(jsLib); + } + return repository.save(jsLib); + })) .flatMap(foundJSLib -> { /* The first check is to make sure that we are able to detect any previously truncated data and overwrite it the next time we receive valid data. @@ -86,6 +105,10 @@ public class CustomJSLibServiceCEImpl extends BaseService foundJSLib.getDefs().length()) || isForceInstall) { jsLib.setId(foundJSLib.getId()); + if (isDryOps) { + addDryOpsForEntity(DBOpsType.SAVE.name(), customJSLibsDryOps, jsLib); + return Mono.just(jsLib); + } return repository.save(jsLib); } @@ -141,4 +164,15 @@ public class CustomJSLibServiceCEImpl extends BaseService> dryRunOpsMap, CustomJSLib createdCustomJsLib) { + if (dryRunOpsMap.containsKey(queryType)) { + dryRunOpsMap.get(queryType).add(createdCustomJsLib); + } else { + List customJsLibList = new ArrayList<>(); + customJsLibList.add(createdCustomJsLib); + dryRunOpsMap.put(queryType, customJsLibList); + } + } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/DryOperationRepository.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/DryOperationRepository.java index d957efc073..071ee83fbf 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/DryOperationRepository.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/DryOperationRepository.java @@ -2,6 +2,7 @@ package com.appsmith.server.repositories; import com.appsmith.external.models.Datasource; import com.appsmith.external.models.DatasourceStorage; +import com.appsmith.server.domains.CustomJSLib; import com.appsmith.server.dtos.MappedImportableResourcesDTO; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; @@ -22,6 +23,8 @@ public class DryOperationRepository { private final DatasourceStorageRepository datasourceStorageRepository; + private final CustomJSLibRepository customJSLibRepository; + private Map, AppsmithRepository> repoByEntityClass; @PostConstruct @@ -29,6 +32,7 @@ public class DryOperationRepository { final Map, AppsmithRepository> map = new HashMap<>(); map.put(Datasource.class, datasourceRepository); map.put(DatasourceStorage.class, datasourceStorageRepository); + map.put(CustomJSLib.class, customJSLibRepository); repoByEntityClass = Collections.unmodifiableMap(map); } @@ -44,6 +48,10 @@ public class DryOperationRepository { return datasourceStorageRepository.saveAll(datasourceStorage); } + private Flux saveCustomJSLibToDb(List customJSLibs) { + return customJSLibRepository.saveAll(customJSLibs); + } + public Mono executeAllDbOps(MappedImportableResourcesDTO mappedImportableResourcesDTO) { Flux> datasourceFLux = Flux.fromIterable(mappedImportableResourcesDTO @@ -65,6 +73,16 @@ public class DryOperationRepository { .get(key); return saveDatasourceStorageToDb(datasourceStorageList).collectList(); }); - return Flux.merge(datasourceFLux, datasourceStorageFLux).then(); + + Flux> customJSLibFLux = Flux.fromIterable( + mappedImportableResourcesDTO.getCustomJSLibsDryOps().keySet()) + .flatMap(key -> { + List customJSLibList = + mappedImportableResourcesDTO.getCustomJSLibsDryOps().get(key); + return saveCustomJSLibToDb(customJSLibList).collectList(); + }); + + return Flux.merge(datasourceFLux, datasourceStorageFLux, customJSLibFLux) + .then(); } }