From f7125c6cb887393b52cf7eb29cdcd4631c56a7aa Mon Sep 17 00:00:00 2001 From: boy52hz Date: Tue, 2 Dec 2025 12:14:55 +0700 Subject: [PATCH 1/2] release hlab-v.1.0.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0e9bf41df..94f431925 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ server - 2.24.0 + hlab-v.1.0.0 pom EHRbase server EHRbase openEHR server From 7850dce07221f3ae573df5f220f7cb67d76b42a2 Mon Sep 17 00:00:00 2001 From: boy52hz Date: Tue, 2 Dec 2025 12:26:14 +0700 Subject: [PATCH 2/2] style: format code --- pom.xml | 2 +- .../openehr/OpenehrCompositionController.java | 89 +++++++++---------- .../rest/openehr/OpenehrQueryController.java | 79 ++++++++-------- .../openehr/dto/CompositionQueryResponse.java | 29 ++++-- .../CompositionApiSpecification.java | 58 ++++++------ .../specification/QueryApiSpecification.java | 16 ++-- .../OpenehrCompositionControllerTest.java | 20 +++-- .../openehr/OpenehrQueryControllerTest.java | 75 ++++++++-------- .../repository/CompositionRepository.java | 8 +- .../repository/ContributionRepository.java | 9 +- .../service/CompositionServiceImp.java | 16 ++-- 11 files changed, 203 insertions(+), 198 deletions(-) diff --git a/pom.xml b/pom.xml index 94f431925..c6f5a51a6 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ server - hlab-v.1.0.0 + 2.24.0 pom EHRbase server EHRbase openEHR server diff --git a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrCompositionController.java b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrCompositionController.java index a3b52d88d..43380aac5 100644 --- a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrCompositionController.java +++ b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrCompositionController.java @@ -150,7 +150,6 @@ public ResponseEntity createComposition( .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build()); } - @PostMapping(value = "/composition/validate") @Override public ResponseEntity validateComposition( @@ -158,8 +157,7 @@ public ResponseEntity validateComposition( @RequestHeader(value = ACCEPT, required = false) String accept, @RequestParam(value = "templateId", required = false) String templateId, @RequestParam(value = "format", required = false) String format, - @RequestBody String composition - ) { + @RequestBody String composition) { var requestRepresentation = extractCompositionRepresentation(contentType, format); var compoObj = compositionService.buildComposition(composition, requestRepresentation.format, templateId); @@ -170,14 +168,13 @@ public ResponseEntity validateComposition( @PostMapping(value = "{ehr_id}/composition/preview") @Override - public ResponseEntity> previewComposition( + public ResponseEntity> previewComposition( @RequestHeader(value = CONTENT_TYPE) String contentType, @RequestHeader(value = ACCEPT, required = false) String accept, @PathVariable(value = "ehr_id") String ehrIdString, @RequestParam(value = "templateId", required = false) String templateId, @RequestParam(value = "format", required = false) String format, - @RequestBody String composition - ) { + @RequestBody String composition) { var ehrId = getEhrUuid(ehrIdString); var requestRepresentation = extractCompositionRepresentation(contentType, format); var compoObj = compositionService.buildComposition(composition, requestRepresentation.format, templateId); @@ -187,46 +184,46 @@ public ResponseEntity> previewComposition( return ResponseEntity.ok(compDataPreview); } - @PutMapping( - value = "{ehr_id}/composition/{versioned_object_uid}/preview", - consumes = { - MediaType.APPLICATION_JSON_VALUE, - MediaType.APPLICATION_XML_VALUE, - OpenEHRMediaType.APPLICATION_WT_FLAT_SCHEMA_JSON_VALUE, - OpenEHRMediaType.APPLICATION_WT_STRUCTURED_SCHEMA_JSON_VALUE - }) - @Override - public ResponseEntity> previewUpdatedComposition( - @RequestHeader(value = CONTENT_TYPE) String contentType, - @RequestHeader(value = ACCEPT, required = false) String accept, - @RequestHeader(value = IF_MATCH) String ifMatch, - @PathVariable(value = "ehr_id") String ehrIdString, - @PathVariable(value = "versioned_object_uid") String versionedObjectUidString, - @RequestParam(value = "templateId", required = false) String templateId, - @RequestParam(value = "format", required = false) String format, - @RequestBody String composition) { - - UUID ehrId = getEhrUuid(ehrIdString); - UUID versionedObjectUid = getCompositionVersionedObjectUidString(versionedObjectUidString); - - CompositionRepresentation requestRepresentation = extractCompositionRepresentation(contentType, format); - Composition compoObj = - compositionService.buildComposition(composition, requestRepresentation.format, templateId); - - Optional inputUuid = getUidFrom(compoObj); - inputUuid.ifPresent(id -> { - if (!versionedObjectUid.equals(extractVersionedObjectUidFromVersionUid(id))) { - throw new PreconditionFailedException( - "UUID from input must match given versioned_object_uid in request URL"); - } - }); - - ObjectVersionId ifMatchId = new ObjectVersionId(ifMatch); - Map compDataPreview = - compositionService.previewUpdatedCompDataRecords(ehrId, ifMatchId, compoObj); - - return ResponseEntity.ok(compDataPreview); - } + @PutMapping( + value = "{ehr_id}/composition/{versioned_object_uid}/preview", + consumes = { + MediaType.APPLICATION_JSON_VALUE, + MediaType.APPLICATION_XML_VALUE, + OpenEHRMediaType.APPLICATION_WT_FLAT_SCHEMA_JSON_VALUE, + OpenEHRMediaType.APPLICATION_WT_STRUCTURED_SCHEMA_JSON_VALUE + }) + @Override + public ResponseEntity> previewUpdatedComposition( + @RequestHeader(value = CONTENT_TYPE) String contentType, + @RequestHeader(value = ACCEPT, required = false) String accept, + @RequestHeader(value = IF_MATCH) String ifMatch, + @PathVariable(value = "ehr_id") String ehrIdString, + @PathVariable(value = "versioned_object_uid") String versionedObjectUidString, + @RequestParam(value = "templateId", required = false) String templateId, + @RequestParam(value = "format", required = false) String format, + @RequestBody String composition) { + + UUID ehrId = getEhrUuid(ehrIdString); + UUID versionedObjectUid = getCompositionVersionedObjectUidString(versionedObjectUidString); + + CompositionRepresentation requestRepresentation = extractCompositionRepresentation(contentType, format); + Composition compoObj = + compositionService.buildComposition(composition, requestRepresentation.format, templateId); + + Optional inputUuid = getUidFrom(compoObj); + inputUuid.ifPresent(id -> { + if (!versionedObjectUid.equals(extractVersionedObjectUidFromVersionUid(id))) { + throw new PreconditionFailedException( + "UUID from input must match given versioned_object_uid in request URL"); + } + }); + + ObjectVersionId ifMatchId = new ObjectVersionId(ifMatch); + Map compDataPreview = + compositionService.previewUpdatedCompDataRecords(ehrId, ifMatchId, compoObj); + + return ResponseEntity.ok(compDataPreview); + } @PutMapping( value = "/{ehr_id}/composition/{versioned_object_uid}", diff --git a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrQueryController.java b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrQueryController.java index 6c8001764..3a13d1353 100644 --- a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrQueryController.java +++ b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/OpenehrQueryController.java @@ -52,12 +52,12 @@ import org.ehrbase.openehr.sdk.aql.dto.select.SelectExpression; import org.ehrbase.openehr.sdk.response.dto.MetaData; import org.ehrbase.openehr.sdk.response.dto.QueryResponseData; +import org.ehrbase.openehr.sdk.response.dto.ehrscape.CompositionDto; +import org.ehrbase.openehr.sdk.response.dto.ehrscape.CompositionFormat; import org.ehrbase.openehr.sdk.response.dto.ehrscape.QueryDefinitionResultDto; import org.ehrbase.openehr.sdk.response.dto.ehrscape.QueryResultDto; -import org.ehrbase.openehr.sdk.response.dto.ehrscape.query.ResultHolder; -import org.ehrbase.openehr.sdk.response.dto.ehrscape.CompositionDto; import org.ehrbase.openehr.sdk.response.dto.ehrscape.StructuredString; -import org.ehrbase.openehr.sdk.response.dto.ehrscape.CompositionFormat; +import org.ehrbase.openehr.sdk.response.dto.ehrscape.query.ResultHolder; import org.ehrbase.rest.BaseController; import org.ehrbase.rest.openehr.dto.CompositionQueryResponse; import org.ehrbase.rest.openehr.format.CompositionRepresentation; @@ -192,14 +192,14 @@ public ResponseEntity executeCompositionQuery( PreparedAdHocQuery preparedQuery = prepareAdHocQuery(requestBody); - validateCompositionSelect(preparedQuery); + validateCompositionSelect(preparedQuery); - String effectiveFormat = Optional.ofNullable(format) - .filter(StringUtils::isNotBlank) - .orElseGet(() -> Optional.ofNullable(requestBody) - .map(body -> body.get(COMPOSITION_FORMAT_PARAM)) - .map(Object::toString) - .orElse(null)); + String effectiveFormat = Optional.ofNullable(format) + .filter(StringUtils::isNotBlank) + .orElseGet(() -> Optional.ofNullable(requestBody) + .map(body -> body.get(COMPOSITION_FORMAT_PARAM)) + .map(Object::toString) + .orElse(null)); CompositionRepresentation representation = extractCompositionRepresentation(accept, effectiveFormat); @@ -207,9 +207,7 @@ public ResponseEntity executeCompositionQuery( CompositionQueryResponse response = toCompositionResponse(preparedQuery, result, representation); - return ResponseEntity.ok() - .contentType(representation.mediaType) - .body(response); + return ResponseEntity.ok().contentType(representation.mediaType).body(response); } /** @@ -313,26 +311,26 @@ private PreparedAdHocQuery prepareAdHocQuery(Map requestBody) { logger.debug("Got following input: {}", body); Object rawQuery = body.get(Q_PARAM); - String queryText = switch (rawQuery) { - case null -> throw new InvalidApiParameterException("No query provided."); - case Collection __ -> throw new InvalidApiParameterException("Multiple queries provided."); - case String s when StringUtils.isBlank(s) -> throw new InvalidApiParameterException("No query provided."); - case String s -> s; - default -> throw new InvalidApiParameterException("Data type of query not supported."); - }; + String queryText = + switch (rawQuery) { + case null -> throw new InvalidApiParameterException("No query provided."); + case Collection __ -> throw new InvalidApiParameterException("Multiple queries provided."); + case String s + when StringUtils.isBlank(s) -> throw new InvalidApiParameterException("No query provided."); + case String s -> s; + default -> throw new InvalidApiParameterException("Data type of query not supported."); + }; HttpRestContext.register(QUERY_EXECUTE_ENDPOINT, Boolean.TRUE); Map params = OpenEhrQueryRequestUtils.getSubMap(body, QUERY_PARAMETERS); Long fetch = OpenEhrQueryRequestUtils.getOptionalLong(body, FETCH_PARAM).orElse(null); - Long offset = OpenEhrQueryRequestUtils.getOptionalLong(body, OFFSET_PARAM).orElse(null); + Long offset = + OpenEhrQueryRequestUtils.getOptionalLong(body, OFFSET_PARAM).orElse(null); AqlQueryRequest queryRequest = AqlQueryRequest.prepare( - queryText, - OpenEhrQueryRequestUtils.rewriteExplicitParameterTypes(params), - fetch, - offset); + queryText, OpenEhrQueryRequestUtils.rewriteExplicitParameterTypes(params), fetch, offset); return new PreparedAdHocQuery(queryText, queryRequest); } @@ -342,9 +340,11 @@ private SelectExpression validateCompositionSelect(PreparedAdHocQuery preparedQu SelectClause selectClause = Optional.ofNullable(aqlQuery.getSelect()) .orElseThrow(() -> new InvalidApiParameterException("Query must contain a SELECT clause.")); - List statements = Optional.ofNullable(selectClause.getStatement()).orElse(List.of()); + List statements = + Optional.ofNullable(selectClause.getStatement()).orElse(List.of()); if (statements.size() != 1) { - throw new InvalidApiParameterException("Composition query endpoint supports exactly one SELECT expression."); + throw new InvalidApiParameterException( + "Composition query endpoint supports exactly one SELECT expression."); } SelectExpression expression = statements.getFirst(); @@ -356,7 +356,8 @@ private SelectExpression validateCompositionSelect(PreparedAdHocQuery preparedQu if (identifiedPath.getPath() != null && identifiedPath.getPath().getPathNodes() != null && !identifiedPath.getPath().getPathNodes().isEmpty()) { - throw new InvalidApiParameterException("Composition query must select the composition root without sub-paths."); + throw new InvalidApiParameterException( + "Composition query must select the composition root without sub-paths."); } AbstractContainmentExpression root = identifiedPath.getRoot(); @@ -372,10 +373,11 @@ private SelectExpression validateCompositionSelect(PreparedAdHocQuery preparedQu } private CompositionQueryResponse toCompositionResponse( - PreparedAdHocQuery preparedQuery, QueryResultDto result, CompositionRepresentation representation) { + PreparedAdHocQuery preparedQuery, QueryResultDto result, CompositionRepresentation representation) { MetaData meta = aqlQueryContext.createMetaData(null); - List resultSet = Optional.ofNullable(result.getResultSet()).orElse(List.of()); + List resultSet = + Optional.ofNullable(result.getResultSet()).orElse(List.of()); List rows = new ArrayList<>(resultSet.size()); for (ResultHolder holder : resultSet) { @@ -394,11 +396,12 @@ private CompositionQueryResponse toCompositionResponse( } private CompositionQueryResponse.CompositionRow buildCompositionRow( - Composition composition, CompositionRepresentation representation) { + Composition composition, CompositionRepresentation representation) { ObjectVersionId versionId = composition.getUid() instanceof ObjectVersionId id ? id : null; UUID compositionId = extractCompositionId(versionId); - String versionUid = Optional.ofNullable(versionId).map(ObjectVersionId::getValue).orElse(null); + String versionUid = + Optional.ofNullable(versionId).map(ObjectVersionId::getValue).orElse(null); Integer version = extractVersion(versionId); String templateId = resolveTemplateId(composition, compositionId); @@ -414,16 +417,10 @@ private CompositionQueryResponse.CompositionRow buildCompositionRow( CompositionDto dto = new CompositionDto(composition, templateId, compositionId, null); StructuredString serialized = compositionService.serialize(dto, representation.format); - Object content = deserializeCompositionContent(serialized, representation); + Object content = deserializeCompositionContent(serialized, representation); - return new CompositionQueryResponse.CompositionRow( - ehrId, - versionUid, - version, - templateId, - representation.format.name(), - content - ); + return new CompositionQueryResponse.CompositionRow( + ehrId, versionUid, version, templateId, representation.format.name(), content); } private UUID extractCompositionId(ObjectVersionId versionId) { diff --git a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/dto/CompositionQueryResponse.java b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/dto/CompositionQueryResponse.java index 69ccd4ac4..053e93061 100644 --- a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/dto/CompositionQueryResponse.java +++ b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/dto/CompositionQueryResponse.java @@ -1,3 +1,20 @@ +/* + * Copyright (c) 2025 vitasystems GmbH. + * + * This file is part of project EHRbase + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.ehrbase.rest.openehr.dto; import java.util.List; @@ -7,14 +24,8 @@ /** * Response payload for the composition-specific AQL endpoint. */ -public record CompositionQueryResponse( - MetaData meta, String query, List compositions) { +public record CompositionQueryResponse(MetaData meta, String query, List compositions) { public record CompositionRow( - UUID ehrId, - String compositionUid, - Integer version, - String templateId, - String format, - Object content) {} -} \ No newline at end of file + UUID ehrId, String compositionUid, Integer version, String templateId, String format, Object content) {} +} diff --git a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/specification/CompositionApiSpecification.java b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/specification/CompositionApiSpecification.java index 557ded2ee..409b284a9 100644 --- a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/specification/CompositionApiSpecification.java +++ b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/specification/CompositionApiSpecification.java @@ -35,7 +35,7 @@ public interface CompositionApiSpecification { @ExternalDocumentation( url = "https://specifications.openehr.org/releases/ITS-REST/latest/ehr.html#composition-composition-post")) - ResponseEntity createComposition( + ResponseEntity createComposition( String openehrVersion, String openehrAuditDetails, String contentType, @@ -58,7 +58,7 @@ ResponseEntity createComposition( @ExternalDocumentation( url = "https://specifications.openehr.org/releases/ITS-REST/latest/ehr.html#composition-composition-put")) - ResponseEntity updateComposition( + ResponseEntity updateComposition( String openehrVersion, String openehrAuditDetails, String contentType, @@ -83,7 +83,7 @@ ResponseEntity updateComposition( @ExternalDocumentation( url = "https://specifications.openehr.org/releases/ITS-REST/latest/ehr.html#composition-composition-delete")) - ResponseEntity deleteComposition( + ResponseEntity deleteComposition( String openehrVersion, String openehrAuditDetails, String ehrIdString, String precedingVersionUid); @Operation( @@ -92,7 +92,7 @@ ResponseEntity deleteComposition( @ExternalDocumentation( url = "https://specifications.openehr.org/releases/ITS-REST/latest/ehr.html#composition-composition-get")) - ResponseEntity getComposition( + ResponseEntity getComposition( String accept, String ehrIdString, String versionedObjectUid, @@ -105,42 +105,36 @@ ResponseEntity getComposition( String format, String versionAtTime); - @Operation( - summary = "Validate composition" - ) + @Operation(summary = "Validate composition") ResponseEntity validateComposition( String contentType, String accept, String templateId, @Parameter( - description = "Composition format", - schema = - @Schema( - type = "string", - allowableValues = {"JSON", "XML", "STRUCTURED", "FLAT"})) - String format, + description = "Composition format", + schema = + @Schema( + type = "string", + allowableValues = {"JSON", "XML", "STRUCTURED", "FLAT"})) + String format, String composition); - @Operation( - summary = "Preview uncommited composition representing database records" - ) - ResponseEntity> previewComposition( + @Operation(summary = "Preview uncommited composition representing database records") + ResponseEntity> previewComposition( String contentType, String accept, String ehrIdString, String templateId, @Parameter( - description = "Composition format", - schema = - @Schema( - type = "string", - allowableValues = {"JSON", "XML", "STRUCTURED", "FLAT"})) - String format, + description = "Composition format", + schema = + @Schema( + type = "string", + allowableValues = {"JSON", "XML", "STRUCTURED", "FLAT"})) + String format, String composition); - @Operation( - summary = "Preview updated composition representing database records" - ) + @Operation(summary = "Preview updated composition representing database records") ResponseEntity> previewUpdatedComposition( String contentType, String accept, @@ -149,11 +143,11 @@ ResponseEntity> previewUpdatedComposition( String versionedObjectUidString, String templateId, @Parameter( - description = "Composition format", - schema = - @Schema( - type = "string", - allowableValues = {"JSON", "XML", "STRUCTURED", "FLAT"})) - String format, + description = "Composition format", + schema = + @Schema( + type = "string", + allowableValues = {"JSON", "XML", "STRUCTURED", "FLAT"})) + String format, String composition); } diff --git a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/specification/QueryApiSpecification.java b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/specification/QueryApiSpecification.java index 06f5e1264..7ed45ca29 100644 --- a/rest-openehr/src/main/java/org/ehrbase/rest/openehr/specification/QueryApiSpecification.java +++ b/rest-openehr/src/main/java/org/ehrbase/rest/openehr/specification/QueryApiSpecification.java @@ -73,12 +73,16 @@ ResponseEntity executeAdHocQuery( url = "https://specifications.openehr.org/releases/ITS-REST/latest/query.html#query-execute-query-post")) ResponseEntity executeCompositionQuery( - Map queryRequest, @Parameter( - description = "Composition format", - schema = - @Schema( - type = "string", - allowableValues = {"JSON", "STRUCTURED", "FLAT"})) String format, String accept, String contentType); + Map queryRequest, + @Parameter( + description = "Composition format", + schema = + @Schema( + type = "string", + allowableValues = {"JSON", "STRUCTURED", "FLAT"})) + String format, + String accept, + String contentType); /** * Execute stored query. diff --git a/rest-openehr/src/test/java/org/ehrbase/rest/openehr/OpenehrCompositionControllerTest.java b/rest-openehr/src/test/java/org/ehrbase/rest/openehr/OpenehrCompositionControllerTest.java index b647a67ca..b2b586a65 100644 --- a/rest-openehr/src/test/java/org/ehrbase/rest/openehr/OpenehrCompositionControllerTest.java +++ b/rest-openehr/src/test/java/org/ehrbase/rest/openehr/OpenehrCompositionControllerTest.java @@ -99,15 +99,17 @@ void previewUpdatedCompositionRejectsMismatchedUid() { doReturn(composition).when(compositionService).buildComposition(body, CompositionFormat.JSON, null); - assertThrows(PreconditionFailedException.class, () -> controller.previewUpdatedComposition( - MediaType.APPLICATION_JSON_VALUE, - null, - ifMatch, - ehrId.toString(), - versionedObjectId.toString(), - null, - CompositionFormat.JSON.name(), - body)); + assertThrows( + PreconditionFailedException.class, + () -> controller.previewUpdatedComposition( + MediaType.APPLICATION_JSON_VALUE, + null, + ifMatch, + ehrId.toString(), + versionedObjectId.toString(), + null, + CompositionFormat.JSON.name(), + body)); verify(compositionService, never()).previewUpdatedCompDataRecords(any(), any(), any()); } diff --git a/rest-openehr/src/test/java/org/ehrbase/rest/openehr/OpenehrQueryControllerTest.java b/rest-openehr/src/test/java/org/ehrbase/rest/openehr/OpenehrQueryControllerTest.java index 45ea0a2b7..b31bd88fb 100644 --- a/rest-openehr/src/test/java/org/ehrbase/rest/openehr/OpenehrQueryControllerTest.java +++ b/rest-openehr/src/test/java/org/ehrbase/rest/openehr/OpenehrQueryControllerTest.java @@ -54,6 +54,8 @@ import org.ehrbase.openehr.sdk.response.dto.ehrscape.QueryResultDto; import org.ehrbase.openehr.sdk.response.dto.ehrscape.StructuredString; import org.ehrbase.openehr.sdk.response.dto.ehrscape.StructuredStringFormat; +import org.ehrbase.openehr.sdk.response.dto.ehrscape.query.ResultHolder; +import org.ehrbase.rest.openehr.dto.CompositionQueryResponse; import org.ehrbase.rest.util.OpenEhrQueryRequestUtils; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -65,8 +67,6 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.context.request.RequestContextHolder; -import org.ehrbase.openehr.sdk.response.dto.ehrscape.query.ResultHolder; -import org.ehrbase.rest.openehr.dto.CompositionQueryResponse; public class OpenehrQueryControllerTest { @@ -83,15 +83,12 @@ public class OpenehrQueryControllerTest { private final AqlQueryContext mockQueryContext = mock(); private final OpenehrQueryController spyController = spy(new OpenehrQueryController( - mockAqlQueryService, - mockStoredQueryService, - mockQueryContext, - mockCompositionService, - new ObjectMapper())); + mockAqlQueryService, mockStoredQueryService, mockQueryContext, mockCompositionService, new ObjectMapper())); @BeforeEach void setUp() { - Mockito.reset(mockAqlQueryService, mockStoredQueryService, mockCompositionService, mockQueryContext, spyController); + Mockito.reset( + mockAqlQueryService, mockStoredQueryService, mockCompositionService, mockQueryContext, spyController); doReturn("https://openehr.test.query.controller.com/rest") .when(spyController) .getContextPath(); @@ -326,43 +323,43 @@ void executeCompositionQueryReturnsSerializedResult() { verify(mockCompositionService).getEhrIdForComposition(compositionId); } - @Test - void executeCompositionQueryReturnsXmlContentUnchanged() { - OpenehrQueryController controller = controller(); + @Test + void executeCompositionQueryReturnsXmlContentUnchanged() { + OpenehrQueryController controller = controller(); - UUID compositionId = UUID.randomUUID(); - ObjectVersionId versionId = new ObjectVersionId(compositionId + "::ehrbase::1"); - UUID ehrId = UUID.randomUUID(); - String templateId = "test-template"; + UUID compositionId = UUID.randomUUID(); + ObjectVersionId versionId = new ObjectVersionId(compositionId + "::ehrbase::1"); + UUID ehrId = UUID.randomUUID(); + String templateId = "test-template"; - Composition composition = mock(Composition.class); - doReturn(versionId).when(composition).getUid(); - doReturn(templateId).when(mockCompositionService).retrieveTemplateId(compositionId); - doReturn(Optional.of(ehrId)).when(mockCompositionService).getEhrIdForComposition(compositionId); + Composition composition = mock(Composition.class); + doReturn(versionId).when(composition).getUid(); + doReturn(templateId).when(mockCompositionService).retrieveTemplateId(compositionId); + doReturn(Optional.of(ehrId)).when(mockCompositionService).getEhrIdForComposition(compositionId); - ResultHolder holder = new ResultHolder(); - holder.putResult("alias", composition); + ResultHolder holder = new ResultHolder(); + holder.putResult("alias", composition); - QueryResultDto dto = new QueryResultDto(); - dto.setResultSet(List.of(holder)); - doReturn(dto).when(mockAqlQueryService).query(any()); + QueryResultDto dto = new QueryResultDto(); + dto.setResultSet(List.of(holder)); + doReturn(dto).when(mockAqlQueryService).query(any()); - StructuredString serialized = new StructuredString("", StructuredStringFormat.XML); - doReturn(serialized).when(mockCompositionService).serialize(any(), any()); + StructuredString serialized = new StructuredString("", StructuredStringFormat.XML); + doReturn(serialized).when(mockCompositionService).serialize(any(), any()); - Map requestBody = Map.of("q", "SELECT c FROM COMPOSITION c"); + Map requestBody = Map.of("q", "SELECT c FROM COMPOSITION c"); - ResponseEntity response = controller.executeCompositionQuery( - requestBody, null, MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE); + ResponseEntity response = controller.executeCompositionQuery( + requestBody, null, MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE); - CompositionQueryResponse body = response.getBody(); - assertNotNull(body); - assertThat(body.compositions()).singleElement().satisfies(row -> { - assertThat(row.ehrId()).isEqualTo(ehrId); - assertThat(row.content()).isEqualTo(serialized.getValue()); - assertThat(row.format()).isEqualTo("XML"); - }); - } + CompositionQueryResponse body = response.getBody(); + assertNotNull(body); + assertThat(body.compositions()).singleElement().satisfies(row -> { + assertThat(row.ehrId()).isEqualTo(ehrId); + assertThat(row.content()).isEqualTo(serialized.getValue()); + assertThat(row.format()).isEqualTo("XML"); + }); + } @Test void executeCompositionQueryRejectsNonCompositionResult() { @@ -396,9 +393,7 @@ void executeCompositionQueryRejectsSubPathSelection() { () -> controller.executeCompositionQuery( requestBody, null, MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_JSON_VALUE)); - assertEquals( - "Composition query must select the composition root without sub-paths.", - exception.getMessage()); + assertEquals("Composition query must select the composition root without sub-paths.", exception.getMessage()); } @Test diff --git a/service/src/main/java/org/ehrbase/repository/CompositionRepository.java b/service/src/main/java/org/ehrbase/repository/CompositionRepository.java index f2976eccc..3cae2b2d2 100644 --- a/service/src/main/java/org/ehrbase/repository/CompositionRepository.java +++ b/service/src/main/java/org/ehrbase/repository/CompositionRepository.java @@ -126,14 +126,14 @@ public VersionCommitPreview previewVersionData( Optional.ofNullable(changeType).orElse(ContributionChangeType.creation); // Create uncommited audit detail record for contribution - AuditDetailsRecord contributionAudit = contributionRepository.newAuditDetailsRecord( - effectiveChangeType, AuditDetailsTargetType.CONTRIBUTION); + AuditDetailsRecord contributionAudit = + contributionRepository.newAuditDetailsRecord(effectiveChangeType, AuditDetailsTargetType.CONTRIBUTION); // Create uncommited contribution record ContributionRecord contributionRecord = contributionRepository.newContributionRecord( ehrId, UuidGenerator.randomUUID(), ContributionDataType.composition, contributionAudit.getId()); // Create uncommited audit record for composition - AuditDetailsRecord compositionAudit = contributionRepository.newAuditDetailsRecord( - effectiveChangeType, AuditDetailsTargetType.COMPOSITION); + AuditDetailsRecord compositionAudit = + contributionRepository.newAuditDetailsRecord(effectiveChangeType, AuditDetailsTargetType.COMPOSITION); // Construct composition to db record representation VersionDataDbRecord versionData = VersionDataDbRecord.toRecords( ehrId, diff --git a/service/src/main/java/org/ehrbase/repository/ContributionRepository.java b/service/src/main/java/org/ehrbase/repository/ContributionRepository.java index c81822d76..541fbb70f 100644 --- a/service/src/main/java/org/ehrbase/repository/ContributionRepository.java +++ b/service/src/main/java/org/ehrbase/repository/ContributionRepository.java @@ -107,7 +107,8 @@ public UUID createDefaultAudit(ContributionChangeType contributionChangeType, Au @Transactional public UUID createContribution( UUID ehrId, UUID contributionUuid, ContributionDataType contributionType, UUID auditDetailsRecordId) { - ContributionRecord contributionRecord = newContributionRecord(ehrId, contributionUuid, contributionType, auditDetailsRecordId); + ContributionRecord contributionRecord = + newContributionRecord(ehrId, contributionUuid, contributionType, auditDetailsRecordId); contributionRecord.store(); return contributionRecord.getId(); @@ -214,7 +215,8 @@ private com.nedap.archie.rm.generic.AuditDetails mapToAuditDetails(AuditDetailsR return auditDetails; } - public AuditDetailsRecord newAuditDetailsRecord(ContributionChangeType contributionChangeType, AuditDetailsTargetType targetType) { + public AuditDetailsRecord newAuditDetailsRecord( + ContributionChangeType contributionChangeType, AuditDetailsTargetType targetType) { AuditDetailsRecord auditDetailsRecord = context.newRecord(AuditDetails.AUDIT_DETAILS); auditDetailsRecord.setId(UuidGenerator.randomUUID()); @@ -228,7 +230,8 @@ public AuditDetailsRecord newAuditDetailsRecord(ContributionChangeType contribut return auditDetailsRecord; } - public ContributionRecord newContributionRecord(UUID ehrId, UUID contributionUuid, ContributionDataType contributionType, UUID auditDetailsRecordId) { + public ContributionRecord newContributionRecord( + UUID ehrId, UUID contributionUuid, ContributionDataType contributionType, UUID auditDetailsRecordId) { ContributionRecord contributionRecord = context.newRecord(Contribution.CONTRIBUTION); contributionRecord.setEhrId(ehrId); diff --git a/service/src/main/java/org/ehrbase/service/CompositionServiceImp.java b/service/src/main/java/org/ehrbase/service/CompositionServiceImp.java index 9dc2c9d2d..d41af1783 100644 --- a/service/src/main/java/org/ehrbase/service/CompositionServiceImp.java +++ b/service/src/main/java/org/ehrbase/service/CompositionServiceImp.java @@ -52,9 +52,9 @@ import org.ehrbase.api.service.EhrService; import org.ehrbase.api.service.SystemService; import org.ehrbase.api.service.ValidationService; +import org.ehrbase.jooq.pg.enums.ContributionChangeType; import org.ehrbase.jooq.pg.tables.records.AuditDetailsRecord; import org.ehrbase.jooq.pg.tables.records.ContributionRecord; -import org.ehrbase.jooq.pg.enums.ContributionChangeType; import org.ehrbase.openehr.dbformat.StructureNode; import org.ehrbase.openehr.dbformat.VersionedObjectDataStructure; import org.ehrbase.openehr.sdk.response.dto.ehrscape.CompositionDto; @@ -267,8 +267,7 @@ private void ensureTemplateCompatibility(UUID compId, Composition composition) { int inputTemplateIdVersion = Integer.parseInt(inputTemplateId.substring(inputTemplateId.lastIndexOf("\\.v") + 1)); if (inputTemplateIdVersion < existingTemplateIdVersion) { - throw new InvalidApiParameterException( - "Can't update composition with wrong template version bump."); + throw new InvalidApiParameterException("Can't update composition with wrong template version bump."); } } } @@ -439,8 +438,8 @@ public Map previewUpdatedCompDataRecords( composition.setUid(buildObjectVersionId(compId, version + 1, systemService)); - VersionCommitPreview preview = compositionRepository.previewVersionData( - ehrId, composition, ContributionChangeType.modification); + VersionCommitPreview preview = + compositionRepository.previewVersionData(ehrId, composition, ContributionChangeType.modification); return buildPreviewResponse(composition, preview); } @@ -453,7 +452,8 @@ private Map buildPreviewResponse(Composition composition, Versio String templateId = Optional.ofNullable(composition.getArchetypeDetails()) .map(details -> details.getTemplateId().getValue()) .orElseThrow(() -> new ValidationException("Composition missing template id")); - UUID templateUuid = knowledgeCacheService.findUuidByTemplateId(templateId) + UUID templateUuid = knowledgeCacheService + .findUuidByTemplateId(templateId) .orElseThrow(() -> new ValidationException("Unknown or missing template %s".formatted(templateId))); versionPayload.put("ehr_id", versionRecord.getEhrId()); @@ -464,7 +464,9 @@ private Map buildPreviewResponse(Composition composition, Versio versionPayload.put("audit_id", versionRecord.getAuditId()); versionPayload.put("template_id", templateUuid); - List> dataPayload = versionData.dataRecords().get() + List> dataPayload = versionData + .dataRecords() + .get() .map(entry -> { StructureNode node = entry.getLeft(); var dataRecord = entry.getRight();