diff --git a/app/server/appsmith-plugins/pom.xml b/app/server/appsmith-plugins/pom.xml
index f3eb61fa24..f5052f7cf2 100644
--- a/app/server/appsmith-plugins/pom.xml
+++ b/app/server/appsmith-plugins/pom.xml
@@ -64,7 +64,6 @@
postgresPlugin
restApiPlugin
mongoPlugin
- rapidApiPlugin
mysqlPlugin
elasticSearchPlugin
dynamoPlugin
diff --git a/app/server/appsmith-plugins/rapidApiPlugin/plugin.properties b/app/server/appsmith-plugins/rapidApiPlugin/plugin.properties
deleted file mode 100644
index 7efa5580b3..0000000000
--- a/app/server/appsmith-plugins/rapidApiPlugin/plugin.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-plugin.id=rapidapi-plugin
-plugin.class=com.external.plugins.RapidApiPlugin
-plugin.version=1.0-SNAPSHOT
-plugin.provider=tech@appsmith.com
-plugin.dependencies=
diff --git a/app/server/appsmith-plugins/rapidApiPlugin/pom.xml b/app/server/appsmith-plugins/rapidApiPlugin/pom.xml
deleted file mode 100644
index 8876160969..0000000000
--- a/app/server/appsmith-plugins/rapidApiPlugin/pom.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
- 4.0.0
-
-
- com.appsmith
- appsmith-plugins
- 1.0-SNAPSHOT
-
-
- com.external.plugins
- rapidApiPlugin
- 1.0-SNAPSHOT
-
- rapidApiPlugin
-
-
- UTF-8
- 11
- ${java.version}
- ${java.version}
- rapidapi-plugin
- com.external.plugins.RapidApiPlugin
- 1.0-SNAPSHOT
- tech@appsmith.com
-
-
-
-
-
- org.springframework
- spring-web
- 5.3.20
- provided
-
-
- org.springframework
- spring-webflux
- 5.3.20
-
-
- io.projectreactor
- reactor-core
-
-
- org.springframework
- spring-core
-
-
- org.springframework
- spring-web
-
-
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- 3.1.2
-
-
-
- ${plugin.id}
- ${plugin.class}
- ${plugin.version}
- ${plugin.provider}
- ${plugin.dependencies}
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- ${java.version}
- ${java.version}
-
-
-
-
-
-
diff --git a/app/server/appsmith-plugins/rapidApiPlugin/src/main/java/com/external/plugins/RapidApiPlugin.java b/app/server/appsmith-plugins/rapidApiPlugin/src/main/java/com/external/plugins/RapidApiPlugin.java
deleted file mode 100644
index af270351f1..0000000000
--- a/app/server/appsmith-plugins/rapidApiPlugin/src/main/java/com/external/plugins/RapidApiPlugin.java
+++ /dev/null
@@ -1,327 +0,0 @@
-package com.external.plugins;
-
-import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginError;
-import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginException;
-import com.appsmith.external.models.ActionConfiguration;
-import com.appsmith.external.models.ActionExecutionResult;
-import com.appsmith.external.models.DatasourceConfiguration;
-import com.appsmith.external.models.DatasourceTestResult;
-import com.appsmith.external.models.Property;
-import com.appsmith.external.plugins.BasePlugin;
-import com.appsmith.external.plugins.PluginExecutor;
-import com.appsmith.util.WebClientUtils;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import lombok.extern.slf4j.Slf4j;
-import org.bson.internal.Base64;
-import org.json.JSONObject;
-import org.pf4j.Extension;
-import org.pf4j.PluginWrapper;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.util.StringUtils;
-import org.springframework.web.reactive.function.BodyInserters;
-import org.springframework.web.reactive.function.client.ClientResponse;
-import org.springframework.web.reactive.function.client.WebClient;
-import org.springframework.web.util.UriComponentsBuilder;
-import reactor.core.Exceptions;
-import reactor.core.publisher.Mono;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-@Slf4j
-public class RapidApiPlugin extends BasePlugin {
- private static final int MAX_REDIRECTS = 5;
-
- private static final String JSON_TYPE = "apipayload";
-
- public RapidApiPlugin(PluginWrapper wrapper) {
- super(wrapper);
- }
-
- @Extension
- public static class RapidApiPluginExecutor implements PluginExecutor {
-
- private static final String RAPID_API_KEY_NAME = "X-RapidAPI-Key";
- private static final String RAPID_API_KEY_VALUE = System.getenv("APPSMITH_RAPID_API_KEY_VALUE");
-
- @Override
- public Mono execute(Void ignored,
- DatasourceConfiguration datasourceConfiguration,
- ActionConfiguration actionConfiguration) {
-
- if (StringUtils.isEmpty(RAPID_API_KEY_VALUE)) {
- return Mono.error(new AppsmithPluginException(AppsmithPluginError.PLUGIN_EXECUTE_ARGUMENT_ERROR, "RapidAPI Key value " +
- "not set."));
- }
-
- String requestBody = (actionConfiguration.getBody() == null) ? "" : actionConfiguration.getBody();
- String path = (actionConfiguration.getPath() == null) ? "" : actionConfiguration.getPath();
- String url = datasourceConfiguration.getUrl() + path;
-
- HttpMethod httpMethod = actionConfiguration.getHttpMethod();
- if (httpMethod == null) {
- return Mono.error(new AppsmithPluginException(AppsmithPluginError.PLUGIN_EXECUTE_ARGUMENT_ERROR, "HTTPMethod must be " +
- "set."));
- }
-
- WebClient.Builder webClientBuilder = WebClientUtils.builder();
-
- if (datasourceConfiguration.getHeaders() != null) {
- addHeadersToRequest(webClientBuilder, datasourceConfiguration.getHeaders());
- }
-
- if (actionConfiguration.getHeaders() != null) {
- addHeadersToRequest(webClientBuilder, actionConfiguration.getHeaders());
- }
-
- // Add the rapid api headers
- webClientBuilder.defaultHeader(RAPID_API_KEY_NAME, RAPID_API_KEY_VALUE);
-
- //If route parameters exist, update the URL by replacing the key surrounded by '{' and '}'
- if (actionConfiguration.getRouteParameters() != null && !actionConfiguration.getRouteParameters().isEmpty()) {
- for (Property property : actionConfiguration.getRouteParameters()) {
- // If either the key or the value is empty, skip
- if (property.getKey() != null && !property.getKey().isEmpty() &&
- property.getValue() != null && !((String) property.getValue()).isEmpty()) {
-
- Pattern pattern = Pattern.compile("\\{" + property.getKey() + "\\}");
- Matcher matcher = pattern.matcher(url);
- url = matcher.replaceAll(URLEncoder.encode((String) property.getValue()));
- }
- }
- }
-
- URI uri;
- try {
- String httpUrl = addHttpToUrlWhenPrefixNotPresent(url);
- uri = createFinalUriWithQueryParams(httpUrl, actionConfiguration.getQueryParameters());
- log.info("Final URL is : {}", uri);
- } catch (URISyntaxException e) {
- return Mono.error(new AppsmithPluginException(AppsmithPluginError.PLUGIN_EXECUTE_ARGUMENT_ERROR, e));
- }
-
- // Build the body of the request in case of bodyFormData is not null
- if (actionConfiguration.getBodyFormData() != null) {
- // First set the header to specify the content type
- webClientBuilder.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON.toString());
-
- Map keyValueMap = new HashMap<>();
-
- List bodyFormData = actionConfiguration.getBodyFormData();
- String jsonString = null;
- JSONObject bodyJson;
- for (Property property : bodyFormData) {
-
- if (property.getValue() != null) {
- if (!property.getType().equals(JSON_TYPE)) {
- keyValueMap.put(property.getKey(), (String) property.getValue());
- } else {
- // This is actually supposed to be the body and should not be in key-value format. No need to
- // convert the same.
- jsonString = (String) property.getValue();
- break;
- }
- }
- }
-
- if (jsonString == null) {
- bodyJson = new JSONObject(keyValueMap);
- } else {
- bodyJson = new JSONObject(jsonString);
- }
- jsonString = bodyJson.toString();
-
- // Now reset the request body
- requestBody = jsonString;
-
- }
-
- WebClient client = webClientBuilder.build();
- return httpCall(client, httpMethod, uri, requestBody, 0)
- .flatMap(clientResponse -> clientResponse.toEntity(byte[].class))
- .map(stringResponseEntity -> {
- HttpHeaders headers = stringResponseEntity.getHeaders();
- // Find the media type of the response to parse the body as required.
- MediaType contentType = headers.getContentType();
- byte[] body = stringResponseEntity.getBody();
- HttpStatus statusCode = stringResponseEntity.getStatusCode();
-
- ActionExecutionResult result = new ActionExecutionResult();
- result.setStatusCode(statusCode.toString());
- // If the HTTP response is 200, only then cache the response.
- // We shouldn't cache the response even for other 2xx statuses like 201, 204 etc.
- if (statusCode.equals(HttpStatus.OK)) {
- result.setIsExecutionSuccess(true);
- }
-
- if (headers != null) {
- // Convert the headers into json tree to store in the results
- String headerInJsonString;
- try {
- headerInJsonString = objectMapper.writeValueAsString(headers);
- } catch (JsonProcessingException e) {
- e.printStackTrace();
- throw Exceptions.propagate(new AppsmithPluginException(AppsmithPluginError.PLUGIN_ERROR, e));
- }
- try {
- // Set headers in the result now
- result.setHeaders(objectMapper.readTree(headerInJsonString));
- } catch (IOException e) {
- e.printStackTrace();
- throw Exceptions.propagate(new AppsmithPluginException(AppsmithPluginError.PLUGIN_ERROR, e));
- }
- }
-
- if (body != null) {
- /**TODO
- * Handle XML response. Currently we only handle JSON & Image responses. The other kind of responses
- * are kept as is and returned as a string.
- */
- if (MediaType.APPLICATION_JSON.equals(contentType) ||
- MediaType.APPLICATION_JSON_UTF8.equals(contentType) ||
- MediaType.APPLICATION_JSON_UTF8_VALUE.equals(contentType)) {
- String jsonBody = new String(body);
- try {
- result.setBody(objectMapper.readTree(jsonBody));
- } catch (IOException e) {
- e.printStackTrace();
- throw Exceptions.propagate(new AppsmithPluginException(AppsmithPluginError.PLUGIN_JSON_PARSE_ERROR, jsonBody, e));
- }
- } else if (MediaType.IMAGE_GIF.equals(contentType) ||
- MediaType.IMAGE_JPEG.equals(contentType) ||
- MediaType.IMAGE_PNG.equals(contentType)) {
- String encode = Base64.encode(body);
- result.setBody(encode);
- } else {
- // If the body is not of JSON type, just set it as is.
- String bodyString = new String(body);
- result.setBody(bodyString.trim());
- }
- }
-
- return result;
- })
- .onErrorMap(throwable -> {
- final Throwable actualException = Exceptions.unwrap(throwable);
- if (actualException instanceof AppsmithPluginException) {
- return actualException;
- } else {
- return new AppsmithPluginException(AppsmithPluginError.PLUGIN_ERROR, actualException);
- }
- });
- }
-
- private Mono httpCall(WebClient webClient, HttpMethod httpMethod, URI uri, String requestBody, int iteration) {
- if (iteration == MAX_REDIRECTS) {
- log.debug("Exceeded the http redirect limits. Returning error");
- return Mono.error(new AppsmithPluginException(AppsmithPluginError.PLUGIN_ERROR, "Exceeded the HTTO redirect limits of " + MAX_REDIRECTS));
- }
- return webClient
- .method(httpMethod)
- .uri(uri)
- .body(BodyInserters.fromObject(requestBody))
- .exchange()
- .doOnError(e -> Mono.error(new AppsmithPluginException(AppsmithPluginError.PLUGIN_ERROR, e)))
- .flatMap(res -> {
- ClientResponse response = (ClientResponse) res;
- if (response.statusCode().is3xxRedirection()) {
- String redirectUrl = response.headers().header("Location").get(0);
- /**
- * TODO
- * In case the redirected URL is not absolute (complete), create the new URL using the relative path
- * This particular scenario is seen in the URL : https://rickandmortyapi.com/api/character
- * It redirects to partial URI : /api/character/
- * In this scenario we should convert the partial URI to complete URI
- */
- URI redirectUri = null;
- try {
- redirectUri = new URI(redirectUrl);
- } catch (URISyntaxException e) {
- e.printStackTrace();
- }
- return httpCall(webClient, httpMethod, redirectUri, requestBody, iteration + 1);
- }
- return Mono.just(response);
- });
- }
-
- @Override
- public Mono datasourceCreate(DatasourceConfiguration datasourceConfiguration) {
- return Mono.empty();
- }
-
- @Override
- public void datasourceDestroy(Void connection) {
-
- }
-
- @Override
- public Set validateDatasource(DatasourceConfiguration datasourceConfiguration) {
- // Since the datasource is created by rapid api & not by the user and it can't be edited.
- // Assume that everything is good. Return as valid.
- return Collections.emptySet();
- }
-
- @Override
- public Mono testDatasource(DatasourceConfiguration datasourceConfiguration) {
- return StringUtils.isEmpty(RAPID_API_KEY_VALUE)
- ? Mono.error(new AppsmithPluginException(AppsmithPluginError.PLUGIN_DATASOURCE_ARGUMENT_ERROR, "RapidAPI Key value " +
- "not set."))
- : Mono.just(new DatasourceTestResult());
- }
-
- private void addHeadersToRequest(WebClient.Builder webClientBuilder, List headers) {
- for (Property header : headers) {
- if (header.getKey() != null && !header.getKey().isEmpty()) {
- webClientBuilder.defaultHeader(header.getKey(), (String) header.getValue());
- }
- }
- }
-
- private String addHttpToUrlWhenPrefixNotPresent(String url) {
- if (url == null || url.toLowerCase().startsWith("http") || url.contains("://")) {
- return url;
- }
- return "http://" + url;
- }
-
- private URI createFinalUriWithQueryParams(String url, List queryParams) throws URISyntaxException {
- UriComponentsBuilder uriBuilder = UriComponentsBuilder.newInstance();
- uriBuilder.uri(new URI(url));
-
- if (queryParams != null) {
- for (Property queryParam : queryParams) {
- // If either the key or the value is empty, skip
- if (queryParam.getKey() != null && !queryParam.getKey().isEmpty() &&
- queryParam.getValue() != null && !((String) queryParam.getValue()).isEmpty()) {
- uriBuilder.queryParam(queryParam.getKey(), URLEncoder.encode((String) queryParam.getValue(),
- StandardCharsets.UTF_8));
- }
- }
- }
- return uriBuilder.build(true).toUri();
- }
-
- /**
- * TODO :
- * Add a function which is called during import of a template to an action. As part of that do the following :
- * 1. Get the provider and the template
- * 2. Check if the provider is subscribed to, and if not, subscribe.
- * 3. Set Property field isRedacted for fields like host, etc. These fields in turn would not be displayed to
- * the user during GET Actions.
- */
- }
-}
diff --git a/app/server/appsmith-plugins/rapidApiPlugin/src/main/resources/form.json b/app/server/appsmith-plugins/rapidApiPlugin/src/main/resources/form.json
deleted file mode 100644
index 4602da5aec..0000000000
--- a/app/server/appsmith-plugins/rapidApiPlugin/src/main/resources/form.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "form": [
- {
- "sectionName": "General",
- "id": 1,
- "children": [
- {
- "label": "Rapid Api Connection Name",
- "configProperty": "connectionName",
- "controlType": "INPUT_TEXT"
- }
- ]
- }
- ]
-}
diff --git a/app/server/appsmith-plugins/rapidApiPlugin/src/test/java/com/external/plugins/RapidApiPluginTest.java b/app/server/appsmith-plugins/rapidApiPlugin/src/test/java/com/external/plugins/RapidApiPluginTest.java
deleted file mode 100644
index 6436bda5ab..0000000000
--- a/app/server/appsmith-plugins/rapidApiPlugin/src/test/java/com/external/plugins/RapidApiPluginTest.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.external.plugins;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertTrue;
-
-/**
- * Unit test for simple App.
- */
-public class RapidApiPluginTest {
- /**
- * Rigorous Test :-)
- */
- @Test
- public void shouldAnswerWithTrue() {
- assertTrue(true);
- }
-}
diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog.java
index 9689089045..e2192506c7 100644
--- a/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog.java
+++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog.java
@@ -4822,7 +4822,7 @@ public class DatabaseChangelog {
* @param action
* @return true / false
*/
- private boolean hasUnpublishedActionConfiguration(NewAction action) {
+ public boolean hasUnpublishedActionConfiguration(NewAction action) {
ActionDTO unpublishedAction = action.getUnpublishedAction();
if (unpublishedAction == null || unpublishedAction.getActionConfiguration() == null) {
return false;
@@ -4837,7 +4837,7 @@ public class DatabaseChangelog {
* @param mongockTemplate
* @return action
*/
- private NewAction fetchActionUsingId(String actionId, MongockTemplate mongockTemplate) {
+ public static NewAction fetchActionUsingId(String actionId, MongockTemplate mongockTemplate) {
final NewAction action =
mongockTemplate.findOne(query(where(fieldName(QNewAction.newAction.id)).is(actionId)), NewAction.class);
return action;
@@ -4848,7 +4848,7 @@ public class DatabaseChangelog {
* @param plugin
* @return query
*/
- private Query getQueryToFetchAllPluginActionsWhichAreNotDeleted(Plugin plugin) {
+ public static Query getQueryToFetchAllPluginActionsWhichAreNotDeleted(Plugin plugin) {
Criteria pluginIdMatchesSuppliedPluginId = where("pluginId").is(plugin.getId());
Criteria isNotDeleted = where("deleted").ne(true);
return query((new Criteria()).andOperator(pluginIdMatchesSuppliedPluginId, isNotDeleted));
diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog2.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog2.java
index 30b66fbe43..08090281d7 100644
--- a/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog2.java
+++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/migrations/DatabaseChangelog2.java
@@ -62,6 +62,7 @@ import com.github.cloudyrock.mongock.ChangeLog;
import com.github.cloudyrock.mongock.ChangeSet;
import com.github.cloudyrock.mongock.driver.mongodb.springdata.v3.decorator.impl.MongockTemplate;
import com.google.gson.Gson;
+import com.querydsl.core.types.Path;
import io.changock.migration.api.annotations.NonLockGuarded;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
@@ -2593,4 +2594,109 @@ public class DatabaseChangelog2 {
.findOne(query(where("packageName").is("graphql-plugin")), Plugin.class);
installPluginToAllWorkspaces(mongoTemplate, graphQLPlugin.getId());
}
+
+ public void softDeletePlugin(MongockTemplate mongockTemplate, Plugin plugin) {
+ softDeleteAllPluginActions(plugin, mongockTemplate);
+ softDeleteAllPluginDatasources(plugin, mongockTemplate);
+ softDeletePluginFromAllWorkspaces(plugin, mongockTemplate);
+ softDeleteInPluginCollection(plugin, mongockTemplate);
+ }
+
+ @ChangeSet(order = "038", id = "delete-rapid-api-plugin-related-items", author = "")
+ public void deleteRapidApiPluginRelatedItems(MongockTemplate mongockTemplate) {
+ Plugin rapidApiPlugin = mongockTemplate.findOne(query(where("packageName").is("rapidapi-plugin")),
+ Plugin.class);
+
+ if (rapidApiPlugin == null) {
+ return;
+ }
+
+ softDeletePlugin(mongockTemplate, rapidApiPlugin);
+ }
+
+ private void softDeletePluginFromAllWorkspaces(Plugin plugin, MongockTemplate mongockTemplate) {
+ Query queryToGetNonDeletedWorkspaces = new Query();
+ queryToGetNonDeletedWorkspaces.fields().include(fieldName(QWorkspace.workspace.id));
+ List workspaces = mongockTemplate.find(queryToGetNonDeletedWorkspaces, Workspace.class);
+ workspaces.stream()
+ .map(Workspace::getId)
+ .map(id -> fetchDomainObjectUsingId(id, mongockTemplate, QWorkspace.workspace.id, Workspace.class))
+ .forEachOrdered(workspace -> {
+ workspace.getPlugins().stream()
+ .filter(workspacePlugin -> workspacePlugin != null && workspacePlugin.getPluginId() != null)
+ .filter(workspacePlugin -> workspacePlugin.getPluginId().equals(plugin.getId()))
+ .forEach(workspacePlugin -> {
+ workspacePlugin.setDeleted(true);
+ workspacePlugin.setDeletedAt(Instant.now());
+ });
+ mongockTemplate.save(workspace);
+ });
+ }
+
+ private void softDeleteInPluginCollection(Plugin plugin, MongockTemplate mongockTemplate) {
+ plugin.setDeleted(true);
+ plugin.setDeletedAt(Instant.now());
+ mongockTemplate.save(plugin);
+ }
+
+ private void softDeleteAllPluginDatasources(Plugin plugin, MongockTemplate mongockTemplate) {
+ /* Query to get all plugin datasources which are not deleted */
+ Query queryToGetDatasources = getQueryToFetchAllDomainObjectsWhichAreNotDeletedUsingPluginId(plugin);
+
+ /* Update the previous query to only include id field */
+ queryToGetDatasources.fields().include(fieldName(QDatasource.datasource.id));
+
+ /* Fetch plugin datasources using the previous query */
+ List datasources = mongockTemplate.find(queryToGetDatasources, Datasource.class);
+
+ /* Mark each selected datasource as deleted */
+ updateDeleteAndDeletedAtFieldsForEachDomainObject(datasources, mongockTemplate,
+ QDatasource.datasource.id, Datasource.class);
+ }
+
+ private void softDeleteAllPluginActions(Plugin plugin, MongockTemplate mongockTemplate) {
+ /* Query to get all plugin actions which are not deleted */
+ Query queryToGetActions = getQueryToFetchAllDomainObjectsWhichAreNotDeletedUsingPluginId(plugin);
+
+ /* Update the previous query to only include id field */
+ queryToGetActions.fields().include(fieldName(QNewAction.newAction.id));
+
+ /* Fetch plugin actions using the previous query */
+ List actions = mongockTemplate.find(queryToGetActions, NewAction.class);
+
+ /* Mark each selected action as deleted */
+ updateDeleteAndDeletedAtFieldsForEachDomainObject(actions, mongockTemplate, QNewAction.newAction.id,
+ NewAction.class);
+ }
+
+ private Query getQueryToFetchAllDomainObjectsWhichAreNotDeletedUsingPluginId(Plugin plugin) {
+ Criteria pluginIdMatchesSuppliedPluginId = where("pluginId").is(plugin.getId());
+ Criteria isNotDeleted = where("deleted").ne(true);
+ return query((new Criteria()).andOperator(pluginIdMatchesSuppliedPluginId, isNotDeleted));
+ }
+
+ private void updateDeleteAndDeletedAtFieldsForEachDomainObject(List extends BaseDomain> domainObjects,
+ MongockTemplate mongockTemplate, Path path,
+ Class type) {
+ domainObjects.stream()
+ .map(BaseDomain::getId) // iterate over id one by one
+ .map(id -> fetchDomainObjectUsingId(id, mongockTemplate, path, type)) // find object using id
+ .forEachOrdered(domainObject -> {
+ domainObject.setDeleted(true);
+ domainObject.setDeletedAt(Instant.now());
+ mongockTemplate.save(domainObject);
+ });
+ }
+
+ /**
+ * Here 'id' refers to the ObjectId which is used to uniquely identify each Mongo document. 'path' refers to the
+ * path in the Query DSL object that indicates which field in a document should be matched against the `id`.
+ * `type` is a POJO class type that indicates which collection we are interested in. eg. path=QNewAction
+ * .newAction.id, type=NewAction.class
+ */
+ private T fetchDomainObjectUsingId(String id, MongockTemplate mongockTemplate, Path path,
+ Class type) {
+ final T domainObject = mongockTemplate.findOne(query(where(fieldName(path)).is(id)), type);
+ return domainObject;
+ }
}
\ No newline at end of file
diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/PluginServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/PluginServiceCEImpl.java
index 13f42e287e..bd9609d792 100644
--- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/PluginServiceCEImpl.java
+++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/PluginServiceCEImpl.java
@@ -133,6 +133,7 @@ public class PluginServiceCEImpl extends BaseService pluginIds = org.getPlugins()
.stream()
+ .filter(plugin -> plugin.getDeleted() == false)
.map(WorkspacePlugin::getPluginId)
.collect(Collectors.toList());
Query query = new Query();
diff --git a/app/server/appsmith-server/src/main/resources/application.properties b/app/server/appsmith-server/src/main/resources/application.properties
index b953214d49..f47a56adb5 100644
--- a/app/server/appsmith-server/src/main/resources/application.properties
+++ b/app/server/appsmith-server/src/main/resources/application.properties
@@ -51,10 +51,6 @@ sentry.send-default-pii=true
sentry.debug=off
sentry.environment=${APPSMITH_SENTRY_ENVIRONMENT:}
-# RapidAPI
-rapidapi.key.name = X-RapidAPI-Key
-rapidapi.key.value = ${APPSMITH_RAPID_API_KEY_VALUE:}
-
# Redis Properties
spring.redis.url=${APPSMITH_REDIS_URL}