FINERACT-1978: Delete data table does not delete references

This commit is contained in:
jmarta
2023-10-19 16:48:36 +02:00
committed by Adam Saghy
parent 21978cc4e1
commit e87dd888d2
5 changed files with 88 additions and 95 deletions
@@ -185,11 +185,8 @@ public class DatatablesApiResource {
@ApiResponses({ @ApiResponses({
@ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DatatablesApiResourceSwagger.PutDataTablesResponse.class))) }) @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = DatatablesApiResourceSwagger.PutDataTablesResponse.class))) })
public String deregisterDatatable(@PathParam("datatable") @Parameter(description = "datatable") final String datatable) { public String deregisterDatatable(@PathParam("datatable") @Parameter(description = "datatable") final String datatable) {
this.readWriteNonCoreDataService.deregisterDatatable(datatable); this.readWriteNonCoreDataService.deregisterDatatable(datatable);
final CommandProcessingResult result = new CommandProcessingResultBuilder().withResourceIdAsString(datatable).build(); final CommandProcessingResult result = new CommandProcessingResultBuilder().withResourceIdAsString(datatable).build();
return this.toApiJsonSerializer.serialize(result); return this.toApiJsonSerializer.serialize(result);
} }
@@ -40,11 +40,8 @@ public class DeleteDatatableCommandHandler implements NewCommandSourceHandler {
@Transactional @Transactional
@Override @Override
public CommandProcessingResult processCommand(final JsonCommand command) { public CommandProcessingResult processCommand(final JsonCommand command) {
final String datatableName = command.getUrl().replaceAll("/datatables/", ""); final String datatableName = command.getUrl().replaceAll("/datatables/", "");
this.writePlatformService.deleteDatatable(datatableName); this.writePlatformService.deleteDatatable(datatableName);
return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withResourceIdAsString(datatableName).build(); return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withResourceIdAsString(datatableName).build();
} }
} }
@@ -459,20 +459,16 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
@Transactional @Transactional
@Override @Override
public void deregisterDatatable(final String datatable) { public void deregisterDatatable(final String datatable) {
String validatedDatatable = this.preventSqlInjectionService.encodeSql(datatable); validateDatatableRegistered(datatable);
final String permissionList = "('CREATE_" + validatedDatatable + "', 'CREATE_" + validatedDatatable + "_CHECKER', 'READ_" final String permissionList = "('CREATE_" + datatable + "', 'CREATE_" + datatable + "_CHECKER', 'READ_" + datatable + "', 'UPDATE_"
+ validatedDatatable + "', 'UPDATE_" + validatedDatatable + "', 'UPDATE_" + validatedDatatable + "_CHECKER', 'DELETE_" + datatable + "', 'UPDATE_" + datatable + "_CHECKER', 'DELETE_" + datatable + "', 'DELETE_" + datatable + "_CHECKER')";
+ validatedDatatable + "', 'DELETE_" + validatedDatatable + "_CHECKER')";
final String deleteRolePermissionsSql = "delete from m_role_permission where m_role_permission.permission_id in (select id from m_permission where code in " final String deleteRolePermissionsSql = "delete from m_role_permission where m_role_permission.permission_id in (select id from m_permission where code in "
+ permissionList + ")"; + permissionList + ")";
final String deletePermissionsSql = "delete 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 = '" + datatable + "'";
final String deleteRegisteredDatatableSql = "delete from x_registered_table where registered_table_name = '" + validatedDatatable final String deleteFromConfigurationSql = "delete from c_configuration where name ='" + datatable + "'";
+ "'";
final String deleteFromConfigurationSql = "delete from c_configuration where name ='" + validatedDatatable + "'";
String[] sqlArray = new String[4]; String[] sqlArray = new String[4];
sqlArray[0] = deleteRolePermissionsSql; sqlArray[0] = deleteRolePermissionsSql;
@@ -1250,7 +1246,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
public void deleteDatatable(final String datatableName) { public void deleteDatatable(final String datatableName) {
try { try {
this.context.authenticatedUser(); this.context.authenticatedUser();
validateDatatableRegistered(datatableName); validateDatatableName(datatableName);
assertDataTableEmpty(datatableName); assertDataTableEmpty(datatableName);
deregisterDatatable(datatableName); deregisterDatatable(datatableName);
String[] sqlArray; String[] sqlArray;
@@ -77,45 +77,60 @@ public class DatatableHelper extends IntegrationTest {
getTestDatatableAsJSON(apptableName, multiRow), "resourceIdentifier"); 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<String, Object> 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> T createDatatableEntry(final String datatableName, final Integer apptableId, final boolean genericResultSet, public <T> T createDatatableEntry(final String datatableName, final Integer apptableId, final boolean genericResultSet,
final String json) { final String json) {
return Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId return Utils.performServerPost(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId
+ "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, ""); + "?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> 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> 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, public Integer createDatatableEntry(final String apptableName, final String datatableName, final Integer apptableId,
final boolean genericResultSet, final String dateFormat, final String jsonAttributeToGetBack) { final boolean genericResultSet, final String dateFormat, final String jsonAttributeToGetBack) {
return Utils.performServerPost( return Utils.performServerPost(
@@ -124,6 +139,13 @@ public class DatatableHelper extends IntegrationTest {
getTestDatatableEntryAsJSON(dateFormat), jsonAttributeToGetBack); 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) { public String readDatatableEntry(final String datatableName, final Integer resourceId, final boolean genericResultset) {
return Utils.performServerGet(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + resourceId return Utils.performServerGet(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + resourceId
+ "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER); + "?genericResultSet=" + String.valueOf(genericResultset) + "&" + Utils.TENANT_IDENTIFIER);
@@ -150,9 +172,30 @@ public class DatatableHelper extends IntegrationTest {
return Utils.convertJsonElementAsDate(jsonElement); return Utils.convertJsonElementAsDate(jsonElement);
} }
public String deleteDatatable(final String datatableName) { public <T> T updateDatatableEntry(final String datatableName, final Integer apptableId, final boolean genericResultSet,
return Utils.performServerDelete(this.requestSpec, this.responseSpec, final String json) {
DATATABLE_URL + "/" + datatableName + "?" + Utils.TENANT_IDENTIFIER, "resourceIdentifier"); return Utils.performServerPut(this.requestSpec, this.responseSpec, DATATABLE_URL + "/" + datatableName + "/" + apptableId
+ "?genericResultSet=" + genericResultSet + "&" + Utils.TENANT_IDENTIFIER, json, "");
}
public <T> 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) { 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); 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, public static String getTestDatatableAsJSON(final String apptableName, final String datatableName, final String codeName,
final boolean multiRow) { final boolean multiRow) {
final HashMap<String, Object> map = new HashMap<>(); final HashMap<String, Object> map = new HashMap<>();
@@ -272,33 +301,4 @@ public class DatatableHelper extends IntegrationTest {
datatableColumnsList.add(datatableColumnMap); datatableColumnsList.add(datatableColumnMap);
return datatableColumnsList; 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<String, Object> queryDatatable(String dataTableName, PagedLocalRequestAdvancedQueryData request) {
String response = ok(fineract().dataTables.advancedQuery(dataTableName, request));
return JsonPath.from(response).get("");
}
} }
@@ -339,6 +339,9 @@ public class DatatableIntegrationTest extends IntegrationTest {
// deleting the datatable // deleting the datatable
String deletedDataTableName = this.datatableHelper.deleteDatatable(datatableName); String deletedDataTableName = this.datatableHelper.deleteDatatable(datatableName);
assertEquals(datatableName, deletedDataTableName, "ERROR IN DELETING THE DATATABLE"); assertEquals(datatableName, deletedDataTableName, "ERROR IN DELETING THE DATATABLE");
GetDataTablesResponse dataTable = datatableHelper.getDataTableDetails(datatableName);
assertNull(dataTable);
} }
@Test @Test