datatable delete apis should only delete registered datatables
This commit is contained in:
+39
-51
@@ -61,10 +61,17 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
private final static String DATATABLE_NAME_REGEX_PATTERN = "^[a-zA-Z][a-zA-Z0-9\\-_\\s]{0,48}[a-zA-Z0-9]$";
|
||||
|
||||
private final static Logger logger = LoggerFactory.getLogger(ReadWriteNonCoreDataServiceImpl.class);
|
||||
private final static HashMap<String, String> apiTypeToMySQL = new HashMap<String, String>() {{
|
||||
put("String", "VARCHAR"); put("Number", "INT"); put("Decimal", "DECIMAL"); put("Date", "DATE");
|
||||
put("Text", "TEXT"); put ("Dropdown", "INT");
|
||||
}};
|
||||
private final static HashMap<String, String> apiTypeToMySQL = new HashMap<String, String>() {
|
||||
|
||||
{
|
||||
put("String", "VARCHAR");
|
||||
put("Number", "INT");
|
||||
put("Decimal", "DECIMAL");
|
||||
put("Date", "DATE");
|
||||
put("Text", "TEXT");
|
||||
put("Dropdown", "INT");
|
||||
}
|
||||
};
|
||||
|
||||
private final JdbcTemplate jdbcTemplate;
|
||||
private final DataSource dataSource;
|
||||
@@ -282,15 +289,19 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isRegisteredDataTable(final String name) {
|
||||
// PERMITTED datatables
|
||||
final String sql = "select if((exists (select 1 from x_registered_table where registered_table_name = ?)) = 1, 'true', 'false')";
|
||||
final String isRegisteredDataTable = this.jdbcTemplate.queryForObject(sql, String.class, new Object[] { name });
|
||||
return new Boolean(isRegisteredDataTable);
|
||||
}
|
||||
|
||||
private void validateDatatableName(final String name) {
|
||||
|
||||
if (name == null || name.isEmpty()) {
|
||||
throw new PlatformDataIntegrityException("error.msg.datatables.datatable.null.name",
|
||||
"Data table name must not be blank.");
|
||||
} else if (!name.matches(DATATABLE_NAME_REGEX_PATTERN)) {
|
||||
throw new PlatformDataIntegrityException("error.msg.datatables.datatable.invalid.name.regex",
|
||||
"Invalid data table name.", name);
|
||||
}
|
||||
throw new PlatformDataIntegrityException("error.msg.datatables.datatable.null.name", "Data table name must not be blank.");
|
||||
} else if (!name.matches(DATATABLE_NAME_REGEX_PATTERN)) { throw new PlatformDataIntegrityException(
|
||||
"error.msg.datatables.datatable.invalid.name.regex", "Invalid data table name.", name); }
|
||||
}
|
||||
|
||||
private String datatableColumnNameToCodeValueName(final String columnName, final String code) {
|
||||
@@ -318,8 +329,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
String mysqlType = apiTypeToMySQL.get(type);
|
||||
sqlBuilder = sqlBuilder.append("`" + name + "` " + mysqlType);
|
||||
|
||||
if (type != null)
|
||||
{
|
||||
if (type != null) {
|
||||
if (type.equals("String")) {
|
||||
sqlBuilder = sqlBuilder.append("(" + length + ")");
|
||||
} else if (type.equals("Decimal")) {
|
||||
@@ -368,12 +378,10 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
sqlBuilder = sqlBuilder.append("CREATE TABLE `" + datatableName + "` (");
|
||||
|
||||
if (multiRow) {
|
||||
sqlBuilder = sqlBuilder
|
||||
.append("`id` BIGINT(20) NOT NULL AUTO_INCREMENT, ")
|
||||
.append("`" + fkColumnName + "` BIGINT(20) NOT NULL, ");
|
||||
sqlBuilder = sqlBuilder.append("`id` BIGINT(20) NOT NULL AUTO_INCREMENT, ").append(
|
||||
"`" + fkColumnName + "` BIGINT(20) NOT NULL, ");
|
||||
} else {
|
||||
sqlBuilder = sqlBuilder
|
||||
.append("`" + fkColumnName + "` BIGINT(20) NOT NULL, ");
|
||||
sqlBuilder = sqlBuilder.append("`" + fkColumnName + "` BIGINT(20) NOT NULL, ");
|
||||
}
|
||||
|
||||
for (JsonElement column : columns) {
|
||||
@@ -384,18 +392,13 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
sqlBuilder = sqlBuilder.delete(sqlBuilder.length() - 2, sqlBuilder.length());
|
||||
|
||||
if (multiRow) {
|
||||
sqlBuilder = sqlBuilder
|
||||
.append(", PRIMARY KEY (`id`)")
|
||||
sqlBuilder = sqlBuilder.append(", PRIMARY KEY (`id`)")
|
||||
.append(", KEY `fk_" + apptableName.substring(2) + "_id` (`" + fkColumnName + "`)")
|
||||
.append(", CONSTRAINT `fk_" + fkName + "` ")
|
||||
.append("FOREIGN KEY (`" + fkColumnName + "`) ")
|
||||
.append(", CONSTRAINT `fk_" + fkName + "` ").append("FOREIGN KEY (`" + fkColumnName + "`) ")
|
||||
.append("REFERENCES `" + apptableName + "` (`id`)");
|
||||
} else {
|
||||
sqlBuilder = sqlBuilder
|
||||
.append(", PRIMARY KEY (`" + fkColumnName + "`)")
|
||||
.append(", CONSTRAINT `fk_" + fkName + "` ")
|
||||
.append("FOREIGN KEY (`" + fkColumnName + "`) ")
|
||||
.append("REFERENCES `" + apptableName + "` (`id`)");
|
||||
sqlBuilder = sqlBuilder.append(", PRIMARY KEY (`" + fkColumnName + "`)").append(", CONSTRAINT `fk_" + fkName + "` ")
|
||||
.append("FOREIGN KEY (`" + fkColumnName + "`) ").append("REFERENCES `" + apptableName + "` (`id`)");
|
||||
}
|
||||
|
||||
sqlBuilder = sqlBuilder.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
|
||||
@@ -410,17 +413,13 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
if (realCause.getMessage().toLowerCase().contains("duplicate column name")) {
|
||||
baseDataValidator.reset().parameter("name").failWithCode("duplicate.column.name");
|
||||
} else if (realCause.getMessage().contains("Table") && realCause.getMessage().contains("already exists")) {
|
||||
baseDataValidator.reset().parameter("datatableName").value(datatableName)
|
||||
.failWithCode("datatable.already.exists");
|
||||
baseDataValidator.reset().parameter("datatableName").value(datatableName).failWithCode("datatable.already.exists");
|
||||
}
|
||||
|
||||
throwExceptionIfValidationWarningsExist(dataValidationErrors);
|
||||
}
|
||||
|
||||
return new CommandProcessingResultBuilder()
|
||||
.withCommandId(command.commandId())
|
||||
.withResourceIdAsString(datatableName)
|
||||
.build();
|
||||
return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withResourceIdAsString(datatableName).build();
|
||||
}
|
||||
|
||||
private void parseDatatableColumnForUpdate(final JsonObject column,
|
||||
@@ -445,10 +444,8 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
}
|
||||
}
|
||||
|
||||
if (!mapColumnNameDefinition.containsKey(name)) {
|
||||
throw new PlatformDataIntegrityException("error.msg.datatable.column.missing.update.parse",
|
||||
"Column " + name + " does not exist.", name);
|
||||
}
|
||||
if (!mapColumnNameDefinition.containsKey(name)) { throw new PlatformDataIntegrityException(
|
||||
"error.msg.datatable.column.missing.update.parse", "Column " + name + " does not exist.", name); }
|
||||
|
||||
String type = mapColumnNameDefinition.get(name).getColumnType();
|
||||
if (length == null && type.toLowerCase().equals("varchar")) {
|
||||
@@ -554,22 +551,17 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
StringBuilder sqlBuilder = new StringBuilder();
|
||||
|
||||
if (mapColumnNameDefinition.containsKey("id")) {
|
||||
sqlBuilder = sqlBuilder
|
||||
.append("ALTER TABLE `" + datatableName + "` ")
|
||||
.append("DROP KEY `fk_" + oldFKName + "`,")
|
||||
sqlBuilder = sqlBuilder.append("ALTER TABLE `" + datatableName + "` ").append("DROP KEY `fk_" + oldFKName + "`,")
|
||||
.append("DROP FOREIGN KEY `fk_" + oldConstraintName + "`,")
|
||||
.append("CHANGE COLUMN `" + oldFKName + "` `" + newFKName + "` BIGINT(20) NOT NULL,")
|
||||
.append("ADD KEY `fk_" + newFKName + "` (`" + newFKName + "`),")
|
||||
.append("ADD CONSTRAINT `fk_" + newConstraintName + "` ")
|
||||
.append("FOREIGN KEY (`" + newFKName + "`) ")
|
||||
.append("ADD CONSTRAINT `fk_" + newConstraintName + "` ").append("FOREIGN KEY (`" + newFKName + "`) ")
|
||||
.append("REFERENCES `" + apptableName + "` (`id`)");
|
||||
} else {
|
||||
sqlBuilder = sqlBuilder
|
||||
.append("ALTER TABLE `" + datatableName + "` ")
|
||||
sqlBuilder = sqlBuilder.append("ALTER TABLE `" + datatableName + "` ")
|
||||
.append("DROP FOREIGN KEY `fk_" + oldConstraintName + "`,")
|
||||
.append("CHANGE COLUMN `" + oldFKName + "` `" + newFKName + "` BIGINT(20) NOT NULL,")
|
||||
.append("ADD CONSTRAINT `fk_" + newConstraintName + "` ")
|
||||
.append("FOREIGN KEY (`" + newFKName + "`) ")
|
||||
.append("ADD CONSTRAINT `fk_" + newConstraintName + "` ").append("FOREIGN KEY (`" + newFKName + "`) ")
|
||||
.append("REFERENCES `" + apptableName + "` (`id`)");
|
||||
}
|
||||
|
||||
@@ -580,9 +572,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
}
|
||||
}
|
||||
|
||||
if (changeColumns == null && addColumns == null && dropColumns == null) {
|
||||
return;
|
||||
}
|
||||
if (changeColumns == null && addColumns == null && dropColumns == null) { return; }
|
||||
|
||||
if (dropColumns != null) {
|
||||
|
||||
@@ -655,17 +645,15 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ
|
||||
|
||||
try {
|
||||
context.authenticatedUser();
|
||||
|
||||
if (!isRegisteredDataTable(datatableName)) { throw new DatatableNotFoundException(datatableName); }
|
||||
validateDatatableName(datatableName);
|
||||
deregisterDatatable(datatableName);
|
||||
|
||||
String sql = "DROP TABLE `" + datatableName + "`";
|
||||
this.jdbcTemplate.execute(sql);
|
||||
} catch (SQLGrammarException e) {
|
||||
Throwable realCause = e.getCause();
|
||||
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
|
||||
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("datatable");
|
||||
|
||||
if (realCause.getMessage().contains("Unknown table")) {
|
||||
baseDataValidator.reset().parameter("datatableName").failWithCode("does.not.exist");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user