Skip to content

Commit ef5c670

Browse files
committed
Implement validation
1 parent 37045be commit ef5c670

22 files changed

Lines changed: 133 additions & 41 deletions

project-management/src/main/java/life/qbic/projectmanagement/application/api/AsyncProjectService.java

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@
55
import java.nio.ByteBuffer;
66
import java.util.Collection;
77
import java.util.List;
8+
import java.util.Map;
89
import java.util.Optional;
910
import java.util.Set;
1011
import java.util.UUID;
1112
import life.qbic.application.commons.SortOrder;
1213
import life.qbic.projectmanagement.application.ValidationResult;
1314
import life.qbic.projectmanagement.application.batch.SampleUpdateRequest.SampleInformation;
1415
import life.qbic.projectmanagement.application.confounding.ConfoundingVariableService.ConfoundingVariableInformation;
16+
import life.qbic.projectmanagement.application.measurement.NGSMeasurementMetadata;
17+
import life.qbic.projectmanagement.application.measurement.ProteomicsMeasurementMetadata;
18+
import life.qbic.projectmanagement.application.sample.SampleMetadata;
1519
import life.qbic.projectmanagement.application.sample.SamplePreview;
1620
import life.qbic.projectmanagement.domain.model.sample.Sample;
1721
import life.qbic.projectmanagement.domain.model.sample.SampleRegistrationRequest;
@@ -275,15 +279,12 @@ sealed interface ExperimentUpdateResponseBody permits ConfoundingVariables, Expe
275279
* Currently, permits:
276280
*
277281
* <ul>
278-
* <li>{@link SampleMetadata}</li>
279-
* <li>{@link NGSMeasurementMetadata}</li>
280-
* <li>{@link ProteomicsMeasurementMetadata}</li>
282+
* <li>{@link SampleRegistration}</li>
281283
* </ul>
282284
*
283285
* @since 1.10.0
284286
*/
285-
sealed interface ValidationRequestBody permits SampleMetadata, NGSMeasurementMetadata,
286-
ProteomicsMeasurementMetadata {
287+
sealed interface ValidationRequestBody permits SampleRegistration {
287288

288289
}
289290

@@ -680,6 +681,40 @@ record SampleUpdate(String sampleId, SampleInformation information) {
680681

681682
}
682683

684+
/**
685+
* A simple container for sample registration information of an individual sample to register.
686+
*
687+
* @param sampleCode the sample ID that is known to the user
688+
* @param sampleName the sample name
689+
* @param biologicalReplicate the biological replicate label given
690+
* @param condition the String representation of a condition
691+
* @param species the String representation of a species with CURIE
692+
* @param specimen the String representation of a specimen with CURIE
693+
* @param analyte the String representation of an analyte with CURIE
694+
* @param analysisMethod the String representation of the analysis method
695+
* @param comment a users comment
696+
* @param confoundingVariables confounding variables with as a {@link java.util.HashMap}
697+
* representation
698+
* @param experimentId the experiment ID of the experiment the sample should be registered
699+
* to
700+
* @param projectId the project ID of the project the experiment belongs to
701+
* @since 1.10.0
702+
*/
703+
record SampleRegistration(
704+
String sampleCode,
705+
String sampleName,
706+
String biologicalReplicate,
707+
String condition,
708+
String species,
709+
String specimen,
710+
String analyte,
711+
String analysisMethod,
712+
String comment,
713+
Map<String, String> confoundingVariables,
714+
String experimentId,
715+
String projectId
716+
) implements ValidationRequestBody {}
717+
683718
/**
684719
* A service response from a project creation request
685720
*

project-management/src/main/java/life/qbic/projectmanagement/application/api/AsyncProjectServiceImpl.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import life.qbic.projectmanagement.application.api.fair.DigitalObject;
2121
import life.qbic.projectmanagement.application.api.fair.DigitalObjectFactory;
2222
import life.qbic.projectmanagement.application.api.fair.ResearchProject;
23+
import life.qbic.projectmanagement.application.authorization.ReactiveSecurityContextUtils;
2324
import life.qbic.projectmanagement.application.sample.SampleInformationService;
2425
import life.qbic.projectmanagement.application.sample.SamplePreview;
26+
import life.qbic.projectmanagement.application.sample.SampleValidationService;
2527
import life.qbic.projectmanagement.domain.model.experiment.ExperimentId;
2628
import life.qbic.projectmanagement.domain.model.project.Contact;
2729
import life.qbic.projectmanagement.domain.model.project.Project;
@@ -57,14 +59,17 @@ public class AsyncProjectServiceImpl implements AsyncProjectService {
5759
private final Scheduler scheduler;
5860
private final SampleInformationService sampleInfoService;
5961
private final DigitalObjectFactory digitalObjectFactory;
62+
private final SampleValidationService sampleValidationService;
6063

6164
public AsyncProjectServiceImpl(@Autowired ProjectInformationService projectService,
6265
@Autowired SampleInformationService sampleInfoService,
63-
@Autowired Scheduler scheduler, @Autowired DigitalObjectFactory digitalObjectFactory) {
66+
@Autowired Scheduler scheduler, @Autowired DigitalObjectFactory digitalObjectFactory,
67+
@Autowired SampleValidationService sampleValidationService) {
6468
this.projectService = Objects.requireNonNull(projectService);
6569
this.sampleInfoService = Objects.requireNonNull(sampleInfoService);
6670
this.scheduler = Objects.requireNonNull(scheduler);
6771
this.digitalObjectFactory = Objects.requireNonNull(digitalObjectFactory);
72+
this.sampleValidationService = Objects.requireNonNull(sampleValidationService);
6873
}
6974

7075
private static Retry defaultRetryStrategy() {
@@ -238,9 +243,33 @@ public Mono<Sample> findSample(String projectId, String sampleId) {
238243
@Override
239244
public Flux<ValidationResponse> validate(Flux<ValidationRequest> requests)
240245
throws RequestFailedException {
241-
throw new RuntimeException("not implemented");
246+
return requests.flatMap(this::validateRequest);
247+
}
248+
249+
private Mono<ValidationResponse> validateRequest(ValidationRequest request) {
250+
switch (request.requestBody()) {
251+
case SampleRegistration r:
252+
return validateSampleMetadata(r, request.requestId());
253+
default:
254+
return Mono.error(new RequestFailedException("Invalid request"));
255+
}
256+
}
257+
258+
259+
private Mono<ValidationResponse> validateSampleMetadata(SampleRegistration registration,
260+
String requestId) {
261+
var securityContext = SecurityContextHolder.getContext();
262+
return ReactiveSecurityContextUtils.applySecurityContext(
263+
Mono.fromCallable(
264+
() -> sampleValidationService.validateSample(registration).validationResult()
265+
)
266+
.map(validationResult -> new ValidationResponse(requestId, validationResult))
267+
.subscribeOn(scheduler))
268+
.transform(original -> ReactiveSecurityContextUtils.writeSecurityContext(original,
269+
securityContext));
242270
}
243271

272+
244273
@Override
245274
public Mono<ExperimentUpdateResponse> update(
246275
ExperimentUpdateRequest request) {

project-management/src/main/java/life/qbic/projectmanagement/application/measurement/MeasurementService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import life.qbic.logging.api.Logger;
2323
import life.qbic.projectmanagement.application.OrganisationLookupService;
2424
import life.qbic.projectmanagement.application.ProjectInformationService;
25-
import life.qbic.projectmanagement.application.api.NGSMeasurementMetadata;
26-
import life.qbic.projectmanagement.application.api.ProteomicsMeasurementMetadata;
2725
import life.qbic.projectmanagement.application.ontology.TerminologyService;
2826
import life.qbic.projectmanagement.application.sample.SampleIdCodeEntry;
2927
import life.qbic.projectmanagement.application.sample.SampleInformationService;

project-management/src/main/java/life/qbic/projectmanagement/application/api/NGSMeasurementMetadata.java renamed to project-management/src/main/java/life/qbic/projectmanagement/application/measurement/NGSMeasurementMetadata.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
package life.qbic.projectmanagement.application.api;
1+
package life.qbic.projectmanagement.application.measurement;
22

33
import java.util.Collection;
44
import java.util.Optional;
55
import life.qbic.projectmanagement.application.api.AsyncProjectService.ValidationRequestBody;
6-
import life.qbic.projectmanagement.application.measurement.MeasurementMetadata;
76
import life.qbic.projectmanagement.domain.model.sample.SampleCode;
87

98
/**
@@ -18,8 +17,7 @@ public record NGSMeasurementMetadata(String measurementId, Collection<SampleCode
1817
String sequencingReadType, String libraryKit, String flowCell,
1918
String sequencingRunProtocol, String samplePoolGroup,
2019
String indexI7, String indexI5,
21-
String comment) implements MeasurementMetadata,
22-
ValidationRequestBody {
20+
String comment) implements MeasurementMetadata {
2321

2422
public static NGSMeasurementMetadata copyWithNewProperties(
2523
Collection<SampleCode> associatedSamples, String indexI7, String indexI5,

project-management/src/main/java/life/qbic/projectmanagement/application/api/ProteomicsMeasurementMetadata.java renamed to project-management/src/main/java/life/qbic/projectmanagement/application/measurement/ProteomicsMeasurementMetadata.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
package life.qbic.projectmanagement.application.api;
1+
package life.qbic.projectmanagement.application.measurement;
22

33
import java.util.Optional;
44
import life.qbic.projectmanagement.application.api.AsyncProjectService.ValidationRequestBody;
5-
import life.qbic.projectmanagement.application.measurement.Labeling;
6-
import life.qbic.projectmanagement.application.measurement.MeasurementMetadata;
75
import life.qbic.projectmanagement.domain.model.sample.SampleCode;
86

97
/**
@@ -30,7 +28,7 @@ public record ProteomicsMeasurementMetadata(
3028
String lcmsMethod,
3129
Labeling labeling,
3230
String comment
33-
) implements MeasurementMetadata, ValidationRequestBody {
31+
) implements MeasurementMetadata {
3432

3533

3634
@Override

project-management/src/main/java/life/qbic/projectmanagement/application/measurement/validation/MeasurementNGSValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import life.qbic.projectmanagement.application.ValidationException;
1414
import life.qbic.projectmanagement.application.ValidationResult;
1515
import life.qbic.projectmanagement.application.measurement.MeasurementService;
16-
import life.qbic.projectmanagement.application.api.NGSMeasurementMetadata;
16+
import life.qbic.projectmanagement.application.measurement.NGSMeasurementMetadata;
1717
import life.qbic.projectmanagement.application.ontology.TerminologyService;
1818
import life.qbic.projectmanagement.application.sample.SampleInformationService;
1919
import life.qbic.projectmanagement.domain.model.project.ProjectId;

project-management/src/main/java/life/qbic/projectmanagement/application/measurement/validation/MeasurementProteomicsValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import life.qbic.projectmanagement.application.ValidationException;
1313
import life.qbic.projectmanagement.application.ValidationResult;
1414
import life.qbic.projectmanagement.application.measurement.MeasurementService;
15-
import life.qbic.projectmanagement.application.api.ProteomicsMeasurementMetadata;
15+
import life.qbic.projectmanagement.application.measurement.ProteomicsMeasurementMetadata;
1616
import life.qbic.projectmanagement.application.ontology.TerminologyService;
1717
import life.qbic.projectmanagement.application.sample.SampleInformationService;
1818
import life.qbic.projectmanagement.domain.model.project.ProjectId;

project-management/src/main/java/life/qbic/projectmanagement/application/measurement/validation/MeasurementValidationService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import java.util.Optional;
55
import java.util.concurrent.CompletableFuture;
66
import life.qbic.projectmanagement.application.ValidationResult;
7-
import life.qbic.projectmanagement.application.api.NGSMeasurementMetadata;
8-
import life.qbic.projectmanagement.application.api.ProteomicsMeasurementMetadata;
7+
import life.qbic.projectmanagement.application.measurement.NGSMeasurementMetadata;
8+
import life.qbic.projectmanagement.application.measurement.ProteomicsMeasurementMetadata;
99
import life.qbic.projectmanagement.domain.model.project.ProjectId;
1010
import org.springframework.beans.factory.annotation.Autowired;
1111
import org.springframework.scheduling.annotation.Async;

project-management/src/main/java/life/qbic/projectmanagement/application/api/SampleMetadata.java renamed to project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleMetadata.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
package life.qbic.projectmanagement.application.api;
1+
package life.qbic.projectmanagement.application.sample;
22

33
import java.util.Map;
44
import java.util.Optional;
5-
import life.qbic.projectmanagement.application.api.AsyncProjectService.ValidationRequestBody;
65
import life.qbic.projectmanagement.application.confounding.ConfoundingVariableService.ConfoundingVariableInformation;
76
import life.qbic.projectmanagement.domain.model.OntologyTerm;
87
import life.qbic.projectmanagement.domain.model.sample.AnalysisMethod;
@@ -28,7 +27,7 @@ public record SampleMetadata(
2827
String comment,
2928
Map<ConfoundingVariableInformation, String> confoundingVariables,
3029
String experimentId
31-
) implements ValidationRequestBody {
30+
) {
3231

3332
public static SampleMetadata createNew(String sampleName,
3433
AnalysisMethod analysisToBePerformed,

project-management/src/main/java/life/qbic/projectmanagement/application/sample/SampleRegistrationServiceV2.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import life.qbic.logging.api.Logger;
1717
import life.qbic.projectmanagement.application.DeletionService;
1818
import life.qbic.projectmanagement.application.api.SampleCodeService;
19-
import life.qbic.projectmanagement.application.api.SampleMetadata;
2019
import life.qbic.projectmanagement.application.batch.BatchRegistrationService;
2120
import life.qbic.projectmanagement.application.confounding.ConfoundingVariableService;
2221
import life.qbic.projectmanagement.application.confounding.ConfoundingVariableService.ExperimentReference;

0 commit comments

Comments
 (0)