diff --git a/src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/infrastructure/ckan/persistence/CkanDatasetsRepository.java b/src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/infrastructure/ckan/persistence/CkanDatasetsRepository.java index b8f4686..87b1a5d 100644 --- a/src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/infrastructure/ckan/persistence/CkanDatasetsRepository.java +++ b/src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/infrastructure/ckan/persistence/CkanDatasetsRepository.java @@ -16,7 +16,11 @@ import org.eclipse.microprofile.rest.client.inject.RestClient; import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Objects; import java.util.Set; @@ -25,6 +29,8 @@ import static io.github.genomicdatainfrastructure.discovery.datasets.infrastructure.ckan.config.CkanConfiguration.CKAN_IDENTIFIER_FIELD; import static java.util.Optional.ofNullable; +// TODO review original field and date format on resources +// TODO remove retrieved distributions from API @ApplicationScoped public class CkanDatasetsRepository implements DatasetsRepository { @@ -109,8 +115,8 @@ private SearchedDataset result(CkanPackage dataset) { .keywords(keywords(dataset.getTags())) .catalogue(catalogue) .organization(DatasetOrganizationMapper.from(dataset.getOrganization())) - .modifiedAt(parse(dataset.getMetadataModified())) - .createdAt(parse(dataset.getMetadataCreated())) + .modifiedAt(parse(dataset.getModified())) + .createdAt(parse(dataset.getIssued())) .distributions(distributions(dataset.getResources())) .build(); } @@ -148,10 +154,18 @@ private ValueLabel value(CkanValueLabel value) { .orElse(null); } - private LocalDateTime parse(String date) { - return ofNullable(date) - .map(it -> LocalDateTime.parse(it, DATE_FORMATTER)) - .orElse(null); + private OffsetDateTime parse(String date) { + if (date == null) { + return null; + } + + try { + return OffsetDateTime.parse(date); + } catch (DateTimeParseException e) { + return LocalDateTime.parse(date, DATE_FORMATTER) + .truncatedTo(ChronoUnit.SECONDS) + .atOffset(ZoneOffset.UTC); + } } private List distributions(List resources) { diff --git a/src/main/java/io/github/genomicdatainfrastructure/discovery/utils/PackageShowMapper.java b/src/main/java/io/github/genomicdatainfrastructure/discovery/utils/PackageShowMapper.java index 64fd442..864e053 100644 --- a/src/main/java/io/github/genomicdatainfrastructure/discovery/utils/PackageShowMapper.java +++ b/src/main/java/io/github/genomicdatainfrastructure/discovery/utils/PackageShowMapper.java @@ -8,7 +8,11 @@ import static java.util.function.Predicate.*; import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Objects; @@ -16,10 +20,12 @@ import io.github.genomicdatainfrastructure.discovery.remote.ckan.model.*; import lombok.experimental.UtilityClass; +// TODO review original field and date format on resources +// TODO Remove duplicated code @UtilityClass public class PackageShowMapper { - private final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern( + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern( "yyyy-MM-dd'T'HH:mm:ss.SSSSSS" ); @@ -37,8 +43,8 @@ public RetrievedDataset from(CkanPackage ckanPackage) { .publisherName(ckanPackage.getPublisherName()) .catalogue(catalogue) .organization(DatasetOrganizationMapper.from(ckanPackage.getOrganization())) - .createdAt(parse(ckanPackage.getMetadataCreated())) - .modifiedAt(parse(ckanPackage.getMetadataModified())) + .createdAt(parse(ckanPackage.getIssued())) + .modifiedAt(parse(ckanPackage.getModified())) .url(ckanPackage.getUrl()) .languages(values(ckanPackage.getLanguage())) .contact(value(ckanPackage.getContactUri())) @@ -150,10 +156,18 @@ private ValueLabel creator(CkanCreator creator) { .build(); } - private LocalDateTime parse(String date) { - return ofNullable(date) - .map(it -> LocalDateTime.parse(it, DATE_FORMATTER)) - .orElse(null); + private OffsetDateTime parse(String date) { + if (date == null) { + return null; + } + + try { + return OffsetDateTime.parse(date); + } catch (DateTimeParseException e) { + return LocalDateTime.parse(date, DATE_FORMATTER) + .truncatedTo(ChronoUnit.SECONDS) + .atOffset(ZoneOffset.UTC); + } } private List distributions(CkanPackage ckanPackage) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 38e9e82..f0650cf 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -13,8 +13,8 @@ quarkus.openapi-generator.codegen.spec.discovery_yaml.additional-model-type-anno quarkus.openapi-generator.codegen.spec.discovery_yaml.base-package=io.github.genomicdatainfrastructure.discovery quarkus.openapi-generator.codegen.spec.discovery_yaml.import-mappings.File=org.jboss.resteasy.reactive.multipart.FileUpload quarkus.openapi-generator.codegen.spec.discovery_yaml.type-mappings.File=FileUpload -quarkus.openapi-generator.codegen.spec.discovery_yaml.type-mappings.DateTime=LocalDateTime -quarkus.openapi-generator.codegen.spec.discovery_yaml.import-mappings.LocalDateTime=java.time.LocalDateTime +quarkus.openapi-generator.codegen.spec.discovery_yaml.type-mappings.DateTime=OffsetDateTime +quarkus.openapi-generator.codegen.spec.discovery_yaml.import-mappings.LocalDateTime=java.time.OffsetDateTime quarkus.openapi-generator.codegen.spec.discovery_yaml.return-response=true quarkus.openapi-generator.codegen.spec.ckan_yaml.enable-security-generation=false quarkus.openapi-generator.codegen.spec.ckan_yaml.base-package=io.github.genomicdatainfrastructure.discovery.remote.ckan diff --git a/src/test/java/io/github/genomicdatainfrastructure/discovery/services/PackageShowMapperTest.java b/src/test/java/io/github/genomicdatainfrastructure/discovery/services/PackageShowMapperTest.java index ccb8a19..be9eb53 100644 --- a/src/test/java/io/github/genomicdatainfrastructure/discovery/services/PackageShowMapperTest.java +++ b/src/test/java/io/github/genomicdatainfrastructure/discovery/services/PackageShowMapperTest.java @@ -4,10 +4,9 @@ package io.github.genomicdatainfrastructure.discovery.services; -import static java.time.LocalDateTime.*; +import static java.time.OffsetDateTime.*; import static org.assertj.core.api.Assertions.*; -import java.time.format.DateTimeFormatter; import java.util.List; import org.junit.jupiter.api.Test; @@ -18,10 +17,6 @@ class PackageShowMapperTest { - private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern( - "yyyy-MM-dd'T'HH:mm:ss.SSSSSS" - ); - @Test void accepts_empty_package() { var ckanPackage = CkanPackage.builder().build(); @@ -62,10 +57,8 @@ void can_parse() { .description("description") .imageUrl("https://image.com") .build()) - .issued("2024-03-19T13:37:05Z") - .modified("2024-03-19T13:37:05Z") - .metadataCreated("2024-03-19T13:37:05.472970") - .metadataModified("2024-03-19T13:37:05.472970") + .issued("2024-07-01T22:00:00+00:00") + .modified("2024-07-02T22:00:00Z") .tags(List.of(CkanTag.builder() .displayName("key-tag") .id("tag-id") @@ -107,8 +100,8 @@ void can_parse() { .name("pdf") .build()) .uri("uri") - .created("2024-03-19T13:37:05.472970") - .lastModified("2024-03-19T13:37:05.472970") + .created("2025-03-19T13:37:05.472970") + .lastModified("2025-03-19T13:37:05Z") .build())) .contactPoint(List.of( CkanContactPoint.builder() @@ -150,8 +143,8 @@ void can_parse() { .build())) .publisherName("publisherName") .catalogue("organization") - .createdAt(parse("2024-03-19T13:37:05.472970", DATE_FORMATTER)) - .modifiedAt(parse("2024-03-19T13:37:05.472970", DATE_FORMATTER)) + .createdAt(parse("2024-07-01T22:00:00+00:00")) + .modifiedAt(parse("2024-07-02T22:00:00+00:00")) .url("url") .languages(List.of( ValueLabel.builder() @@ -201,13 +194,13 @@ void can_parse() { .id("resource_id") .title("resource_name") .description("resource_description") + .createdAt(parse("2025-03-19T13:37:05Z")) + .modifiedAt(parse("2025-03-19T13:37:05Z")) .format(ValueLabel.builder() .value("pdf") .label("format") .build()) .uri("uri") - .createdAt(parse("2024-03-19T13:37:05.472970", DATE_FORMATTER)) - .modifiedAt(parse("2024-03-19T13:37:05.472970", DATE_FORMATTER)) .build())) .contacts(List.of( ContactPoint.builder()