|
20 | 20 | import life.qbic.projectmanagement.application.api.fair.DigitalObject; |
21 | 21 | import life.qbic.projectmanagement.application.api.fair.DigitalObjectFactory; |
22 | 22 | import life.qbic.projectmanagement.application.api.fair.ResearchProject; |
| 23 | +import life.qbic.projectmanagement.application.authorization.ReactiveSecurityContextUtils; |
23 | 24 | import life.qbic.projectmanagement.application.sample.SampleInformationService; |
24 | 25 | import life.qbic.projectmanagement.application.sample.SamplePreview; |
| 26 | +import life.qbic.projectmanagement.application.sample.SampleValidationService; |
25 | 27 | import life.qbic.projectmanagement.domain.model.experiment.ExperimentId; |
26 | 28 | import life.qbic.projectmanagement.domain.model.project.Contact; |
27 | 29 | import life.qbic.projectmanagement.domain.model.project.Project; |
@@ -57,14 +59,17 @@ public class AsyncProjectServiceImpl implements AsyncProjectService { |
57 | 59 | private final Scheduler scheduler; |
58 | 60 | private final SampleInformationService sampleInfoService; |
59 | 61 | private final DigitalObjectFactory digitalObjectFactory; |
| 62 | + private final SampleValidationService sampleValidationService; |
60 | 63 |
|
61 | 64 | public AsyncProjectServiceImpl(@Autowired ProjectInformationService projectService, |
62 | 65 | @Autowired SampleInformationService sampleInfoService, |
63 | | - @Autowired Scheduler scheduler, @Autowired DigitalObjectFactory digitalObjectFactory) { |
| 66 | + @Autowired Scheduler scheduler, @Autowired DigitalObjectFactory digitalObjectFactory, |
| 67 | + @Autowired SampleValidationService sampleValidationService) { |
64 | 68 | this.projectService = Objects.requireNonNull(projectService); |
65 | 69 | this.sampleInfoService = Objects.requireNonNull(sampleInfoService); |
66 | 70 | this.scheduler = Objects.requireNonNull(scheduler); |
67 | 71 | this.digitalObjectFactory = Objects.requireNonNull(digitalObjectFactory); |
| 72 | + this.sampleValidationService = Objects.requireNonNull(sampleValidationService); |
68 | 73 | } |
69 | 74 |
|
70 | 75 | private static Retry defaultRetryStrategy() { |
@@ -238,9 +243,33 @@ public Mono<Sample> findSample(String projectId, String sampleId) { |
238 | 243 | @Override |
239 | 244 | public Flux<ValidationResponse> validate(Flux<ValidationRequest> requests) |
240 | 245 | 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)); |
242 | 270 | } |
243 | 271 |
|
| 272 | + |
244 | 273 | @Override |
245 | 274 | public Mono<ExperimentUpdateResponse> update( |
246 | 275 | ExperimentUpdateRequest request) { |
|
0 commit comments