Skip to content
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 @@ -26,6 +26,8 @@
import com.external.plugins.services.AiFeatureServiceFactory;
import com.external.plugins.services.AiServerService;
import com.external.plugins.services.AiServerServiceImpl;
import com.external.plugins.services.TriggerService;
import com.external.plugins.services.TriggerServiceImpl;
import com.external.plugins.utils.RequestUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
Expand All @@ -34,16 +36,10 @@
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static com.appsmith.external.constants.CommonFieldName.VALUE;
import static com.external.plugins.constants.AppsmithAiConstants.DISABLED;
import static com.external.plugins.constants.AppsmithAiConstants.LABEL;
import static com.external.plugins.constants.AppsmithAiConstants.LIST_FILES;
import static com.external.plugins.constants.AppsmithAiConstants.UPLOAD_FILES;
import static com.external.plugins.constants.AppsmithAiConstants.USECASE;
import static com.external.plugins.utils.FileUtils.getFileIds;
import static com.external.plugins.utils.FileUtils.hasFiles;
Expand All @@ -57,6 +53,8 @@ public AppsmithAiPlugin(PluginWrapper wrapper) {

public static class AppsmithAiPluginExecutor extends BaseRestApiPluginExecutor {
private static final AiServerService aiServerService = new AiServerServiceImpl();

private static final TriggerService triggerService = new TriggerServiceImpl(aiServerService, objectMapper);
private static final Gson gson = new GsonBuilder().create();

public AppsmithAiPluginExecutor(SharedConfig config) {
Expand All @@ -80,54 +78,7 @@ public Mono<APIConnection> datasourceCreate(DatasourceConfiguration datasourceCo
public Mono<TriggerResultDTO> trigger(
APIConnection connection, DatasourceConfiguration datasourceConfiguration, TriggerRequestDTO request) {
log.debug(Thread.currentThread().getName() + ": trigger() called for AppsmithAI plugin.");
SourceDetails sourceDetails = SourceDetails.createSourceDetails(request);
String requestType = request.getRequestType();
if (UPLOAD_FILES.equals(requestType)) {
return aiServerService
.uploadFiles(request.getFiles(), sourceDetails)
.flatMap(response -> {
TriggerResultDTO triggerResultDTO = new TriggerResultDTO();
triggerResultDTO.setTrigger(response);
return Mono.just(triggerResultDTO);
})
.onErrorResume(
error -> handleError("An error has occurred while trying to upload files", error));
} else if (LIST_FILES.equals(requestType)) {
List<String> fileIds = getFileIds(datasourceConfiguration);
if (fileIds.isEmpty()) {
TriggerResultDTO triggerResultDTO = new TriggerResultDTO();
triggerResultDTO.setTrigger(List.of(Map.of(
DISABLED,
true,
LABEL,
"No files available in the datasource",
VALUE,
"NO_FILES_AVAILABLE")));
return Mono.just(triggerResultDTO);
}
return aiServerService
.getFilesStatus(fileIds, sourceDetails)
.flatMap(fileStatusDTO -> {
List<Map<String, Object>> response = new ArrayList<>();
fileStatusDTO.getFiles().forEach(file -> {
Map<String, Object> dropdownOption = new HashMap<>();
if (!file.isProcessed()) {
dropdownOption.put(LABEL, "(Processing...) " + file.getName());
} else {
dropdownOption.put(LABEL, file.getName());
}
dropdownOption.put(VALUE, file.getId());
dropdownOption.put(DISABLED, !file.isProcessed());
response.add(dropdownOption);
});
TriggerResultDTO triggerResultDTO = new TriggerResultDTO();
triggerResultDTO.setTrigger(response);
return Mono.just(triggerResultDTO);
})
.onErrorResume(error ->
handleError("An error has occurred while trying to list uploaded files", error));
}
return super.trigger(connection, datasourceConfiguration, request);
return triggerService.executeTrigger(connection, datasourceConfiguration, request);
}

private Mono<TriggerResultDTO> handleError(String message, Throwable error) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.external.plugins.services;

import com.appsmith.external.helpers.restApiUtils.connections.APIConnection;
import com.appsmith.external.models.DatasourceConfiguration;
import com.appsmith.external.models.TriggerRequestDTO;
import com.appsmith.external.models.TriggerResultDTO;
import reactor.core.publisher.Mono;

public interface TriggerService {
Mono<TriggerResultDTO> executeTrigger(
APIConnection connection, DatasourceConfiguration datasourceConfiguration, TriggerRequestDTO request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package com.external.plugins.services;

import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginError;
import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginException;
import com.appsmith.external.helpers.restApiUtils.connections.APIConnection;
import com.appsmith.external.models.DatasourceConfiguration;
import com.appsmith.external.models.TriggerRequestDTO;
import com.appsmith.external.models.TriggerResultDTO;
import com.external.plugins.dtos.SourceDetails;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.appsmith.external.constants.CommonFieldName.VALUE;
import static com.external.plugins.constants.AppsmithAiConstants.DISABLED;
import static com.external.plugins.constants.AppsmithAiConstants.LABEL;
import static com.external.plugins.constants.AppsmithAiConstants.LIST_FILES;
import static com.external.plugins.constants.AppsmithAiConstants.UPLOAD_FILES;
import static com.external.plugins.utils.FileUtils.getFileIds;

@Slf4j
public class TriggerServiceCEImpl implements TriggerService {

private final AiServerService aiServerService;
private final ObjectMapper objectMapper;

public TriggerServiceCEImpl(AiServerService aiServerService, ObjectMapper objectMapper) {
this.aiServerService = aiServerService;
this.objectMapper = objectMapper;
}

@Override
public Mono<TriggerResultDTO> executeTrigger(
APIConnection connection, DatasourceConfiguration datasourceConfiguration, TriggerRequestDTO request) {
String requestType = request.getRequestType();
return switch (requestType) {
case UPLOAD_FILES -> this.uploadFiles(request);
case LIST_FILES -> this.listFiles(datasourceConfiguration, request);
default -> Mono.empty();
};
}
Comment on lines +37 to +46
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Handle unknown request types in the switch statement.
Returning Mono.empty() for unrecognized request types might silently mask errors. Consider either returning a descriptive error or logging an alert to help surface unexpected request types.

default -> {
-    return Mono.empty();
+    return Mono.error(new AppsmithPluginException(
+        AppsmithPluginError.PLUGIN_ERROR,
+        "Unknown request type: " + requestType
+    ));
}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@Override
public Mono<TriggerResultDTO> executeTrigger(
APIConnection connection, DatasourceConfiguration datasourceConfiguration, TriggerRequestDTO request) {
String requestType = request.getRequestType();
return switch (requestType) {
case UPLOAD_FILES -> this.uploadFiles(request);
case LIST_FILES -> this.listFiles(datasourceConfiguration, request);
default -> Mono.empty();
};
}
@Override
public Mono<TriggerResultDTO> executeTrigger(
APIConnection connection, DatasourceConfiguration datasourceConfiguration, TriggerRequestDTO request) {
String requestType = request.getRequestType();
return switch (requestType) {
case UPLOAD_FILES -> this.uploadFiles(request);
case LIST_FILES -> this.listFiles(datasourceConfiguration, request);
default -> Mono.error(new AppsmithPluginException(
AppsmithPluginError.PLUGIN_ERROR,
"Unknown request type: " + requestType
));
};
}


private Mono<TriggerResultDTO> uploadFiles(TriggerRequestDTO request) {
SourceDetails sourceDetails = SourceDetails.createSourceDetails(request);
return aiServerService
.uploadFiles(request.getFiles(), sourceDetails)
.flatMap(response -> {
TriggerResultDTO triggerResultDTO = new TriggerResultDTO();
triggerResultDTO.setTrigger(response);
return Mono.just(triggerResultDTO);
})
.onErrorResume(error -> handleError("An error has occurred while trying to upload files", error));
}

private Mono<TriggerResultDTO> listFiles(
DatasourceConfiguration datasourceConfiguration, TriggerRequestDTO request) {
SourceDetails sourceDetails = SourceDetails.createSourceDetails(request);
List<String> fileIds = getFileIds(datasourceConfiguration);
if (fileIds.isEmpty()) {
TriggerResultDTO triggerResultDTO = new TriggerResultDTO();
triggerResultDTO.setTrigger(List.of(Map.of(
DISABLED, true, LABEL, "No files available in the datasource", VALUE, "NO_FILES_AVAILABLE")));
return Mono.just(triggerResultDTO);
}
return aiServerService
.getFilesStatus(fileIds, sourceDetails)
.flatMap(fileStatusDTO -> {
List<Map<String, Object>> response = new ArrayList<>();
fileStatusDTO.getFiles().forEach(file -> {
Map<String, Object> dropdownOption = new HashMap<>();
if (!file.isProcessed()) {
dropdownOption.put(LABEL, "(Processing...) " + file.getName());
} else {
dropdownOption.put(LABEL, file.getName());
}
dropdownOption.put(VALUE, file.getId());
dropdownOption.put(DISABLED, !file.isProcessed());
response.add(dropdownOption);
});
TriggerResultDTO triggerResultDTO = new TriggerResultDTO();
triggerResultDTO.setTrigger(response);
return Mono.just(triggerResultDTO);
})
.onErrorResume(
error -> handleError("An error has occurred while trying to list uploaded files", error));
}

protected Mono<TriggerResultDTO> handleError(String message, Throwable error) {
log.error("{}. Error: {}", message, error.getMessage());
if (!(error instanceof AppsmithPluginException)) {
error = new AppsmithPluginException(AppsmithPluginError.PLUGIN_ERROR, error.getMessage(), error);
}
return Mono.error(error);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.external.plugins.services;

import com.appsmith.external.helpers.restApiUtils.connections.APIConnection;
import com.appsmith.external.models.DatasourceConfiguration;
import com.appsmith.external.models.TriggerRequestDTO;
import com.appsmith.external.models.TriggerResultDTO;
import com.fasterxml.jackson.databind.ObjectMapper;
import reactor.core.publisher.Mono;

public class TriggerServiceImpl extends TriggerServiceCEImpl {

public TriggerServiceImpl(AiServerService aiServerService, ObjectMapper objectMapper) {
super(aiServerService, objectMapper);
}

@Override
public Mono<TriggerResultDTO> executeTrigger(
APIConnection connection, DatasourceConfiguration datasourceConfiguration, TriggerRequestDTO request) {
return super.executeTrigger(connection, datasourceConfiguration, request);
}
}