From 0a17246001f1ad3dad007d4b8c9eb6f596e3957d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Tue, 15 Apr 2025 16:11:01 +0200 Subject: [PATCH 1/7] Fix editing schema --- CHANGELOG.md | 1 + .../api/controller/exception/ExceptionControllerAdvice.java | 1 + .../fairdatapoint/service/schema/MetadataSchemaMapper.java | 6 +++++- .../fairdatapoint/service/schema/MetadataSchemaService.java | 2 ++ .../java/org/fairdatapoint/acceptance/schema/Common.java | 2 +- 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7735441df..5a19c3de6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Prevent duplicate workflow runs by @dennisvang in #628 - Clean up Dockerfile by @dennisvang in #626 - Fix index API by @dennisvang in #637 (backward incompatible) +- Fix saving metadata schema (draft and publish) by @MarekSuchanek in #XXX ## [1.17.2] diff --git a/src/main/java/org/fairdatapoint/api/controller/exception/ExceptionControllerAdvice.java b/src/main/java/org/fairdatapoint/api/controller/exception/ExceptionControllerAdvice.java index 6178473d0..dc6f1648c 100644 --- a/src/main/java/org/fairdatapoint/api/controller/exception/ExceptionControllerAdvice.java +++ b/src/main/java/org/fairdatapoint/api/controller/exception/ExceptionControllerAdvice.java @@ -76,6 +76,7 @@ public class ExceptionControllerAdvice { ) ) public ErrorDTO handleConstraintViolation(Exception exception) { + exception.printStackTrace(); log.warn(exception.getMessage()); log.debug("Handling bad request (ConstraintViolation)", exception); return new ErrorDTO(HttpStatus.BAD_REQUEST, exception.getMessage()); diff --git a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaMapper.java b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaMapper.java index 1a22927df..2a458ee4a 100644 --- a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaMapper.java +++ b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaMapper.java @@ -78,7 +78,7 @@ public MetadataSchemaDraftDTO toDraftDTO( MetadataSchemaVersion draft ) { return MetadataSchemaDraftDTO.builder() - .uuid(draft.getUuid()) + .uuid(draft.getSchema().getUuid()) .name(draft.getName()) .description(draft.getDescription()) .abstractSchema(draft.isAbstractSchema()) @@ -231,6 +231,10 @@ public MetadataSchemaVersion toDraft(MetadataSchemaVersion schema) { .definition(schema.getDefinition()) .suggestedResourceName(schema.getSuggestedResourceName()) .suggestedUrlPrefix(schema.getSuggestedUrlPrefix()) + .schema(schema.getSchema()) + .state(MetadataSchemaState.DRAFT) + .type(MetadataSchemaType.CUSTOM) + .version(schema.getVersion()) .build(); } diff --git a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java index 05e473df1..247596a95 100644 --- a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java +++ b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java @@ -186,6 +186,7 @@ public Optional releaseDraft(UUID uuid, MetadataSchemaRelease if (reqDto.isPublished()) { final List parents = resolveExtends(newLatest); if (!parents.stream().allMatch(MetadataSchemaVersion::isPublished)) { + System.out.println("aaaa"); throw new ValidationException(MSG_ERROR_PARENTS_PUBLISH); } } @@ -237,6 +238,7 @@ public Optional updateVersion( if (!schema.isPublished() && reqDto.isPublished()) { final List parents = resolveExtends(schema); if (!parents.stream().allMatch(MetadataSchemaVersion::isPublished)) { + System.out.println("bbbb"); throw new ValidationException(MSG_ERROR_PARENTS_PUBLISH); } } diff --git a/src/test/java/org/fairdatapoint/acceptance/schema/Common.java b/src/test/java/org/fairdatapoint/acceptance/schema/Common.java index 8c0ea3831..8985c5332 100644 --- a/src/test/java/org/fairdatapoint/acceptance/schema/Common.java +++ b/src/test/java/org/fairdatapoint/acceptance/schema/Common.java @@ -84,7 +84,7 @@ public static void compare(MetadataSchemaVersion entity, MetadataSchemaVersionDT } public static void compare(MetadataSchemaVersion entity, MetadataSchemaDraftDTO dto) { - assertThat(dto.getUuid(), is(equalTo(entity.getUuid()))); + assertThat(dto.getUuid(), is(equalTo(entity.getSchema().getUuid()))); assertThat(dto.getName(), is(equalTo(entity.getName()))); assertThat(dto.getDefinition(), is(equalTo(entity.getDefinition()))); } From 11e35daab2a796acd8adf8f77cd1d38605a934cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Tue, 29 Apr 2025 09:59:26 +0200 Subject: [PATCH 2/7] Cleanup fix branch --- CHANGELOG.md | 2 +- .../api/controller/exception/ExceptionControllerAdvice.java | 1 - .../org/fairdatapoint/service/schema/MetadataSchemaService.java | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a19c3de6..a7178fd96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,7 +18,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Prevent duplicate workflow runs by @dennisvang in #628 - Clean up Dockerfile by @dennisvang in #626 - Fix index API by @dennisvang in #637 (backward incompatible) -- Fix saving metadata schema (draft and publish) by @MarekSuchanek in #XXX +- Fix saving metadata schema (draft and publish) by @MarekSuchanek in #672 ## [1.17.2] diff --git a/src/main/java/org/fairdatapoint/api/controller/exception/ExceptionControllerAdvice.java b/src/main/java/org/fairdatapoint/api/controller/exception/ExceptionControllerAdvice.java index dc6f1648c..6178473d0 100644 --- a/src/main/java/org/fairdatapoint/api/controller/exception/ExceptionControllerAdvice.java +++ b/src/main/java/org/fairdatapoint/api/controller/exception/ExceptionControllerAdvice.java @@ -76,7 +76,6 @@ public class ExceptionControllerAdvice { ) ) public ErrorDTO handleConstraintViolation(Exception exception) { - exception.printStackTrace(); log.warn(exception.getMessage()); log.debug("Handling bad request (ConstraintViolation)", exception); return new ErrorDTO(HttpStatus.BAD_REQUEST, exception.getMessage()); diff --git a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java index 247596a95..05e473df1 100644 --- a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java +++ b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java @@ -186,7 +186,6 @@ public Optional releaseDraft(UUID uuid, MetadataSchemaRelease if (reqDto.isPublished()) { final List parents = resolveExtends(newLatest); if (!parents.stream().allMatch(MetadataSchemaVersion::isPublished)) { - System.out.println("aaaa"); throw new ValidationException(MSG_ERROR_PARENTS_PUBLISH); } } @@ -238,7 +237,6 @@ public Optional updateVersion( if (!schema.isPublished() && reqDto.isPublished()) { final List parents = resolveExtends(schema); if (!parents.stream().allMatch(MetadataSchemaVersion::isPublished)) { - System.out.println("bbbb"); throw new ValidationException(MSG_ERROR_PARENTS_PUBLISH); } } From 48336b0922505feb0185509588a22502653ca760 Mon Sep 17 00:00:00 2001 From: dennisvang <29799340+dennisvang@users.noreply.github.com> Date: Thu, 24 Apr 2025 10:58:59 +0200 Subject: [PATCH 3/7] add test to reproduce #660 --- .../schema/MetadataSchemaServiceTests.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java diff --git a/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java b/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java new file mode 100644 index 000000000..b6b6a54cb --- /dev/null +++ b/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java @@ -0,0 +1,49 @@ +package org.fairdatapoint.service.schema; + +import org.fairdatapoint.Profiles; +import org.fairdatapoint.acceptance.schema.Common; +import org.fairdatapoint.api.dto.schema.MetadataSchemaChangeDTO; +import org.fairdatapoint.api.dto.schema.MetadataSchemaDraftDTO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ActiveProfiles; + +import java.util.ArrayList; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +@ActiveProfiles(Profiles.TESTING) +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@SpringBootTest(properties = {"spring.main.allow-bean-definition-overriding=true"}) +public class MetadataSchemaServiceTests { + @Autowired + private MetadataSchemaService service; + + @Test + @WithMockUser(roles = {"ADMIN"}) + public void changeExistingSchema() throws Exception { + // reproduces #660 + + // GIVEN: existing schema version (without existing draft) and changes to be made + UUID uuid = Common.SCHEMA_SIMPLE_UUID; + MetadataSchemaChangeDTO changeDTO = MetadataSchemaChangeDTO.builder() + .name("test") + .description("") + .definition("") + .abstractSchema(false) + .extendsSchemaUuids(new ArrayList<>()) + .build(); + + // WHEN: changes are applied to existing schema + Optional updatedDraft = service.updateSchemaDraft(uuid, changeDTO); + + // THEN: draft schema is created with updated properties + assertEquals(updatedDraft.map(MetadataSchemaDraftDTO::getName).orElse(""), changeDTO.getName()); + } +} From 29e0b941fec1babf13627a5a4a6a8a0897d645c9 Mon Sep 17 00:00:00 2001 From: dennisvang <29799340+dennisvang@users.noreply.github.com> Date: Tue, 6 May 2025 18:28:45 +0200 Subject: [PATCH 4/7] add license text to new MetadataSchemaServiceTests --- .../schema/MetadataSchemaServiceTests.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java b/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java index b6b6a54cb..30cdc8a0d 100644 --- a/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java +++ b/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java @@ -1,3 +1,25 @@ +/** + * The MIT License + * Copyright © 2016-2024 FAIR Data Team + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package org.fairdatapoint.service.schema; import org.fairdatapoint.Profiles; From 6b219cb10b922a3060a24d6c87a52b5ea636c3e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Wed, 14 May 2025 07:28:52 +0200 Subject: [PATCH 5/7] Update toDraft mapping --- .../service/schema/MetadataSchemaMapper.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaMapper.java b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaMapper.java index 2a458ee4a..466f05f6c 100644 --- a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaMapper.java +++ b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaMapper.java @@ -223,18 +223,14 @@ public MetadataSchemaVersion fromUpdateDTO(MetadataSchemaVersion schema, Metadat } public MetadataSchemaVersion toDraft(MetadataSchemaVersion schema) { - return MetadataSchemaVersion.builder() - .uuid(schema.getUuid()) - .name(schema.getName()) - .description(schema.getDescription()) - .abstractSchema(schema.isAbstractSchema()) - .definition(schema.getDefinition()) - .suggestedResourceName(schema.getSuggestedResourceName()) - .suggestedUrlPrefix(schema.getSuggestedUrlPrefix()) - .schema(schema.getSchema()) + return schema.toBuilder() + .origin(null) + .importedFrom(null) + .previousVersion(schema) .state(MetadataSchemaState.DRAFT) .type(MetadataSchemaType.CUSTOM) - .version(schema.getVersion()) + .createdAt(Instant.now()) + .updatedAt(Instant.now()) .build(); } From f256a39676b6fda9fc646ccbd73dab231078deca Mon Sep 17 00:00:00 2001 From: dennisvang <29799340+dennisvang@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:26:18 +0200 Subject: [PATCH 6/7] comments MetadataSchemaService --- .../service/schema/MetadataSchemaService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java index 05e473df1..01fe3ba66 100644 --- a/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java +++ b/src/main/java/org/fairdatapoint/service/schema/MetadataSchemaService.java @@ -124,19 +124,22 @@ public Optional updateSchemaDraft(UUID uuid, MetadataSch final MetadataSchemaVersion baseDraft; // Check if present if (oDraft.isPresent()) { + // Continue with existing draft baseDraft = oDraft.get(); } else { if (oLatest.isEmpty()) { return empty(); } + // There is no draft yet, so we create a shallow copy of the + // latest schema version to use as the basis for a new draft baseDraft = metadataSchemaMapper.toDraft(oLatest.get()); } - // Validate + // Validate schema extensions metadataSchemaValidator.validateAllExist(reqDto.getExtendsSchemaUuids()); metadataSchemaValidator.validateNoExtendsCycle(uuid, reqDto.getExtendsSchemaUuids()); final List extendedSchemas = getAll(reqDto.getExtendsSchemaUuids()); - // Save + // Save draft version final MetadataSchemaVersion updatedDraft = versionRepository.saveAndFlush( metadataSchemaMapper.fromChangeDTO(reqDto, baseDraft) ); From 8a4df2abe9b8768d6a3f0fd0fe4676e728d43261 Mon Sep 17 00:00:00 2001 From: dennisvang <29799340+dennisvang@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:29:19 +0200 Subject: [PATCH 7/7] refactor test for updateSchemaDraft --- .../schema/MetadataSchemaServiceTests.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java b/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java index 30cdc8a0d..0d445a0f0 100644 --- a/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java +++ b/src/test/java/org/fairdatapoint/service/schema/MetadataSchemaServiceTests.java @@ -26,6 +26,8 @@ import org.fairdatapoint.acceptance.schema.Common; import org.fairdatapoint.api.dto.schema.MetadataSchemaChangeDTO; import org.fairdatapoint.api.dto.schema.MetadataSchemaDraftDTO; +import org.fairdatapoint.database.db.repository.MetadataSchemaVersionRepository; +import org.fairdatapoint.entity.schema.MetadataSchemaVersion; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; @@ -33,11 +35,10 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ActiveProfiles; -import java.util.ArrayList; -import java.util.Optional; +import java.util.List; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; @ActiveProfiles(Profiles.TESTING) @@ -47,25 +48,32 @@ public class MetadataSchemaServiceTests { @Autowired private MetadataSchemaService service; + @Autowired + private MetadataSchemaVersionRepository versionRepository; + @Test @WithMockUser(roles = {"ADMIN"}) - public void changeExistingSchema() throws Exception { + public void testChangeExistingSchema() throws Exception { // reproduces #660 // GIVEN: existing schema version (without existing draft) and changes to be made - UUID uuid = Common.SCHEMA_SIMPLE_UUID; + UUID schemaUuid = Common.SCHEMA_SIMPLE_UUID; MetadataSchemaChangeDTO changeDTO = MetadataSchemaChangeDTO.builder() - .name("test") - .description("") - .definition("") .abstractSchema(false) - .extendsSchemaUuids(new ArrayList<>()) + .definition("") + .description("") + .extendsSchemaUuids(List.of()) + .name("test") + .suggestedResourceName(null) + .suggestedUrlPrefix(null) .build(); // WHEN: changes are applied to existing schema - Optional updatedDraft = service.updateSchemaDraft(uuid, changeDTO); + MetadataSchemaDraftDTO updatedDraft = service.updateSchemaDraft(schemaUuid, changeDTO).orElseThrow(); // THEN: draft schema is created with updated properties - assertEquals(updatedDraft.map(MetadataSchemaDraftDTO::getName).orElse(""), changeDTO.getName()); + MetadataSchemaVersion draftVersion = versionRepository.getDraftBySchemaUuid(schemaUuid).orElseThrow(); + assertEquals(updatedDraft.getName(), changeDTO.getName()); + assertEquals(updatedDraft.getName(), draftVersion.getName()); } }