diff --git a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/models/ActionExecutionRequest.java b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/models/ActionExecutionRequest.java index 665aa55add..7fe804a868 100644 --- a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/models/ActionExecutionRequest.java +++ b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/models/ActionExecutionRequest.java @@ -8,6 +8,7 @@ import lombok.Setter; import lombok.ToString; import org.springframework.http.HttpMethod; +import java.time.Instant; import java.util.List; import java.util.Map; @@ -17,6 +18,8 @@ import java.util.Map; @NoArgsConstructor @AllArgsConstructor public class ActionExecutionRequest { + String actionId; + Instant requestedAt; @JsonIgnore String query; // Only used for analytics. Not to be returned back to the client. Object body; diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/NewActionServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/NewActionServiceCEImpl.java index ebe570b3dc..fb5519f3e9 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/NewActionServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/NewActionServiceCEImpl.java @@ -703,12 +703,24 @@ public class NewActionServiceCEImpl extends BaseService validatedDatasourceMono .flatMap(datasource1 -> { - return (Mono) pluginExecutor.executeParameterized( + final Instant requestedAt = Instant.now(); + return ((Mono) pluginExecutor.executeParameterized( resourceContext.getConnection(), executeActionDTO, datasource1.getDatasourceConfiguration(), actionConfiguration - ); + )).map(actionExecutionResult -> { + ActionExecutionRequest actionExecutionRequest = actionExecutionResult.getRequest(); + if (actionExecutionRequest == null) { + actionExecutionRequest = new ActionExecutionRequest(); + } + actionExecutionRequest.setActionId(actionId); + actionExecutionRequest.setRequestedAt(requestedAt); + + actionExecutionResult.setRequest(actionExecutionRequest); + + return actionExecutionResult; + }); }) ); @@ -739,6 +751,10 @@ public class NewActionServiceCEImpl extends BaseService())); - - Plugin plugin = pluginService.findByPackageName("postgres-plugin").block(); - MockDataSource mockDataSource = new MockDataSource(); - mockDataSource.setName("Users"); - mockDataSource.setWorkspaceId(workspaceId); - mockDataSource.setPackageName("postgres-plugin"); - mockDataSource.setPluginId(plugin.getId()); - Datasource datasourceMono = mockDataService.createMockDataSet(mockDataSource).block(); - - ActionDTO action = new ActionDTO(); - ActionConfiguration actionConfiguration = new ActionConfiguration(); - actionConfiguration.setBody("select * from users;"); - actionConfiguration.setHttpMethod(HttpMethod.GET); - - action.setActionConfiguration(actionConfiguration); - action.setWorkspaceId(workspaceId); - action.setPageId(testPage.getId()); - action.setName("testActionExecuteDbQuery"); - action.setDatasource(datasourceMono); - - Mono resultMono = layoutActionService.createSingleAction(action) - .flatMap(savedAction -> { - ExecuteActionDTO executeActionDTO = new ExecuteActionDTO(); - executeActionDTO.setActionId(savedAction.getId()); - executeActionDTO.setViewMode(false); - return newActionService.executeAction(executeActionDTO); - }); - - StepVerifier - .create(resultMono) - .assertNext(result -> { - assertThat(result).isNotNull(); - assertThat(result.getIsExecutionSuccess()); - }) - .verifyComplete(); - } } diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ce/ActionServiceCE_Test.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ce/ActionServiceCE_Test.java index 92329033f1..9871e9e6e0 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ce/ActionServiceCE_Test.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ce/ActionServiceCE_Test.java @@ -5,9 +5,9 @@ import com.appsmith.external.dtos.ExecuteActionDTO; import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginError; import com.appsmith.external.exceptions.pluginExceptions.AppsmithPluginException; import com.appsmith.external.exceptions.pluginExceptions.StaleConnectionException; +import com.appsmith.external.helpers.AppsmithBeanUtils; import com.appsmith.external.helpers.AppsmithEventContext; import com.appsmith.external.helpers.AppsmithEventContextType; -import com.appsmith.external.helpers.AppsmithBeanUtils; import com.appsmith.external.models.ActionConfiguration; import com.appsmith.external.models.ActionExecutionResult; import com.appsmith.external.models.Datasource; @@ -27,34 +27,36 @@ import com.appsmith.server.domains.Application; import com.appsmith.server.domains.GitApplicationMetadata; import com.appsmith.server.domains.Layout; import com.appsmith.server.domains.NewAction; -import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Plugin; import com.appsmith.server.domains.User; +import com.appsmith.server.domains.Workspace; import com.appsmith.server.dtos.ActionDTO; import com.appsmith.server.dtos.ActionMoveDTO; import com.appsmith.server.dtos.ActionViewDTO; import com.appsmith.server.dtos.ApplicationAccessDTO; import com.appsmith.server.dtos.DslActionDTO; import com.appsmith.server.dtos.LayoutDTO; +import com.appsmith.server.dtos.MockDataSource; import com.appsmith.server.dtos.PageDTO; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.helpers.MockPluginExecutor; import com.appsmith.server.helpers.PluginExecutorHelper; import com.appsmith.server.helpers.WidgetSuggestionHelper; -import com.appsmith.server.repositories.WorkspaceRepository; import com.appsmith.server.repositories.PluginRepository; +import com.appsmith.server.repositories.WorkspaceRepository; import com.appsmith.server.services.ActionCollectionService; import com.appsmith.server.services.ApplicationPageService; import com.appsmith.server.services.ApplicationService; import com.appsmith.server.services.DatasourceService; import com.appsmith.server.services.LayoutActionService; import com.appsmith.server.services.LayoutService; +import com.appsmith.server.services.MockDataService; import com.appsmith.server.services.NewActionService; import com.appsmith.server.services.NewPageService; -import com.appsmith.server.services.WorkspaceService; import com.appsmith.server.services.PluginService; import com.appsmith.server.services.UserService; +import com.appsmith.server.services.WorkspaceService; import com.appsmith.server.solutions.ImportExportApplicationService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -79,6 +81,7 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import java.time.Duration; +import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -154,6 +157,9 @@ public class ActionServiceCE_Test { @Autowired ApplicationService applicationService; + @Autowired + MockDataService mockDataService; + Application testApp = null; PageDTO testPage = null; @@ -772,6 +778,8 @@ public class ActionServiceCE_Test { assertThat(result.getIsExecutionSuccess()).isFalse(); assertThat(result.getStatusCode()).isEqualTo(pluginException.getAppErrorCode().toString()); assertThat(result.getTitle()).isEqualTo(pluginException.getTitle()); + assertThat(result.getRequest().getActionId()).isEqualTo(createdAction.getId()); + assertThat(result.getRequest().getRequestedAt()).isBefore(Instant.now()); }) .verifyComplete(); } @@ -1027,6 +1035,8 @@ public class ActionServiceCE_Test { assertThat(result.getSuggestedWidgets().size()).isEqualTo(expectedWidgets.size()); assertThat(result.getSuggestedWidgets().containsAll(expectedWidgets)); assertThat(expectedWidgets.containsAll(result.getSuggestedWidgets())); + assertThat(result.getRequest().getActionId()).isEqualTo(executeActionDTO.getActionId()); + assertThat(result.getRequest().getRequestedAt()).isBefore(Instant.now()); }) .verifyComplete(); } @@ -2609,4 +2619,45 @@ public class ActionServiceCE_Test { .verifyComplete(); } + @Test + @WithUserDetails(value = "api_user") + public void executeAction_actionOnMockDatasource_success() { + Mockito.when(pluginExecutorHelper.getPluginExecutor(Mockito.any())).thenReturn(Mono.just(new MockPluginExecutor())); + Mockito.when(pluginService.getEditorConfigLabelMap(Mockito.anyString())).thenReturn(Mono.just(new HashMap<>())); + Mockito.when(pluginExecutor.getHintMessages(Mockito.any(), Mockito.any())) + .thenReturn(Mono.zip(Mono.just(new HashSet<>()), Mono.just(new HashSet<>()))); + + ActionExecutionResult mockResult = new ActionExecutionResult(); + mockResult.setIsExecutionSuccess(true); + mockResult.setBody("response-body"); + + Plugin installed_plugin = pluginRepository.findByPackageName("installed-plugin").block(); + MockDataSource mockDataSource = new MockDataSource(); + mockDataSource.setName("Users"); + mockDataSource.setWorkspaceId(workspaceId); + mockDataSource.setPackageName("postgres-plugin"); + mockDataSource.setPluginId(installed_plugin.getId()); + Datasource mockDatasource = mockDataService.createMockDataSet(mockDataSource).block(); + + List widgetTypeList = new ArrayList<>(); + widgetTypeList.add(WidgetSuggestionHelper.getWidget(WidgetType.TEXT_WIDGET)); + mockResult.setSuggestedWidgets(widgetTypeList); + + ActionDTO action = new ActionDTO(); + ActionConfiguration actionConfiguration = new ActionConfiguration(); + actionConfiguration.setBody("select * from users"); + action.setActionConfiguration(actionConfiguration); + action.setPageId(testPage.getId()); + action.setName("testActionExecuteDbQuery"); + action.setDatasource(mockDatasource); + ActionDTO createdAction = layoutActionService.createSingleAction(action).block(); + + ExecuteActionDTO executeActionDTO = new ExecuteActionDTO(); + executeActionDTO.setActionId(createdAction.getId()); + executeActionDTO.setViewMode(false); + + executeAndAssertAction(executeActionDTO, actionConfiguration, mockResult, + List.of(new ParsedDataType(DisplayDataType.RAW))); + } + }