From e87dd888d2e8261cfd60e6682ad25a072f0310f0 Mon Sep 17 00:00:00 2001 From: jmarta Date: Tue, 3 Oct 2023 00:13:56 +0200 Subject: [PATCH] FINERACT-1978: Delete data table does not delete references --- .../api/DatatablesApiResource.java | 3 - .../DeleteDatatableCommandHandler.java | 3 - .../ReadWriteNonCoreDataServiceImpl.java | 16 +- .../common/system/DatatableHelper.java | 158 +++++++++--------- .../datatable/DatatableIntegrationTest.java | 3 + 5 files changed, 88 insertions(+), 95 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResource.java index 38ddae0d4..d0ba53fc6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResource.java @@ -185,11 +185,8 @@ public class DatatablesApiResource { @ApiResponses({ @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DatatablesApiResourceSwagger.PutDataTablesResponse.class))) }) public String deregisterDatatable(@PathParam("datatable") @Parameter(description = "datatable") final String datatable) { - this.readWriteNonCoreDataService.deregisterDatatable(datatable); - final CommandProcessingResult result = new CommandProcessingResultBuilder().withResourceIdAsString(datatable).build(); - return this.toApiJsonSerializer.serialize(result); } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/handler/DeleteDatatableCommandHandler.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/handler/DeleteDatatableCommandHandler.java index c23f24674..176c0bf57 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/handler/DeleteDatatableCommandHandler.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/handler/DeleteDatatableCommandHandler.java @@ -40,11 +40,8 @@ public class DeleteDatatableCommandHandler implements NewCommandSourceHandler { @Transactional @Override public CommandProcessingResult processCommand(final JsonCommand command) { - final String datatableName = command.getUrl().replaceAll("/datatables/", ""); - this.writePlatformService.deleteDatatable(datatableName); - return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withResourceIdAsString(datatableName).build(); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java index 70c3a2ee0..37d63686e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java @@ -459,20 +459,16 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ @Transactional @Override public void deregisterDatatable(final String datatable) { - String validatedDatatable = this.preventSqlInjectionService.encodeSql(datatable); - final String permissionList = "('CREATE_" + validatedDatatable + "', 'CREATE_" + validatedDatatable + "_CHECKER', 'READ_" - + validatedDatatable + "', 'UPDATE_" + validatedDatatable + "', 'UPDATE_" + validatedDatatable + "_CHECKER', 'DELETE_" - + validatedDatatable + "', 'DELETE_" + validatedDatatable + "_CHECKER')"; + validateDatatableRegistered(datatable); + final String permissionList = "('CREATE_" + datatable + "', 'CREATE_" + datatable + "_CHECKER', 'READ_" + datatable + "', 'UPDATE_" + + datatable + "', 'UPDATE_" + datatable + "_CHECKER', 'DELETE_" + datatable + "', 'DELETE_" + datatable + "_CHECKER')"; final String deleteRolePermissionsSql = "delete from m_role_permission where m_role_permission.permission_id in (select id from m_permission where code in " + permissionList + ")"; final String deletePermissionsSql = "delete from m_permission where code in " + permissionList; - - final String deleteRegisteredDatatableSql = "delete from x_registered_table where registered_table_name = '" + validatedDatatable - + "'"; - - final String deleteFromConfigurationSql = "delete from c_configuration where name ='" + validatedDatatable + "'"; + final String deleteRegisteredDatatableSql = "delete from x_registered_table where registered_table_name = '" + datatable + "'"; + final String deleteFromConfigurationSql = "delete from c_configuration where name ='" + datatable + "'"; String[] sqlArray = new String[4]; sqlArray[0] = deleteRolePermissionsSql; @@ -1250,7 +1246,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ public void deleteDatatable(final String datatableName) { try { this.context.authenticatedUser(); - validateDatatableRegistered(datatableName); + validateDatatableName(datatableName); assertDataTableEmpty(datatableName); deregisterDatatable(datatableName); String[] sqlArray; diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java index 313494a7a..5c5bad42a 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/system/DatatableHelper.java @@ -77,45 +77,60 @@ public class DatatableHelper extends IntegrationTest { getTestDatatableAsJSON(apptableName, multiRow), "resourceIdentifier"); } + public PostDataTablesResponse createDatatable(final String json) { + final String response = Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "?" + Utils.TENANT_IDENTIFIER, + json); + return GSON.fromJson(response, PostDataTablesResponse.class); + } + + public PostDataTablesResponse createDatatable(PostDataTablesRequest request) { + return ok(fineract().dataTables.createDatatable(request)); + } + + public static void verifyDatatableCreatedOnServer(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, + final String generatedDatatableName) { + LOG.info("------------------------------CHECK DATATABLE DETAILS------------------------------------\n"); + final String responseRegisteredTableName = Utils.performServerGet(requestSpec, responseSpec, + DATATABLE_URL + "/" + generatedDatatableName + "?" + Utils.TENANT_IDENTIFIER, "registeredTableName"); + assertEquals(generatedDatatableName, responseRegisteredTableName, "ERROR IN CREATING THE DATATABLE"); + } + + public GetDataTablesResponse getDataTableDetails(final String dataTableName) { + return ok(fineract().dataTables.getDatatable(dataTableName)); + } + + public String runDatatableQuery(final String datatableName, final String columnFilter, final String valueFilter, + final String resultColumns) { + return Utils.performServerGet(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/query" + "?columnFilter=" + + columnFilter + "&valueFilter=" + valueFilter + "&resultColumns=" + resultColumns + "&" + Utils.TENANT_IDENTIFIER); + } + + public Map queryDatatable(String dataTableName, PagedLocalRequestAdvancedQueryData request) { + String response = ok(fineract().dataTables.advancedQuery(dataTableName, request)); + return JsonPath.from(response).get(""); + } + + public PutDataTablesResponse updateDatatable(String dataTableName, PutDataTablesRequest request) { + return ok(fineract().dataTables.updateDatatable(dataTableName, request)); + } + + public PutDataTablesResponse updateDatatable(String dataTableName, final String json) { + final String response = Utils.performServerPut(this.requestSpec, this.responseSpec, + DATATABLE_URL + "/" + dataTableName + "?" + Utils.TENANT_IDENTIFIER, json); + return GSON.fromJson(response, PutDataTablesResponse.class); + } + + public String deleteDatatable(final String datatableName) { + return Utils.performServerDelete(this.requestSpec, this.responseSpec, + DATATABLE_URL + "/" + datatableName + "?" + Utils.TENANT_IDENTIFIER, "resourceIdentifier"); + } + public T createDatatableEntry(final String datatableName, final Integer apptableId, final boolean genericResultSet, final String json) { return Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, ""); } - public PostDataTablesAppTableIdResponse addDatatableEntry(final String datatableName, final Integer apptableId, - final boolean genericResultSet, final String json) { - final String response = Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" - + apptableId + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json); - return GSON.fromJson(response, PostDataTablesAppTableIdResponse.class); - } - - public T updateDatatableEntry(final String datatableName, final Integer apptableId, final boolean genericResultSet, - final String json) { - return Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId - + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, ""); - } - - public T updateDatatableEntry(final String datatableName, final Integer apptableId, final Integer entryId, - final boolean genericResultSet, final String json) { - return Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId + "/" - + entryId + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, ""); - } - - public PutDataTablesAppTableIdDatatableIdResponse updateDatatableEntry(final String datatableName, final Integer apptableId, - final Integer entryId, final String json) { - final String response = Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" - + apptableId + "/" + entryId + "?genericResultSet=false&" + Utils.TENANT_IDENTIFIER, json, null); - return GSON.fromJson(response, PutDataTablesAppTableIdDatatableIdResponse.class); - } - - public PutDataTablesAppTableIdDatatableIdResponse updateDatatableEntry(final String datatableName, final Integer apptableId, - final String json) { - final String response = Utils.performServerPut(this.requestSpec, this.responseSpec, - DATATABLE_URL + "/" + datatableName + "/" + apptableId + "?genericResultSet=false&" + Utils.TENANT_IDENTIFIER, json, null); - return GSON.fromJson(response, PutDataTablesAppTableIdDatatableIdResponse.class); - } - public Integer createDatatableEntry(final String apptableName, final String datatableName, final Integer apptableId, final boolean genericResultSet, final String dateFormat, final String jsonAttributeToGetBack) { return Utils.performServerPost( @@ -124,6 +139,13 @@ public class DatatableHelper extends IntegrationTest { getTestDatatableEntryAsJSON(dateFormat), jsonAttributeToGetBack); } + public PostDataTablesAppTableIdResponse addDatatableEntry(final String datatableName, final Integer apptableId, + final boolean genericResultSet, final String json) { + final String response = Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + + apptableId + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json); + return GSON.fromJson(response, PostDataTablesAppTableIdResponse.class); + } + public String readDatatableEntry(final String datatableName, final Integer resourceId, final boolean genericResultset) { return Utils.performServerGet(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + resourceId + "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER); @@ -150,9 +172,30 @@ public class DatatableHelper extends IntegrationTest { return Utils.convertJsonElementAsDate(jsonElement); } - public String deleteDatatable(final String datatableName) { - return Utils.performServerDelete(this.requestSpec, this.responseSpec, - DATATABLE_URL + "/" + datatableName + "?" + Utils.TENANT_IDENTIFIER, "resourceIdentifier"); + public T updateDatatableEntry(final String datatableName, final Integer apptableId, final boolean genericResultSet, + final String json) { + return Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId + + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, ""); + } + + public T updateDatatableEntry(final String datatableName, final Integer apptableId, final Integer entryId, + final boolean genericResultSet, final String json) { + return Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId + "/" + + entryId + "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, ""); + } + + public PutDataTablesAppTableIdDatatableIdResponse updateDatatableEntry(final String datatableName, final Integer apptableId, + final Integer entryId, final String json) { + final String response = Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + + apptableId + "/" + entryId + "?genericResultSet=false&" + Utils.TENANT_IDENTIFIER, json, null); + return GSON.fromJson(response, PutDataTablesAppTableIdDatatableIdResponse.class); + } + + public PutDataTablesAppTableIdDatatableIdResponse updateDatatableEntry(final String datatableName, final Integer apptableId, + final String json) { + final String response = Utils.performServerPut(this.requestSpec, this.responseSpec, + DATATABLE_URL + "/" + datatableName + "/" + apptableId + "?genericResultSet=false&" + Utils.TENANT_IDENTIFIER, json, null); + return GSON.fromJson(response, PutDataTablesAppTableIdDatatableIdResponse.class); } public Object deleteDatatableEntries(final String datatableName, final Integer apptableId, String jsonAttributeToGetBack) { @@ -161,20 +204,6 @@ public class DatatableHelper extends IntegrationTest { return Utils.performServerDelete(this.requestSpec, this.responseSpec, deleteEntryUrl, jsonAttributeToGetBack); } - public String runDatatableQuery(final String datatableName, final String columnFilter, final String valueFilter, - final String resultColumns) { - return Utils.performServerGet(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/query" + "?columnFilter=" - + columnFilter + "&valueFilter=" + valueFilter + "&resultColumns=" + resultColumns + "&" + Utils.TENANT_IDENTIFIER); - } - - public static void verifyDatatableCreatedOnServer(final RequestSpecification requestSpec, final ResponseSpecification responseSpec, - final String generatedDatatableName) { - LOG.info("------------------------------CHECK DATATABLE DETAILS------------------------------------\n"); - final String responseRegisteredTableName = Utils.performServerGet(requestSpec, responseSpec, - DATATABLE_URL + "/" + generatedDatatableName + "?" + Utils.TENANT_IDENTIFIER, "registeredTableName"); - assertEquals(generatedDatatableName, responseRegisteredTableName, "ERROR IN CREATING THE DATATABLE"); - } - public static String getTestDatatableAsJSON(final String apptableName, final String datatableName, final String codeName, final boolean multiRow) { final HashMap map = new HashMap<>(); @@ -272,33 +301,4 @@ public class DatatableHelper extends IntegrationTest { datatableColumnsList.add(datatableColumnMap); return datatableColumnsList; } - - public PostDataTablesResponse createDatatable(PostDataTablesRequest request) { - return ok(fineract().dataTables.createDatatable(request)); - } - - public GetDataTablesResponse getDataTableDetails(final String dataTableName) { - return ok(fineract().dataTables.getDatatable(dataTableName)); - } - - public PutDataTablesResponse updateDatatable(String dataTableName, PutDataTablesRequest request) { - return ok(fineract().dataTables.updateDatatable(dataTableName, request)); - } - - public PostDataTablesResponse createDatatable(final String json) { - final String response = Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "?" + Utils.TENANT_IDENTIFIER, - json); - return GSON.fromJson(response, PostDataTablesResponse.class); - } - - public PutDataTablesResponse updateDatatable(String dataTableName, final String json) { - final String response = Utils.performServerPut(this.requestSpec, this.responseSpec, - DATATABLE_URL + "/" + dataTableName + "?" + Utils.TENANT_IDENTIFIER, json); - return GSON.fromJson(response, PutDataTablesResponse.class); - } - - public Map queryDatatable(String dataTableName, PagedLocalRequestAdvancedQueryData request) { - String response = ok(fineract().dataTables.advancedQuery(dataTableName, request)); - return JsonPath.from(response).get(""); - } } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/datatable/DatatableIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/datatable/DatatableIntegrationTest.java index 8dd74135e..2c7b8a4bc 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/datatable/DatatableIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/datatable/DatatableIntegrationTest.java @@ -339,6 +339,9 @@ public class DatatableIntegrationTest extends IntegrationTest { // deleting the datatable String deletedDataTableName = this.datatableHelper.deleteDatatable(datatableName); assertEquals(datatableName, deletedDataTableName, "ERROR IN DELETING THE DATATABLE"); + + GetDataTablesResponse dataTable = datatableHelper.getDataTableDetails(datatableName); + assertNull(dataTable); } @Test