diff --git a/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java b/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java index f634c77a2b330cf2442490efef17964ea2bd8e0d..30d5ee123121545aa7a77ce8d25f83169cbe9c4f 100644 --- a/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java +++ b/src/main/java/eu/hbp/mip/models/DAOs/ExperimentDAO.java @@ -43,6 +43,7 @@ public class ExperimentDAO { @Expose @Column(columnDefinition = "TEXT") + @Enumerated(EnumType.STRING) private Status status; @Expose @@ -55,11 +56,11 @@ public class ExperimentDAO { @Expose @Column(columnDefinition = "TEXT") - private String algorithmDetails; + private String algorithm; @Expose @Column(columnDefinition = "TEXT") - private String algorithm; + private String algorithmId; @Expose @Column(columnDefinition = "TIMESTAMP WITHOUT TIME ZONE") @@ -93,14 +94,14 @@ public class ExperimentDAO { public ExperimentDTO convertToDTO(boolean includeResult) { ExperimentDTO experimentDTO = new ExperimentDTO(); - experimentDTO.setAlgorithm(JsonConverters.convertJsonStringToObject(this.algorithmDetails, AlgorithmDTO.class)); + experimentDTO.setAlgorithm(JsonConverters.convertJsonStringToObject(this.algorithm, AlgorithmDTO.class)); experimentDTO.setCreated(this.created); experimentDTO.setUpdated(this.updated); experimentDTO.setFinished(this.finished); experimentDTO.setCreatedBy(this.createdBy.getUsername()); experimentDTO.setName(this.name); if(includeResult){ - experimentDTO.setResult(JsonConverters.convertJsonStringToObject(String.valueOf(this.result), new ArrayList<ExperimentDTO.ResultDTO>().getClass())); + experimentDTO.setResult(JsonConverters.convertJsonStringToObject(String.valueOf(this.result), new ArrayList<ExperimentDTO.ResultDTO>().getClass())); } experimentDTO.setStatus(this.status); experimentDTO.setShared(this.shared); @@ -109,14 +110,6 @@ public class ExperimentDAO { return experimentDTO; } - public String getAlgorithmDetails() { - return algorithmDetails; - } - - public void setAlgorithmDetails(String algorithmDetails) { - this.algorithmDetails = algorithmDetails; - } - public String getAlgorithm() { return algorithm; } @@ -125,6 +118,14 @@ public class ExperimentDAO { this.algorithm = algorithm; } + public String getAlgorithmId() { + return algorithmId; + } + + public void setAlgorithmId(String algorithmId) { + this.algorithmId = algorithmId; + } + public String getWorkflowHistoryId() { return workflowHistoryId; } diff --git a/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java b/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java index a1c6e916cbdc66332a014e99593865426e8fbe6c..2840f669fcb507bf7b91b0f604b54ba7440cafc9 100644 --- a/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java +++ b/src/main/java/eu/hbp/mip/models/DTOs/ExperimentDTO.java @@ -117,7 +117,7 @@ public class ExperimentDTO { public static class ResultDTO { private Object data; - private Object type; + private String type; public Object getData() { return this.data; @@ -127,11 +127,11 @@ public class ExperimentDTO { this.data = data; } - public Object getType() { + public String getType() { return type; } - public void setType(Object type) { + public void setType(String type) { this.type = type; } } diff --git a/src/main/java/eu/hbp/mip/services/ExperimentService.java b/src/main/java/eu/hbp/mip/services/ExperimentService.java index e12c0b858d5573ce76a7bdb6f67d19e8c246f395..869db8836a24d9e0e39a42fe663db4d2590c2100 100644 --- a/src/main/java/eu/hbp/mip/services/ExperimentService.java +++ b/src/main/java/eu/hbp/mip/services/ExperimentService.java @@ -59,7 +59,7 @@ public class ExperimentService { private static final Gson gson = new Gson(); - private ActiveUserService activeUserService; + private final ActiveUserService activeUserService; private final ExperimentRepository experimentRepository; public ExperimentService(ActiveUserService activeUserService, ExperimentRepository experimentRepository) { @@ -90,7 +90,7 @@ public class ExperimentService { if (size > 50) throw new BadRequestException("Invalid size input, max size is 50."); Specification<ExperimentDAO> spec; - if(authenticationIsEnabled && ClaimUtils.validateAccessRightsOnExperiments(user.getUsername(), authentication.getAuthorities(), logger)) + if(!authenticationIsEnabled || ClaimUtils.validateAccessRightsOnExperiments(user.getUsername(), authentication.getAuthorities(), logger)) { spec = Specification .where(new ExperimentSpecifications.ExperimentWithName(name)) @@ -146,6 +146,7 @@ public class ExperimentService { if ( !experimentDAO.isShared() && !experimentDAO.getCreatedBy().getUsername().equals(user.getUsername()) + && authenticationIsEnabled && ClaimUtils.validateAccessRightsOnExperiments(user.getUsername(), authentication.getAuthorities(), logger) ) { logger.LogUserAction("Accessing Experiment is unauthorized."); @@ -346,9 +347,24 @@ public class ExperimentService { throw new BadRequestException("Created is not editable."); } + if (experimentDTO.getCreatedBy() != null) { + logger.LogUserAction( "CreatedBy is not editable."); + throw new BadRequestException("CreatedBy is not editable."); + } + + if (experimentDTO.getUpdated() != null) { + logger.LogUserAction( "Updated is not editable."); + throw new BadRequestException("Updated is not editable."); + } + + if (experimentDTO.getFinished() != null) { + logger.LogUserAction( "Finished is not editable."); + throw new BadRequestException("Finished is not editable."); + } + if (experimentDTO.getResult() != null) { - logger.LogUserAction( "Status is not editable."); - throw new BadRequestException("Status is not editable."); + logger.LogUserAction( "Result is not editable."); + throw new BadRequestException("Result is not editable."); } if (experimentDTO.getStatus() != null) { @@ -369,7 +385,7 @@ public class ExperimentService { .append("\n")); logger.LogUserAction("Executing " + algorithmName + parametersLogMessage); } - + /** * The getDatasetFromExperimentParameters will retrieve the dataset from the experiment parameters * @@ -434,8 +450,8 @@ public class ExperimentService { ExperimentDAO experimentDAO = new ExperimentDAO(); experimentDAO.setUuid(UUID.randomUUID()); experimentDAO.setCreatedBy(user); - experimentDAO.setAlgorithmDetails(JsonConverters.convertObjectToJsonString(experimentDTO.getAlgorithm())); - experimentDAO.setAlgorithm(experimentDTO.getAlgorithm().getName()); + experimentDAO.setAlgorithm(JsonConverters.convertObjectToJsonString(experimentDTO.getAlgorithm())); + experimentDAO.setAlgorithmId(experimentDTO.getAlgorithm().getName()); experimentDAO.setName(experimentDTO.getName()); experimentDAO.setStatus(ExperimentDAO.Status.pending); @@ -447,7 +463,7 @@ public class ExperimentService { } logger.LogUserAction(" id : " + experimentDAO.getUuid()); - logger.LogUserAction(" algorithms : " + experimentDAO.getAlgorithmDetails()); + logger.LogUserAction(" algorithm : " + experimentDAO.getAlgorithm()); logger.LogUserAction(" name : " + experimentDAO.getName()); return experimentDAO; } @@ -455,7 +471,7 @@ public class ExperimentService { private void saveExperiment(ExperimentDAO experimentDAO, Logger logger) { logger.LogUserAction(" id : " + experimentDAO.getUuid()); - logger.LogUserAction(" algorithms : " + experimentDAO.getAlgorithmDetails()); + logger.LogUserAction(" algorithm : " + experimentDAO.getAlgorithm()); logger.LogUserAction(" name : " + experimentDAO.getName()); logger.LogUserAction(" historyId : " + experimentDAO.getWorkflowHistoryId()); logger.LogUserAction(" status : " + experimentDAO.getStatus()); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 84053f9128a3a2c724ae1aa3ecab8ad0ff9b2e39..b44e1ae9e6f819465f823e018922dd28c72a6a0d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,7 +11,7 @@ logging: ### AUTHENTICATION ### authentication: - enabled: true + enabled: false ### DATABASE CONFIGURATION ### diff --git a/src/main/resources/db/migration/V7_0__NewDatabaseStructure.sql b/src/main/resources/db/migration/V7_0__NewDatabaseStructure.sql index a1c728e963e8e510dfe6df4b128d19d6ce470922..04c6f3f996b7b7e12311ce7058be89812cea1faf 100644 --- a/src/main/resources/db/migration/V7_0__NewDatabaseStructure.sql +++ b/src/main/resources/db/migration/V7_0__NewDatabaseStructure.sql @@ -1,11 +1,37 @@ +UPDATE experiment +SET algorithms = + ( + SELECT SUBSTR(algorithms, 2, LENGTH(algorithms) - 2) + ); + +UPDATE experiment +SET workflowstatus = 'error' +WHERE workflowstatus IS NULL AND haserror; + +UPDATE experiment +SET workflowstatus = 'completed' +WHERE workflowstatus IS NULL AND NOT haserror; + +UPDATE experiment +SET workflowstatus = 'success' +WHERE workflowstatus = 'completed'; + +UPDATE experiment +SET workflowstatus = 'pending' +WHERE workflowstatus = 'running'; + ALTER TABLE experiment DROP COLUMN haserror, DROP COLUMN hasservererror, DROP COLUMN validations, DROP COLUMN model_slug; +UPDATE experiment +SET algorithms = REPLACE(algorithms, '"name"', '"id"'); ALTER TABLE experiment -RENAME algorithms TO algorithmDetails; +RENAME algorithms TO algorithm; +ALTER TABLE experiment +ALTER COLUMN algorithm TYPE json USING algorithm::json; ALTER TABLE experiment RENAME createdby_username TO created_by_username; ALTER TABLE experiment @@ -16,10 +42,15 @@ ALTER TABLE experiment RENAME workflowstatus TO status; ALTER TABLE experiment -ADD COLUMN updated timestamp without time zone; +ADD COLUMN algorithmId text; + +UPDATE experiment +SET algorithmId = (algorithm ->> 'id'); ALTER TABLE experiment -ADD COLUMN algorithm text; +ALTER COLUMN algorithm TYPE text; +ALTER TABLE experiment +ADD COLUMN updated timestamp without time zone; ALTER TABLE "user" DROP COLUMN birthday,