diff --git a/search-service/config/detekt/baseline.xml b/search-service/config/detekt/baseline.xml index 0ee11ab05..06b12920f 100644 --- a/search-service/config/detekt/baseline.xml +++ b/search-service/config/detekt/baseline.xml @@ -12,21 +12,25 @@ LongMethod:EntityAccessControlHandler.kt$EntityAccessControlHandler$@PostMapping("/{subjectId}/attrs", consumes = [MediaType.APPLICATION_JSON_VALUE, JSON_LD_CONTENT_TYPE]) suspend fun addRightsOnEntities( @RequestHeader httpHeaders: HttpHeaders, @PathVariable subjectId: String, @RequestBody requestBody: Mono<String> ): ResponseEntity<*> LongMethod:PatchAttributeTests.kt$PatchAttributeTests.Companion$@JvmStatic fun mergePatchProvider(): Stream<Arguments> LongMethod:PatchAttributeTests.kt$PatchAttributeTests.Companion$@JvmStatic fun partialUpdatePatchProvider(): Stream<Arguments> - LongMethod:QueryServiceTests.kt$QueryServiceTests$@Test fun `it should query temporal entities as requested by query params`() - LongMethod:QueryServiceTests.kt$QueryServiceTests$@Test fun `it should return an empty list for an attribute if it has no temporal values`() + LongMethod:TemporalQueryServiceTests.kt$TemporalQueryServiceTests$@Test fun `it should query temporal entities as requested by query params`() + LongMethod:TemporalQueryServiceTests.kt$TemporalQueryServiceTests$@Test fun `it should return an empty list for an attribute if it has no temporal values`() LongMethod:TemporalScopeBuilderTests.kt$TemporalScopeBuilderTests$@Test fun `it should build an aggregated temporal representation of scopes`() LongMethod:V0_29__JsonLd_migration.kt$V0_29__JsonLd_migration$override fun migrate(context: Context) LongParameterList:AttributeInstance.kt$AttributeInstance.Companion$( temporalEntityAttribute: UUID, instanceId: URI = generateRandomInstanceId(), timeAndProperty: Pair<ZonedDateTime, TemporalProperty>, value: Triple<String?, Double?, WKTCoordinates?>, payload: ExpandedAttributeInstance, sub: String? ) LongParameterList:AttributeInstance.kt$AttributeInstance.Companion$( temporalEntityAttribute: UUID, instanceId: URI = generateRandomInstanceId(), timeProperty: TemporalProperty? = TemporalProperty.OBSERVED_AT, modifiedAt: ZonedDateTime? = null, attributeMetadata: AttributeMetadata, payload: ExpandedAttributeInstance, time: ZonedDateTime, sub: String? = null ) + LongParameterList:EntityAttributeService.kt$EntityAttributeService$( entityId: URI, attributeName: ExpandedTerm, attributeMetadata: AttributeMetadata, createdAt: ZonedDateTime, attributePayload: ExpandedAttributeInstance, sub: Sub? ) + LongParameterList:EntityAttributeService.kt$EntityAttributeService$( entityUri: URI, ngsiLdAttributes: List<NgsiLdAttribute>, expandedAttributes: ExpandedAttributes, createdAt: ZonedDateTime, observedAt: ZonedDateTime?, sub: Sub? ) + LongParameterList:EntityAttributeService.kt$EntityAttributeService$( entityUri: URI, ngsiLdAttributes: List<NgsiLdAttribute>, expandedAttributes: ExpandedAttributes, disallowOverwrite: Boolean, createdAt: ZonedDateTime, sub: Sub? ) + LongParameterList:EntityAttributeService.kt$EntityAttributeService$( tea: TemporalEntityAttribute, attributeName: ExpandedTerm, attributeMetadata: AttributeMetadata, mergedAt: ZonedDateTime, observedAt: ZonedDateTime?, attributePayload: ExpandedAttributeInstance, sub: Sub? ) + LongParameterList:EntityAttributeService.kt$EntityAttributeService$( temporalEntityAttribute: TemporalEntityAttribute, ngsiLdAttribute: NgsiLdAttribute, attributeMetadata: AttributeMetadata, createdAt: ZonedDateTime, attributePayload: ExpandedAttributeInstance, sub: Sub? ) LongParameterList:EntityEventService.kt$EntityEventService$( updatedDetails: UpdatedDetails, sub: String?, tenantName: String, entityId: URI, entityTypesAndPayload: Pair<List<ExpandedTerm>, String>, serializedAttribute: Pair<ExpandedTerm, String>, overwrite: Boolean ) - LongParameterList:TemporalEntityAttributeService.kt$TemporalEntityAttributeService$( entityId: URI, attributeName: ExpandedTerm, attributeMetadata: AttributeMetadata, createdAt: ZonedDateTime, attributePayload: ExpandedAttributeInstance, sub: Sub? ) - LongParameterList:TemporalEntityAttributeService.kt$TemporalEntityAttributeService$( entityUri: URI, ngsiLdAttributes: List<NgsiLdAttribute>, expandedAttributes: ExpandedAttributes, createdAt: ZonedDateTime, observedAt: ZonedDateTime?, sub: Sub? ) - LongParameterList:TemporalEntityAttributeService.kt$TemporalEntityAttributeService$( entityUri: URI, ngsiLdAttributes: List<NgsiLdAttribute>, expandedAttributes: ExpandedAttributes, disallowOverwrite: Boolean, createdAt: ZonedDateTime, sub: Sub? ) - LongParameterList:TemporalEntityAttributeService.kt$TemporalEntityAttributeService$( tea: TemporalEntityAttribute, attributeName: ExpandedTerm, attributeMetadata: AttributeMetadata, mergedAt: ZonedDateTime, observedAt: ZonedDateTime?, attributePayload: ExpandedAttributeInstance, sub: Sub? ) - LongParameterList:TemporalEntityAttributeService.kt$TemporalEntityAttributeService$( temporalEntityAttribute: TemporalEntityAttribute, ngsiLdAttribute: NgsiLdAttribute, attributeMetadata: AttributeMetadata, createdAt: ZonedDateTime, attributePayload: ExpandedAttributeInstance, sub: Sub? ) LongParameterList:V0_29__JsonLd_migration.kt$V0_29__JsonLd_migration$( entityId: URI, attributeName: ExpandedTerm, datasetId: URI?, attributePayload: ExpandedAttributeInstance, ngsiLdAttributeInstance: NgsiLdAttributeInstance, defaultCreatedAt: ZonedDateTime ) + MaxLineLength:TemporalEntityHandlerTests.kt$TemporalEntityHandlerTests$coEvery { temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) + MaxLineLength:TemporalEntityOperationsHandlerTests.kt$TemporalEntityOperationsHandlerTests$coEvery { temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) + MaximumLineLength:TemporalEntityHandlerTests.kt$TemporalEntityHandlerTests$ + MaximumLineLength:TemporalEntityOperationsHandlerTests.kt$TemporalEntityOperationsHandlerTests$ NestedBlockDepth:V0_29__JsonLd_migration.kt$V0_29__JsonLd_migration$override fun migrate(context: Context) - SwallowedException:EntitiesQueryUtils.kt$e: IllegalArgumentException + SwallowedException:TemporalQueryUtils.kt$e: IllegalArgumentException TooManyFunctions:EntityPayloadService.kt$EntityPayloadService diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/SearchServiceApplication.kt b/search-service/src/main/kotlin/com/egm/stellio/search/SearchServiceApplication.kt index 3067df6df..f0b10e6a5 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/SearchServiceApplication.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/SearchServiceApplication.kt @@ -5,7 +5,7 @@ import org.springframework.boot.context.properties.ConfigurationPropertiesScan import org.springframework.boot.runApplication @SpringBootApplication(scanBasePackages = ["com.egm.stellio.search", "com.egm.stellio.shared"]) -@ConfigurationPropertiesScan("com.egm.stellio.search.config", "com.egm.stellio.shared.config") +@ConfigurationPropertiesScan("com.egm.stellio.search.common.config", "com.egm.stellio.shared.config") class SearchServiceApplication @Suppress("SpreadOperator") diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/listener/IAMListener.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/listener/IAMListener.kt similarity index 94% rename from search-service/src/main/kotlin/com/egm/stellio/search/listener/IAMListener.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/listener/IAMListener.kt index ad68c4960..ef21964f6 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/listener/IAMListener.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/listener/IAMListener.kt @@ -1,17 +1,17 @@ -package com.egm.stellio.search.listener +package com.egm.stellio.search.authorization.listener import arrow.core.Either import arrow.core.flattenOption import arrow.core.left import arrow.core.raise.either import arrow.core.right -import com.egm.stellio.search.authorization.EntityAccessRightsService -import com.egm.stellio.search.authorization.SubjectReferential -import com.egm.stellio.search.authorization.SubjectReferentialService -import com.egm.stellio.search.authorization.toSubjectInfo -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.service.EntityEventService -import com.egm.stellio.search.service.EntityPayloadService +import com.egm.stellio.search.authorization.model.SubjectReferential +import com.egm.stellio.search.authorization.model.toSubjectInfo +import com.egm.stellio.search.authorization.service.EntityAccessRightsService +import com.egm.stellio.search.authorization.service.SubjectReferentialService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.service.EntityEventService +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.AuthContextModel.AUTH_TERM_IS_MEMBER_OF import com.egm.stellio.shared.util.AuthContextModel.AUTH_TERM_ROLES diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/EntityAccessRights.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/EntityAccessRights.kt similarity index 98% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/EntityAccessRights.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/EntityAccessRights.kt index f222d051c..022110962 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/EntityAccessRights.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/EntityAccessRights.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.model import com.egm.stellio.shared.model.ExpandedAttributeInstances import com.egm.stellio.shared.model.ExpandedTerm diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/Group.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/Group.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/Group.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/Group.kt index a664c6bf1..c9599753c 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/Group.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/Group.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.model import com.egm.stellio.shared.util.AuthContextModel.AUTH_PROP_NAME import com.egm.stellio.shared.util.AuthContextModel.AUTH_REL_IS_MEMBER_OF diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectAccessRight.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/SubjectAccessRight.kt similarity index 80% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectAccessRight.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/SubjectAccessRight.kt index c9e163335..363e757a8 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectAccessRight.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/SubjectAccessRight.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.model import com.egm.stellio.shared.util.AccessRight import java.net.URI diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectReferential.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/SubjectReferential.kt similarity index 92% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectReferential.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/SubjectReferential.kt index 98b15672f..e781e628c 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectReferential.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/SubjectReferential.kt @@ -1,6 +1,6 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.model -import com.egm.stellio.search.util.deserializeAsMap +import com.egm.stellio.search.common.util.deserializeAsMap import com.egm.stellio.shared.util.GlobalRole import com.egm.stellio.shared.util.JsonLdUtils.JSONLD_VALUE_TERM import com.egm.stellio.shared.util.JsonUtils diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/User.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/User.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/User.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/User.kt index 8999a36fd..46cebf398 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/User.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/model/User.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.model import com.egm.stellio.shared.util.AuthContextModel.AUTH_PROP_FAMILY_NAME import com.egm.stellio.shared.util.AuthContextModel.AUTH_PROP_GIVEN_NAME diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/AuthorizationService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/AuthorizationService.kt similarity index 93% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/AuthorizationService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/AuthorizationService.kt index ec2bc3c5c..1aead2e42 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/AuthorizationService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/AuthorizationService.kt @@ -1,8 +1,8 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.Either import arrow.core.Option -import com.egm.stellio.search.model.EntitiesQuery +import com.egm.stellio.search.entity.model.EntitiesQuery import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.ExpandedEntity import com.egm.stellio.shared.util.Sub diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/DisabledAuthorizationService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/DisabledAuthorizationService.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/DisabledAuthorizationService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/DisabledAuthorizationService.kt index dff262042..21da63b1e 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/DisabledAuthorizationService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/DisabledAuthorizationService.kt @@ -1,9 +1,9 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.Either import arrow.core.Option import arrow.core.right -import com.egm.stellio.search.model.EntitiesQuery +import com.egm.stellio.search.entity.model.EntitiesQuery import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.ExpandedEntity import com.egm.stellio.shared.util.Sub diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/EnabledAuthorizationService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/EnabledAuthorizationService.kt similarity index 98% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/EnabledAuthorizationService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/EnabledAuthorizationService.kt index dc21a84eb..4c927d91a 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/EnabledAuthorizationService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/EnabledAuthorizationService.kt @@ -1,9 +1,9 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.* import arrow.core.raise.either import arrow.fx.coroutines.parMap -import com.egm.stellio.search.model.EntitiesQuery +import com.egm.stellio.search.entity.model.EntitiesQuery import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.AccessDeniedException import com.egm.stellio.shared.model.ExpandedEntity diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/EntityAccessRightsService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/EntityAccessRightsService.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/EntityAccessRightsService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/EntityAccessRightsService.kt index f7921a402..3bb1d5838 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/EntityAccessRightsService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/EntityAccessRightsService.kt @@ -1,10 +1,11 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.* import arrow.core.raise.either -import com.egm.stellio.search.authorization.EntityAccessRights.SubjectRightInfo -import com.egm.stellio.search.service.EntityPayloadService -import com.egm.stellio.search.util.* +import com.egm.stellio.search.authorization.model.EntityAccessRights +import com.egm.stellio.search.authorization.model.EntityAccessRights.SubjectRightInfo +import com.egm.stellio.search.common.util.* +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectReferentialService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/SubjectReferentialService.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectReferentialService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/SubjectReferentialService.kt index ba9bbc8dc..5cd0c844f 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/authorization/SubjectReferentialService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/service/SubjectReferentialService.kt @@ -1,10 +1,13 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.Either import arrow.core.Option import arrow.core.Some import arrow.core.getOrElse -import com.egm.stellio.search.util.* +import com.egm.stellio.search.authorization.model.Group +import com.egm.stellio.search.authorization.model.SubjectReferential +import com.egm.stellio.search.authorization.model.User +import com.egm.stellio.search.common.util.* import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.AccessDeniedException import com.egm.stellio.shared.util.* diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/EntityAccessControlHandler.kt b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/web/EntityAccessControlHandler.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/EntityAccessControlHandler.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/authorization/web/EntityAccessControlHandler.kt index 1e4532ebf..a3bacc360 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/EntityAccessControlHandler.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/authorization/web/EntityAccessControlHandler.kt @@ -1,11 +1,15 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.authorization.web import arrow.core.* import arrow.core.raise.either -import com.egm.stellio.search.authorization.* -import com.egm.stellio.search.model.* -import com.egm.stellio.search.service.EntityPayloadService -import com.egm.stellio.search.util.composeEntitiesQuery +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.authorization.service.EntityAccessRightsService +import com.egm.stellio.search.entity.model.NotUpdatedDetails +import com.egm.stellio.search.entity.model.UpdateAttributeResult +import com.egm.stellio.search.entity.model.UpdateOperationResult +import com.egm.stellio.search.entity.model.updateResultFromDetailedResult +import com.egm.stellio.search.entity.service.EntityPayloadService +import com.egm.stellio.search.entity.util.composeEntitiesQuery import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/config/KafkaConfig.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/config/KafkaConfig.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/config/KafkaConfig.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/config/KafkaConfig.kt index dc315993f..1f82df6b5 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/config/KafkaConfig.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/config/KafkaConfig.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.config +package com.egm.stellio.search.common.config import org.springframework.boot.autoconfigure.kafka.ConcurrentKafkaListenerContainerFactoryConfigurer import org.springframework.context.annotation.Bean diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/config/SearchProperties.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/config/SearchProperties.kt similarity index 83% rename from search-service/src/main/kotlin/com/egm/stellio/search/config/SearchProperties.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/config/SearchProperties.kt index 8de9ac5f1..9c7528233 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/config/SearchProperties.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/config/SearchProperties.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.config +package com.egm.stellio.search.common.config import org.springframework.boot.context.properties.ConfigurationProperties diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/config/WebConfig.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/config/WebConfig.kt similarity index 93% rename from search-service/src/main/kotlin/com/egm/stellio/search/config/WebConfig.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/config/WebConfig.kt index b55387b80..8e98dbc65 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/config/WebConfig.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/config/WebConfig.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.config +package com.egm.stellio.search.common.config import org.springframework.context.annotation.Configuration import org.springframework.http.codec.ServerCodecConfigurer diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/Query.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/model/Query.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/Query.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/model/Query.kt index 4c7167977..32ab3d5e5 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/Query.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/model/Query.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.common.model import arrow.core.Either import arrow.core.left diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/support/ApiTestsBootstrapper.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/support/ApiTestsBootstrapper.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/support/ApiTestsBootstrapper.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/support/ApiTestsBootstrapper.kt index 9ef861aa3..cfd605c61 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/support/ApiTestsBootstrapper.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/support/ApiTestsBootstrapper.kt @@ -1,7 +1,7 @@ -package com.egm.stellio.search.support +package com.egm.stellio.search.common.support -import com.egm.stellio.search.authorization.SubjectReferential -import com.egm.stellio.search.authorization.SubjectReferentialService +import com.egm.stellio.search.authorization.model.SubjectReferential +import com.egm.stellio.search.authorization.service.SubjectReferentialService import com.egm.stellio.shared.util.GlobalRole import com.egm.stellio.shared.util.SubjectType import io.r2dbc.postgresql.codec.Json diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseMigration.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseMigration.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseMigration.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseMigration.kt index 355724f2c..1d9647a4b 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseMigration.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseMigration.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.tenant +package com.egm.stellio.search.common.tenant import com.egm.stellio.shared.config.ApplicationProperties import jakarta.annotation.PostConstruct diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseTenantConfig.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseTenantConfig.kt similarity index 98% rename from search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseTenantConfig.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseTenantConfig.kt index e4186f54f..755e56a03 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseTenantConfig.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseTenantConfig.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.tenant +package com.egm.stellio.search.common.tenant import com.egm.stellio.shared.config.ApplicationProperties import io.r2dbc.spi.ConnectionFactories diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseTenantConnectionFactory.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseTenantConnectionFactory.kt similarity index 96% rename from search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseTenantConnectionFactory.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseTenantConnectionFactory.kt index 2f2198326..c90cf5865 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/tenant/DatabaseTenantConnectionFactory.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/tenant/DatabaseTenantConnectionFactory.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.tenant +package com.egm.stellio.search.common.tenant import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.NonexistentTenantException diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/util/DBConversionUtils.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/util/DBConversionUtils.kt similarity index 82% rename from search-service/src/main/kotlin/com/egm/stellio/search/util/DBConversionUtils.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/util/DBConversionUtils.kt index d81b48770..b90fa6abc 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/util/DBConversionUtils.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/util/DBConversionUtils.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.util +package com.egm.stellio.search.common.util import com.egm.stellio.shared.model.ExpandedAttributeInstance import com.egm.stellio.shared.util.JsonUtils.deserializeAsMap @@ -33,3 +33,17 @@ fun Json.deserializeExpandedPayload(): Map> = this.asString(). fun Json.deserializeAsMap(): Map = this.asString().deserializeAsMap() fun ExpandedAttributeInstance.toJson(): Json = Json.of(serializeObject(this)) + +fun valueToDoubleOrNull(value: Any): Double? = + when (value) { + is Double -> value + is Int -> value.toDouble() + else -> null + } + +fun valueToStringOrNull(value: Any): String? = + when (value) { + is String -> value + is Boolean -> value.toString() + else -> null + } diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/util/DBQueryUtils.kt b/search-service/src/main/kotlin/com/egm/stellio/search/common/util/DBQueryUtils.kt similarity index 98% rename from search-service/src/main/kotlin/com/egm/stellio/search/util/DBQueryUtils.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/common/util/DBQueryUtils.kt index 2114dab2b..cab99490c 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/util/DBQueryUtils.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/common/util/DBQueryUtils.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.util +package com.egm.stellio.search.common.util import arrow.core.Either import arrow.core.left diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeDetails.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeDetails.kt similarity index 78% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeDetails.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeDetails.kt index ac7f6f5ee..c7705ac82 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeDetails.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeDetails.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.discovery.model import java.net.URI diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeList.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeList.kt similarity index 84% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeList.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeList.kt index 42814cbd9..7cd511b88 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeList.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeList.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.discovery.model import com.egm.stellio.shared.util.toUri import java.net.URI diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeTypeInfo.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeTypeInfo.kt similarity index 83% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeTypeInfo.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeTypeInfo.kt index 24048d0ce..388387bda 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeTypeInfo.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/AttributeTypeInfo.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.discovery.model import java.net.URI diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityType.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityType.kt similarity index 77% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/EntityType.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityType.kt index cade8ab18..14f4cf3b5 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityType.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityType.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.discovery.model import java.net.URI diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTypeInfo.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityTypeInfo.kt similarity index 94% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTypeInfo.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityTypeInfo.kt index 0f940695c..9b5c3eb1f 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTypeInfo.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityTypeInfo.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.discovery.model import java.net.URI diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTypeList.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityTypeList.kt similarity index 84% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTypeList.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityTypeList.kt index 8a6f092a3..c6c2041e5 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTypeList.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/model/EntityTypeList.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.discovery.model import com.egm.stellio.shared.util.toUri import java.net.URI diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/AttributeService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/service/AttributeService.kt similarity index 88% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/AttributeService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/service/AttributeService.kt index 363cdf661..eb9aecf56 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/AttributeService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/service/AttributeService.kt @@ -1,17 +1,17 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.discovery.service import arrow.core.Either import arrow.core.flatten import arrow.core.left import arrow.core.right -import com.egm.stellio.search.model.AttributeDetails -import com.egm.stellio.search.model.AttributeList -import com.egm.stellio.search.model.AttributeType -import com.egm.stellio.search.model.AttributeTypeInfo -import com.egm.stellio.search.util.allToMappedList -import com.egm.stellio.search.util.toInt -import com.egm.stellio.search.util.toList -import com.egm.stellio.search.util.toUri +import com.egm.stellio.search.common.util.allToMappedList +import com.egm.stellio.search.common.util.toInt +import com.egm.stellio.search.common.util.toList +import com.egm.stellio.search.common.util.toUri +import com.egm.stellio.search.discovery.model.AttributeDetails +import com.egm.stellio.search.discovery.model.AttributeList +import com.egm.stellio.search.discovery.model.AttributeType +import com.egm.stellio.search.discovery.model.AttributeTypeInfo import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.ExpandedTerm import com.egm.stellio.shared.model.ResourceNotFoundException diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/EntityTypeService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/service/EntityTypeService.kt similarity index 93% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/EntityTypeService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/service/EntityTypeService.kt index 40b6c1092..b1a515eac 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/EntityTypeService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/service/EntityTypeService.kt @@ -1,12 +1,12 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.discovery.service import arrow.core.Either import arrow.core.left import arrow.core.right -import com.egm.stellio.search.model.* -import com.egm.stellio.search.util.allToMappedList -import com.egm.stellio.search.util.toInt -import com.egm.stellio.search.util.toUri +import com.egm.stellio.search.common.util.allToMappedList +import com.egm.stellio.search.common.util.toInt +import com.egm.stellio.search.common.util.toUri +import com.egm.stellio.search.discovery.model.* import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.ExpandedTerm import com.egm.stellio.shared.model.ResourceNotFoundException diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/AttributeHandler.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/web/AttributeHandler.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/AttributeHandler.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/web/AttributeHandler.kt index 29a05e0b1..06783a2b2 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/AttributeHandler.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/web/AttributeHandler.kt @@ -1,7 +1,7 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.discovery.web import arrow.core.raise.either -import com.egm.stellio.search.service.AttributeService +import com.egm.stellio.search.discovery.service.AttributeService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.util.* import com.egm.stellio.shared.util.JsonLdUtils.expandJsonLdTerm diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/EntityTypeHandler.kt b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/web/EntityTypeHandler.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/EntityTypeHandler.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/discovery/web/EntityTypeHandler.kt index 01a15cc0f..7b079329d 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/EntityTypeHandler.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/discovery/web/EntityTypeHandler.kt @@ -1,7 +1,7 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.discovery.web import arrow.core.raise.either -import com.egm.stellio.search.service.EntityTypeService +import com.egm.stellio.search.discovery.service.EntityTypeService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.util.* import com.egm.stellio.shared.util.JsonLdUtils.expandJsonLdTerm diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/listener/ObservationEventListener.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/listener/ObservationEventListener.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/listener/ObservationEventListener.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/listener/ObservationEventListener.kt index f04afeeaa..b99220462 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/listener/ObservationEventListener.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/listener/ObservationEventListener.kt @@ -1,10 +1,10 @@ -package com.egm.stellio.search.listener +package com.egm.stellio.search.entity.listener import arrow.core.Either import arrow.core.left import arrow.core.raise.either -import com.egm.stellio.search.service.EntityEventService -import com.egm.stellio.search.service.EntityPayloadService +import com.egm.stellio.search.entity.service.EntityEventService +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.JsonLdUtils.expandAttribute import com.egm.stellio.shared.util.JsonLdUtils.expandJsonLdEntity diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeMetadata.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/AttributeMetadata.kt similarity index 90% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeMetadata.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/model/AttributeMetadata.kt index e7c60d060..a697217b6 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeMetadata.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/AttributeMetadata.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.entity.model import com.egm.stellio.shared.model.WKTCoordinates import java.net.URI diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntitiesQuery.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/EntitiesQuery.kt similarity index 93% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/EntitiesQuery.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/model/EntitiesQuery.kt index d7d3706a5..9a1e80113 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntitiesQuery.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/EntitiesQuery.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.entity.model import com.egm.stellio.shared.model.EntityTypeSelection import com.egm.stellio.shared.model.ExpandedTerm diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityPayload.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/EntityPayload.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/EntityPayload.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/model/EntityPayload.kt index 5f8d986d7..1a5d29de3 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityPayload.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/EntityPayload.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.entity.model import com.egm.stellio.shared.model.ExpandedTerm import com.egm.stellio.shared.util.AuthContextModel diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/OperationType.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/OperationType.kt similarity index 89% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/OperationType.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/model/OperationType.kt index b1a0045c0..f7c824f11 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/OperationType.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/OperationType.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.entity.model /** * Used to manage the different types of updates on existing attributes depending on the current operation. diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalEntityAttribute.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/TemporalEntityAttribute.kt similarity index 96% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalEntityAttribute.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/model/TemporalEntityAttribute.kt index a04f1da97..e2d4d6b2e 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalEntityAttribute.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/TemporalEntityAttribute.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.entity.model import com.egm.stellio.shared.model.ExpandedTerm import com.egm.stellio.shared.util.JsonLdUtils.NGSILD_GEOPROPERTY_TYPE @@ -66,7 +66,7 @@ data class TemporalEntityAttribute( /** * Returns the key of the member for the simplified representation of the attribute, as defined in 4.5.9 */ - fun toSimpliedRepresentationKey(): String = + fun toSimplifiedRepresentationKey(): String = when (this) { Property -> NGSILD_PROPERTY_VALUES Relationship -> NGSILD_RELATIONSHIP_OBJECTS diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/UpdateResult.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/UpdateResult.kt similarity index 98% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/UpdateResult.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/model/UpdateResult.kt index ddb61f626..9ccf6a575 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/UpdateResult.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/model/UpdateResult.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.entity.model import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.annotation.JsonValue diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/TemporalEntityAttributeService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityAttributeService.kt similarity index 98% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/TemporalEntityAttributeService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityAttributeService.kt index bbcc52997..815ef8d9f 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/TemporalEntityAttributeService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityAttributeService.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.Either import arrow.core.flatMap @@ -7,8 +7,12 @@ import arrow.core.raise.either import arrow.core.raise.ensure import arrow.core.right import arrow.fx.coroutines.parMap -import com.egm.stellio.search.model.* -import com.egm.stellio.search.util.* +import com.egm.stellio.search.common.util.* +import com.egm.stellio.search.entity.model.* +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.temporal.model.AttributeInstance +import com.egm.stellio.search.temporal.service.AttributeInstanceService +import com.egm.stellio.search.temporal.util.* import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* import com.egm.stellio.shared.util.AttributeType @@ -35,7 +39,7 @@ import java.time.ZonedDateTime import java.util.UUID @Service -class TemporalEntityAttributeService( +class EntityAttributeService( private val databaseClient: DatabaseClient, private val attributeInstanceService: AttributeInstanceService ) { @@ -117,7 +121,7 @@ class TemporalEntityAttributeService( * To be removed at some point later. */ @Transactional - suspend fun createEntityTemporalReferences( + suspend fun createEntityAttributes( payload: String, contexts: List, sub: String? = null @@ -127,12 +131,12 @@ class TemporalEntityAttributeService( val ngsiLdEntity = expandedEntity.toNgsiLdEntity().bind() ngsiLdEntity.prepareTemporalAttributes() .map { - createEntityTemporalReferences(ngsiLdEntity, expandedEntity, it, createdAt, sub).bind() + createEntityAttributes(ngsiLdEntity, expandedEntity, it, createdAt, sub).bind() }.bind() } @Transactional - suspend fun createEntityTemporalReferences( + suspend fun createEntityAttributes( ngsiLdEntity: NgsiLdEntity, expandedEntity: ExpandedEntity, attributesMetadata: List>, diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/EntityEventService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityEventService.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/EntityEventService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityEventService.kt index e84f688a5..8dc9124fc 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/EntityEventService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityEventService.kt @@ -1,10 +1,10 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.Either -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.model.UpdateOperationResult -import com.egm.stellio.search.model.UpdateResult -import com.egm.stellio.search.model.UpdatedDetails +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.UpdateOperationResult +import com.egm.stellio.search.entity.model.UpdateResult +import com.egm.stellio.search.entity.model.UpdatedDetails import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.JsonLdUtils.JSONLD_TYPE import com.egm.stellio.shared.util.JsonUtils.serializeObject diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/EntityOperationService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityOperationService.kt similarity index 96% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/EntityOperationService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityOperationService.kt index 809a2c7f1..7b35a8e65 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/EntityOperationService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityOperationService.kt @@ -1,13 +1,13 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.Either import arrow.core.left import arrow.core.raise.either import arrow.core.right -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.model.UpdateResult -import com.egm.stellio.search.web.* +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.UpdateResult +import com.egm.stellio.search.entity.web.* import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.BadRequestDataException import com.egm.stellio.shared.util.Sub @@ -21,7 +21,7 @@ import java.net.URI @Component class EntityOperationService( private val entityPayloadService: EntityPayloadService, - private val temporalEntityAttributeService: TemporalEntityAttributeService, + private val entityAttributeService: EntityAttributeService, private val authorizationService: AuthorizationService, private val entityEventService: EntityEventService ) { @@ -234,7 +234,7 @@ class EntityOperationService( sub: Sub? ): Either = either { val (jsonLdEntity, ngsiLdEntity) = entity - temporalEntityAttributeService.deleteTemporalAttributesOfEntity(ngsiLdEntity.id).bind() + entityAttributeService.deleteTemporalAttributesOfEntity(ngsiLdEntity.id).bind() entityPayloadService.appendAttributes( ngsiLdEntity.id, jsonLdEntity.getModifiableMembers(), diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/EntityPayloadService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityPayloadService.kt similarity index 93% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/EntityPayloadService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityPayloadService.kt index 58c9bc2d5..a0ab386b2 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/EntityPayloadService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityPayloadService.kt @@ -1,14 +1,16 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.Either import arrow.core.flatMap import arrow.core.left import arrow.core.raise.either import arrow.core.right -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.OperationType.* +import com.egm.stellio.search.common.util.* +import com.egm.stellio.search.entity.model.* +import com.egm.stellio.search.entity.model.OperationType.* +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.scope.ScopeService -import com.egm.stellio.search.util.* +import com.egm.stellio.search.temporal.util.prepareTemporalAttributes import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* import com.egm.stellio.shared.util.AuthContextModel.SpecificAccessPolicy @@ -29,7 +31,7 @@ import java.time.ZonedDateTime @Service class EntityPayloadService( private val databaseClient: DatabaseClient, - private val temporalEntityAttributeService: TemporalEntityAttributeService, + private val entityAttributeService: EntityAttributeService, private val scopeService: ScopeService ) { private val logger = LoggerFactory.getLogger(javaClass) @@ -45,7 +47,7 @@ class EntityPayloadService( logger.debug("Creating entity {}", ngsiLdEntity.id) createEntityPayload(ngsiLdEntity, expandedEntity, createdAt, sub = sub).bind() - temporalEntityAttributeService.createEntityTemporalReferences( + entityAttributeService.createEntityAttributes( ngsiLdEntity, expandedEntity, attributesMetadata, @@ -94,7 +96,7 @@ class EntityPayloadService( val mergedAt = ngsiLdDateTime() val coreUpdateResult = updateCoreAttributes(entityId, coreAttrs, mergedAt, MERGE_ENTITY).bind() - val attrsUpdateResult = temporalEntityAttributeService.mergeEntityAttributes( + val attrsUpdateResult = entityAttributeService.mergeEntityAttributes( entityId, otherAttrs.toMap().toNgsiLdAttributes().bind(), expandedAttributes, @@ -106,7 +108,7 @@ class EntityPayloadService( val updateResult = coreUpdateResult.mergeWith(attrsUpdateResult) // update modifiedAt in entity if at least one attribute has been merged if (updateResult.hasSuccessfulUpdate()) { - val teas = temporalEntityAttributeService.getForEntity(entityId, emptySet(), emptySet()) + val teas = entityAttributeService.getForEntity(entityId, emptySet(), emptySet()) updateState(entityId, mergedAt, teas).bind() } updateResult @@ -123,10 +125,10 @@ class EntityPayloadService( val attributesMetadata = ngsiLdEntity.prepareTemporalAttributes().bind() logger.debug("Replacing entity {}", ngsiLdEntity.id) - temporalEntityAttributeService.deleteTemporalAttributesOfEntity(entityId) + entityAttributeService.deleteTemporalAttributesOfEntity(entityId) replaceEntityPayload(ngsiLdEntity, expandedEntity, replacedAt, sub).bind() - temporalEntityAttributeService.createEntityTemporalReferences( + entityAttributeService.createEntityAttributes( ngsiLdEntity, expandedEntity, attributesMetadata, @@ -479,7 +481,7 @@ class EntityPayloadService( if (disallowOverwrite) APPEND_ATTRIBUTES else APPEND_ATTRIBUTES_OVERWRITE_ALLOWED val coreUpdateResult = updateCoreAttributes(entityUri, coreAttrs, createdAt, operationType).bind() - val attrsUpdateResult = temporalEntityAttributeService.appendEntityAttributes( + val attrsUpdateResult = entityAttributeService.appendEntityAttributes( entityUri, otherAttrs.toMap().toNgsiLdAttributes().bind(), expandedAttributes, @@ -491,7 +493,7 @@ class EntityPayloadService( val updateResult = coreUpdateResult.mergeWith(attrsUpdateResult) // update modifiedAt in entity if at least one attribute has been added if (updateResult.hasSuccessfulUpdate()) { - val teas = temporalEntityAttributeService.getForEntity(entityUri, emptySet(), emptySet()) + val teas = entityAttributeService.getForEntity(entityUri, emptySet(), emptySet()) updateState(entityUri, createdAt, teas).bind() } updateResult @@ -508,7 +510,7 @@ class EntityPayloadService( val createdAt = ngsiLdDateTime() val coreUpdateResult = updateCoreAttributes(entityUri, coreAttrs, createdAt, UPDATE_ATTRIBUTES).bind() - val attrsUpdateResult = temporalEntityAttributeService.updateEntityAttributes( + val attrsUpdateResult = entityAttributeService.updateEntityAttributes( entityUri, otherAttrs.toMap().toNgsiLdAttributes().bind(), expandedAttributes, @@ -519,7 +521,7 @@ class EntityPayloadService( val updateResult = coreUpdateResult.mergeWith(attrsUpdateResult) // update modifiedAt in entity if at least one attribute has been added if (updateResult.hasSuccessfulUpdate()) { - val teas = temporalEntityAttributeService.getForEntity(entityUri, emptySet(), emptySet()) + val teas = entityAttributeService.getForEntity(entityUri, emptySet(), emptySet()) updateState(entityUri, createdAt, teas).bind() } updateResult @@ -532,14 +534,14 @@ class EntityPayloadService( sub: Sub? ): Either = either { val modifiedAt = ngsiLdDateTime() - val updateResult = temporalEntityAttributeService.partialUpdateEntityAttribute( + val updateResult = entityAttributeService.partialUpdateEntityAttribute( entityId, expandedAttribute, modifiedAt, sub ).bind() if (updateResult.isSuccessful()) { - val teas = temporalEntityAttributeService.getForEntity(entityId, emptySet(), emptySet()) + val teas = entityAttributeService.getForEntity(entityId, emptySet(), emptySet()) updateState(entityId, modifiedAt, teas).bind() } updateResult @@ -558,7 +560,7 @@ class EntityPayloadService( val jsonLdAttribute = mapOf(attributeName to listOf(expandedAttributeInstance)) val ngsiLdAttribute = jsonLdAttribute.toNgsiLdAttributes().bind()[0] - temporalEntityAttributeService.upsertEntityAttributes( + entityAttributeService.upsertEntityAttributes( entityId, ngsiLdAttribute, jsonLdAttribute, @@ -570,7 +572,7 @@ class EntityPayloadService( updateState( entityId, createdAt, - temporalEntityAttributeService.getForEntity(entityId, emptySet(), emptySet()) + entityAttributeService.getForEntity(entityId, emptySet(), emptySet()) ).bind() } @@ -583,7 +585,7 @@ class EntityPayloadService( val ngsiLdAttribute = listOf(expandedAttribute).toMap().toNgsiLdAttributes().bind()[0] val replacedAt = ngsiLdDateTime() - val updateResult = temporalEntityAttributeService.replaceEntityAttribute( + val updateResult = entityAttributeService.replaceEntityAttribute( entityId, ngsiLdAttribute, expandedAttribute, @@ -593,7 +595,7 @@ class EntityPayloadService( // update modifiedAt in entity if at least one attribute has been added if (updateResult.hasSuccessfulUpdate()) { - val teas = temporalEntityAttributeService.getForEntity(entityId, emptySet(), emptySet()) + val teas = entityAttributeService.getForEntity(entityId, emptySet(), emptySet()) updateState(entityId, replacedAt, teas).bind() } updateResult @@ -673,7 +675,7 @@ class EntityPayloadService( } .bind() - temporalEntityAttributeService.deleteTemporalAttributesOfEntity(entityId).bind() + entityAttributeService.deleteTemporalAttributesOfEntity(entityId).bind() scopeService.deleteHistory(entityId).bind() entity } @@ -688,12 +690,12 @@ class EntityPayloadService( when (attributeName) { NGSILD_SCOPE_PROPERTY -> scopeService.delete(entityId).bind() else -> { - temporalEntityAttributeService.checkEntityAndAttributeExistence( + entityAttributeService.checkEntityAndAttributeExistence( entityId, attributeName, datasetId ).bind() - temporalEntityAttributeService.deleteTemporalAttribute( + entityAttributeService.deleteTemporalAttribute( entityId, attributeName, datasetId, @@ -704,7 +706,7 @@ class EntityPayloadService( updateState( entityId, ngsiLdDateTime(), - temporalEntityAttributeService.getForEntity(entityId, emptySet(), emptySet()) + entityAttributeService.getForEntity(entityId, emptySet(), emptySet()) ).bind() } diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityQueryService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityQueryService.kt new file mode 100644 index 000000000..fd8012b99 --- /dev/null +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/service/EntityQueryService.kt @@ -0,0 +1,44 @@ +package com.egm.stellio.search.entity.service + +import arrow.core.Either +import arrow.core.raise.either +import arrow.core.right +import com.egm.stellio.search.common.util.deserializeAsMap +import com.egm.stellio.search.entity.model.EntitiesQuery +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.shared.model.APIException +import com.egm.stellio.shared.model.ExpandedEntity +import org.springframework.stereotype.Service +import java.net.URI + +@Service +class EntityQueryService( + private val entityPayloadService: EntityPayloadService, +) { + suspend fun queryEntity(entityId: URI): Either = + either { + val entityPayload = entityPayloadService.retrieve(entityId).bind() + toJsonLdEntity(entityPayload) + } + + suspend fun queryEntities( + entitiesQuery: EntitiesQuery, + accessRightFilter: () -> String? + ): Either, Int>> = either { + val entitiesIds = entityPayloadService.queryEntities(entitiesQuery, accessRightFilter) + val count = entityPayloadService.queryEntitiesCount(entitiesQuery, accessRightFilter).bind() + + // we can have an empty list of entities with a non-zero count (e.g., offset too high) + if (entitiesIds.isEmpty()) + return@either Pair, Int>(emptyList(), count) + + val entitiesPayloads = entityPayloadService.retrieve(entitiesIds).map { toJsonLdEntity(it) } + + Pair(entitiesPayloads, count).right().bind() + } + + private fun toJsonLdEntity(entityPayload: EntityPayload): ExpandedEntity { + val deserializedEntity = entityPayload.payload.deserializeAsMap() + return ExpandedEntity(deserializedEntity) + } +} diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/entity/util/EntitiesQueryUtils.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/util/EntitiesQueryUtils.kt new file mode 100644 index 000000000..1c32efcf5 --- /dev/null +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/util/EntitiesQueryUtils.kt @@ -0,0 +1,105 @@ +package com.egm.stellio.search.entity.util + +import arrow.core.* +import arrow.core.raise.either +import com.egm.stellio.search.common.model.Query +import com.egm.stellio.search.entity.model.EntitiesQuery +import com.egm.stellio.shared.config.ApplicationProperties +import com.egm.stellio.shared.model.APIException +import com.egm.stellio.shared.model.BadRequestDataException +import com.egm.stellio.shared.util.* +import org.springframework.util.MultiValueMap + +fun composeEntitiesQuery( + defaultPagination: ApplicationProperties.Pagination, + requestParams: MultiValueMap, + contexts: List +): Either = either { + val ids = requestParams.getFirst(QUERY_PARAM_ID)?.split(",").orEmpty().toListOfUri().toSet() + val typeSelection = expandTypeSelection(requestParams.getFirst(QUERY_PARAM_TYPE), contexts) + val idPattern = validateIdPattern(requestParams.getFirst(QUERY_PARAM_ID_PATTERN)).bind() + + /** + * Decoding query parameters is not supported by default so a call to a decode function was added query + * with the right parameters values + */ + val q = requestParams.getFirst(QUERY_PARAM_Q)?.decode() + val scopeQ = requestParams.getFirst(QUERY_PARAM_SCOPEQ) + val attrs = parseAndExpandRequestParameter(requestParams.getFirst(QUERY_PARAM_ATTRS), contexts) + val datasetId = parseRequestParameter(requestParams.getFirst(QUERY_PARAM_DATASET_ID)) + val paginationQuery = parsePaginationParameters( + requestParams, + defaultPagination.limitDefault, + defaultPagination.limitMax + ).bind() + + val geoQuery = parseGeoQueryParameters(requestParams.toSingleValueMap(), contexts).bind() + + EntitiesQuery( + ids = ids, + typeSelection = typeSelection, + idPattern = idPattern, + q = q, + scopeQ = scopeQ, + paginationQuery = paginationQuery, + attrs = attrs, + datasetId = datasetId, + geoQuery = geoQuery, + contexts = contexts + ) +} + +fun EntitiesQuery.validateMinimalQueryEntitiesParameters(): Either = either { + if ( + geoQuery == null && + q.isNullOrEmpty() && + typeSelection.isNullOrEmpty() && + attrs.isEmpty() + ) + return@either BadRequestDataException( + "One of 'type', 'attrs', 'q', 'geoQ' must be provided in the query" + ).left().bind() + + this@validateMinimalQueryEntitiesParameters +} + +fun composeEntitiesQueryFromPostRequest( + defaultPagination: ApplicationProperties.Pagination, + query: Query, + requestParams: MultiValueMap, + contexts: List +): Either = either { + val entitySelector = query.entities?.get(0) + val typeSelection = expandTypeSelection(entitySelector?.typeSelection, contexts) + val idPattern = validateIdPattern(entitySelector?.idPattern).bind() + val attrs = query.attrs.orEmpty().map { JsonLdUtils.expandJsonLdTerm(it.trim(), contexts) }.toSet() + val datasetId = query.datasetId.orEmpty().toSet() + val geoQuery = if (query.geoQ != null) { + val geoQueryElements = mapOf( + "geometry" to query.geoQ.geometry, + "coordinates" to query.geoQ.coordinates.toString(), + "georel" to query.geoQ.georel, + "geoproperty" to query.geoQ.geoproperty + ) + parseGeoQueryParameters(geoQueryElements, contexts).bind() + } else null + + val paginationQuery = parsePaginationParameters( + requestParams, + defaultPagination.limitDefault, + defaultPagination.limitMax + ).bind() + + EntitiesQuery( + ids = setOfNotNull(entitySelector?.id), + typeSelection = typeSelection, + idPattern = idPattern, + q = query.q?.decode(), + scopeQ = query.scopeQ, + paginationQuery = paginationQuery, + attrs = attrs, + datasetId = datasetId, + geoQuery = geoQuery, + contexts = contexts + ) +} diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/BatchAPIResponses.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/web/BatchAPIResponses.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/BatchAPIResponses.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/web/BatchAPIResponses.kt index 421b50bcc..f1c2d3414 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/BatchAPIResponses.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/web/BatchAPIResponses.kt @@ -1,6 +1,6 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.entity.web -import com.egm.stellio.search.model.UpdateResult +import com.egm.stellio.search.entity.model.UpdateResult import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.ExpandedEntity import com.egm.stellio.shared.model.NgsiLdEntity diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/EntityHandler.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/web/EntityHandler.kt similarity index 97% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/EntityHandler.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/web/EntityHandler.kt index 179278523..044d76875 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/EntityHandler.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/web/EntityHandler.kt @@ -1,15 +1,15 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.entity.web import arrow.core.getOrElse import arrow.core.left import arrow.core.raise.either import arrow.core.right -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.service.EntityEventService -import com.egm.stellio.search.service.EntityPayloadService -import com.egm.stellio.search.service.QueryService -import com.egm.stellio.search.util.composeEntitiesQuery -import com.egm.stellio.search.util.validateMinimalQueryEntitiesParameters +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.entity.service.EntityEventService +import com.egm.stellio.search.entity.service.EntityPayloadService +import com.egm.stellio.search.entity.service.EntityQueryService +import com.egm.stellio.search.entity.util.composeEntitiesQuery +import com.egm.stellio.search.entity.util.validateMinimalQueryEntitiesParameters import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* @@ -36,7 +36,7 @@ import java.util.Optional class EntityHandler( private val applicationProperties: ApplicationProperties, private val entityPayloadService: EntityPayloadService, - private val queryService: QueryService, + private val queryService: EntityQueryService, private val authorizationService: AuthorizationService, private val entityEventService: EntityEventService ) : BaseHandler() { diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/EntityOperationHandler.kt b/search-service/src/main/kotlin/com/egm/stellio/search/entity/web/EntityOperationHandler.kt similarity index 96% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/EntityOperationHandler.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/entity/web/EntityOperationHandler.kt index 92a7152a9..3681077dc 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/EntityOperationHandler.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/entity/web/EntityOperationHandler.kt @@ -1,14 +1,14 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.entity.web import arrow.core.* import arrow.core.raise.either -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.model.Query -import com.egm.stellio.search.service.EntityOperationService -import com.egm.stellio.search.service.EntityPayloadService -import com.egm.stellio.search.service.QueryService -import com.egm.stellio.search.util.composeEntitiesQueryFromPostRequest -import com.egm.stellio.search.util.validateMinimalQueryEntitiesParameters +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.common.model.Query +import com.egm.stellio.search.entity.service.EntityOperationService +import com.egm.stellio.search.entity.service.EntityPayloadService +import com.egm.stellio.search.entity.service.EntityQueryService +import com.egm.stellio.search.entity.util.composeEntitiesQueryFromPostRequest +import com.egm.stellio.search.entity.util.validateMinimalQueryEntitiesParameters import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* @@ -34,7 +34,7 @@ class EntityOperationHandler( private val applicationProperties: ApplicationProperties, private val entityOperationService: EntityOperationService, private val entityPayloadService: EntityPayloadService, - private val queryService: QueryService, + private val queryService: EntityQueryService, private val authorizationService: AuthorizationService ) { diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/scope/ScopeInstanceResult.kt b/search-service/src/main/kotlin/com/egm/stellio/search/scope/ScopeInstanceResult.kt index a8208d3e1..9c2d1cf3c 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/scope/ScopeInstanceResult.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/scope/ScopeInstanceResult.kt @@ -1,6 +1,6 @@ package com.egm.stellio.search.scope -import com.egm.stellio.search.model.TemporalQuery +import com.egm.stellio.search.temporal.model.TemporalQuery import java.net.URI import java.time.ZonedDateTime diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/scope/ScopeService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/scope/ScopeService.kt index d876dfc9d..8300c0429 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/scope/ScopeService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/scope/ScopeService.kt @@ -4,10 +4,14 @@ import arrow.core.Either import arrow.core.left import arrow.core.raise.either import arrow.core.right -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.AttributeInstance.TemporalProperty -import com.egm.stellio.search.model.TemporalEntityAttribute.AttributeValueType -import com.egm.stellio.search.util.* +import com.egm.stellio.search.common.util.* +import com.egm.stellio.search.entity.model.* +import com.egm.stellio.search.entity.model.TemporalEntityAttribute.AttributeValueType +import com.egm.stellio.search.temporal.model.AttributeInstance.TemporalProperty +import com.egm.stellio.search.temporal.model.TemporalEntitiesQuery +import com.egm.stellio.search.temporal.model.TemporalQuery +import com.egm.stellio.search.temporal.util.WHOLE_TIME_RANGE_DURATION +import com.egm.stellio.search.temporal.util.composeAggregationSelectClause import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.INCONSISTENT_VALUES_IN_AGGREGATION_MESSAGE import com.egm.stellio.shared.util.JsonLdUtils diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/scope/TemporalScopeBuilder.kt b/search-service/src/main/kotlin/com/egm/stellio/search/scope/TemporalScopeBuilder.kt index f4f37d764..ab32d5c72 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/scope/TemporalScopeBuilder.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/scope/TemporalScopeBuilder.kt @@ -1,8 +1,8 @@ package com.egm.stellio.search.scope -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.model.TemporalEntitiesQuery -import com.egm.stellio.search.model.TemporalQuery +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.temporal.model.TemporalEntitiesQuery +import com.egm.stellio.search.temporal.model.TemporalQuery import com.egm.stellio.shared.util.JsonLdUtils.JSONLD_LIST import com.egm.stellio.shared.util.JsonLdUtils.JSONLD_TYPE import com.egm.stellio.shared.util.JsonLdUtils.JSONLD_VALUE diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeInstance.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/AttributeInstance.kt similarity index 95% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeInstance.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/AttributeInstance.kt index afdfe71fc..a70f6fe19 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeInstance.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/AttributeInstance.kt @@ -1,6 +1,7 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.temporal.model -import com.egm.stellio.search.util.toJson +import com.egm.stellio.search.common.util.toJson +import com.egm.stellio.search.entity.model.AttributeMetadata import com.egm.stellio.shared.model.ExpandedAttributeInstance import com.egm.stellio.shared.model.WKTCoordinates import com.egm.stellio.shared.util.JsonLdUtils.NGSILD_INSTANCE_ID_PROPERTY diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeInstanceResult.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/AttributeInstanceResult.kt similarity index 96% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeInstanceResult.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/AttributeInstanceResult.kt index 1d32f7ab0..3e3f1dbf3 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/AttributeInstanceResult.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/AttributeInstanceResult.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.temporal.model import java.time.ZonedDateTime import java.util.UUID diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTemporalResult.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/EntityTemporalResult.kt similarity index 57% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTemporalResult.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/EntityTemporalResult.kt index e37414feb..8e98fd8d5 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/EntityTemporalResult.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/EntityTemporalResult.kt @@ -1,7 +1,8 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.temporal.model +import com.egm.stellio.search.entity.model.EntityPayload import com.egm.stellio.search.scope.ScopeInstanceResult -import com.egm.stellio.search.util.TemporalEntityAttributeInstancesResult +import com.egm.stellio.search.temporal.util.TemporalEntityAttributeInstancesResult data class EntityTemporalResult( val entityPayload: EntityPayload, diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalEntitiesQuery.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/TemporalEntitiesQuery.kt similarity index 90% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalEntitiesQuery.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/TemporalEntitiesQuery.kt index 6063f3a10..adc92fce3 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalEntitiesQuery.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/TemporalEntitiesQuery.kt @@ -1,5 +1,6 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.temporal.model +import com.egm.stellio.search.entity.model.EntitiesQuery import java.time.Duration import java.time.Period import java.time.temporal.TemporalAmount diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalQuery.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/TemporalQuery.kt similarity index 96% rename from search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalQuery.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/TemporalQuery.kt index e54f245e3..e3e016ead 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/model/TemporalQuery.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/model/TemporalQuery.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.temporal.model import java.time.ZonedDateTime diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/AttributeInstanceService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/AttributeInstanceService.kt similarity index 96% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/AttributeInstanceService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/AttributeInstanceService.kt index e887e0f3b..194611270 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/AttributeInstanceService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/AttributeInstanceService.kt @@ -1,14 +1,19 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.temporal.service import arrow.core.Either import arrow.core.left import arrow.core.raise.either import arrow.core.right import arrow.fx.coroutines.parMap -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.AggregatedAttributeInstanceResult.AggregateResult -import com.egm.stellio.search.model.TemporalQuery.Timerel -import com.egm.stellio.search.util.* +import com.egm.stellio.search.common.util.* +import com.egm.stellio.search.entity.model.AttributeMetadata +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.temporal.model.* +import com.egm.stellio.search.temporal.model.AggregatedAttributeInstanceResult.AggregateResult +import com.egm.stellio.search.temporal.model.TemporalQuery.Timerel +import com.egm.stellio.search.temporal.util.WHOLE_TIME_RANGE_DURATION +import com.egm.stellio.search.temporal.util.composeAggregationSelectClause +import com.egm.stellio.search.temporal.util.toTemporalAttributeMetadata import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.INCONSISTENT_VALUES_IN_AGGREGATION_MESSAGE import com.egm.stellio.shared.util.attributeOrInstanceNotFoundMessage diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/TemporalPaginationService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/TemporalPaginationService.kt similarity index 80% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/TemporalPaginationService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/TemporalPaginationService.kt index 772bacd29..ec7aadea8 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/TemporalPaginationService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/TemporalPaginationService.kt @@ -1,9 +1,10 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.temporal.service -import com.egm.stellio.search.model.AggregatedAttributeInstanceResult -import com.egm.stellio.search.model.AttributeInstanceResult -import com.egm.stellio.search.model.TemporalEntitiesQuery -import com.egm.stellio.search.model.TemporalQuery +import com.egm.stellio.search.temporal.model.AggregatedAttributeInstanceResult +import com.egm.stellio.search.temporal.model.AttributeInstanceResult +import com.egm.stellio.search.temporal.model.TemporalEntitiesQuery +import com.egm.stellio.search.temporal.model.TemporalQuery +import com.egm.stellio.search.temporal.util.TemporalEntityAttributeInstancesResult import java.time.ZonedDateTime typealias Range = Pair @@ -11,9 +12,9 @@ typealias Range = Pair object TemporalPaginationService { fun getRangeAndPaginatedTEA( - teaWithInstances: TEAWithInstances, + teaWithInstances: TemporalEntityAttributeInstancesResult, query: TemporalEntitiesQuery, - ): Pair { + ): Pair { val temporalQuery = query.temporalQuery if (temporalQuery.isLastNTheLimit()) { return teaWithInstances to null @@ -32,7 +33,7 @@ object TemporalPaginationService { } private fun getAttributesWhoReachedLimit( - teaWithInstances: TEAWithInstances, + teaWithInstances: TemporalEntityAttributeInstancesResult, query: TemporalEntitiesQuery ): List> = teaWithInstances.values.filter { instances -> @@ -76,9 +77,9 @@ object TemporalPaginationService { } private fun filterInRange( - teaWithInstances: TEAWithInstances, + teaWithInstances: TemporalEntityAttributeInstancesResult, range: Range, - ): TEAWithInstances = + ): TemporalEntityAttributeInstancesResult = teaWithInstances.mapValues { (_, value) -> value.filter { range.contain(it.getComparableTime()) } } diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/QueryService.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/TemporalQueryService.kt similarity index 81% rename from search-service/src/main/kotlin/com/egm/stellio/search/service/QueryService.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/TemporalQueryService.kt index bf0c20426..7bae98657 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/QueryService.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/service/TemporalQueryService.kt @@ -1,16 +1,19 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.temporal.service import arrow.core.Either import arrow.core.getOrElse import arrow.core.left import arrow.core.raise.either import arrow.core.right -import com.egm.stellio.search.model.* +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.entity.service.EntityAttributeService +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.search.scope.ScopeService -import com.egm.stellio.search.service.TemporalPaginationService.getRangeAndPaginatedTEA -import com.egm.stellio.search.util.TemporalEntityBuilder -import com.egm.stellio.search.util.deserializeAsMap -import com.egm.stellio.search.web.Range +import com.egm.stellio.search.temporal.model.* +import com.egm.stellio.search.temporal.service.TemporalPaginationService.getRangeAndPaginatedTEA +import com.egm.stellio.search.temporal.util.TemporalEntityAttributeInstancesResult +import com.egm.stellio.search.temporal.util.TemporalEntityBuilder +import com.egm.stellio.search.temporal.web.Range import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.ExpandedEntity import com.egm.stellio.shared.model.ResourceNotFoundException @@ -21,36 +24,13 @@ import org.springframework.stereotype.Service import java.net.URI import java.time.ZonedDateTime -typealias TEAWithInstances = Map> - @Service -class QueryService( +class TemporalQueryService( private val entityPayloadService: EntityPayloadService, private val scopeService: ScopeService, private val attributeInstanceService: AttributeInstanceService, - private val temporalEntityAttributeService: TemporalEntityAttributeService + private val entityAttributeService: EntityAttributeService ) { - suspend fun queryEntity(entityId: URI): Either = - either { - val entityPayload = entityPayloadService.retrieve(entityId).bind() - toJsonLdEntity(entityPayload) - } - - suspend fun queryEntities( - entitiesQuery: EntitiesQuery, - accessRightFilter: () -> String? - ): Either, Int>> = either { - val entitiesIds = entityPayloadService.queryEntities(entitiesQuery, accessRightFilter) - val count = entityPayloadService.queryEntitiesCount(entitiesQuery, accessRightFilter).bind() - - // we can have an empty list of entities with a non-zero count (e.g., offset too high) - if (entitiesIds.isEmpty()) - return@either Pair, Int>(emptyList(), count) - - val entitiesPayloads = entityPayloadService.retrieve(entitiesIds).map { toJsonLdEntity(it) } - - Pair(entitiesPayloads, count).right().bind() - } suspend fun queryTemporalEntity( entityId: URI, @@ -58,7 +38,7 @@ class QueryService( ): Either> = either { val attrs = temporalEntitiesQuery.entitiesQuery.attrs val datasetIds = temporalEntitiesQuery.entitiesQuery.datasetId - val temporalEntityAttributes = temporalEntityAttributeService.getForEntity(entityId, attrs, datasetIds).let { + val temporalEntityAttributes = entityAttributeService.getForEntity(entityId, attrs, datasetIds).let { if (it.isEmpty()) ResourceNotFoundException( entityOrAttrsNotFoundMessage(entityId.toString(), temporalEntitiesQuery.entitiesQuery.attrs) @@ -139,7 +119,7 @@ class QueryService( if (entitiesIds.isEmpty()) return@either Triple, Int, Range?>(emptyList(), count, null) - val temporalEntityAttributes = temporalEntityAttributeService.getForTemporalEntities( + val temporalEntityAttributes = entityAttributeService.getForTemporalEntities( entitiesIds, temporalEntitiesQuery.entitiesQuery ) @@ -193,7 +173,7 @@ class QueryService( temporalEntityAttributes: List, temporalEntitiesQuery: TemporalEntitiesQuery, origin: ZonedDateTime? = null - ): Either = either { + ): Either = either { // split the group according to attribute type as this currently triggers 2 different queries // then do one search for each type of attribute (fewer queries for improved performance) temporalEntityAttributes @@ -229,8 +209,8 @@ class QueryService( private fun fillWithTEAWithEmptyInstances( temporalEntityAttributes: List, - temporalEntityAttributesWithInstances: TEAWithInstances - ): TEAWithInstances { + temporalEntityAttributesWithInstances: TemporalEntityAttributeInstancesResult + ): TemporalEntityAttributeInstancesResult { // filter the temporal entity attributes for which there are no attribute instances val temporalEntityAttributesWithoutInstances = temporalEntityAttributes.filter { @@ -241,9 +221,4 @@ class QueryService( temporalEntityAttributesWithoutInstances.map { it to emptyList() } ) } - - private fun toJsonLdEntity(entityPayload: EntityPayload): ExpandedEntity { - val deserializedEntity = entityPayload.payload.deserializeAsMap() - return ExpandedEntity(deserializedEntity) - } } diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/util/AttributeInstanceUtils.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/AttributeInstanceUtils.kt similarity index 93% rename from search-service/src/main/kotlin/com/egm/stellio/search/util/AttributeInstanceUtils.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/AttributeInstanceUtils.kt index c26cea08b..65c20962b 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/util/AttributeInstanceUtils.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/AttributeInstanceUtils.kt @@ -1,12 +1,14 @@ -package com.egm.stellio.search.util +package com.egm.stellio.search.temporal.util import arrow.core.Either import arrow.core.left import arrow.core.raise.either import arrow.core.right -import com.egm.stellio.search.model.AttributeMetadata -import com.egm.stellio.search.model.TemporalEntityAttribute -import com.egm.stellio.search.model.TemporalEntityAttribute.AttributeValueType +import com.egm.stellio.search.common.util.deserializeAsMap +import com.egm.stellio.search.common.util.valueToDoubleOrNull +import com.egm.stellio.search.entity.model.AttributeMetadata +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.entity.model.TemporalEntityAttribute.AttributeValueType import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.JsonLdUtils.JSONLD_LANGUAGE import com.egm.stellio.shared.util.JsonLdUtils.NGSILD_JSONPROPERTY_VALUE @@ -22,20 +24,6 @@ import java.time.LocalDate import java.time.LocalTime import java.time.ZonedDateTime -fun valueToDoubleOrNull(value: Any): Double? = - when (value) { - is Double -> value - is Int -> value.toDouble() - else -> null - } - -fun valueToStringOrNull(value: Any): String? = - when (value) { - is String -> value - is Boolean -> value.toString() - else -> null - } - fun NgsiLdEntity.prepareTemporalAttributes(): Either>> { val ngsiLdEntity = this return either { diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/util/DBAggregationUtils.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/DBAggregationUtils.kt similarity index 96% rename from search-service/src/main/kotlin/com/egm/stellio/search/util/DBAggregationUtils.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/DBAggregationUtils.kt index a3bc977da..62394d558 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/util/DBAggregationUtils.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/DBAggregationUtils.kt @@ -1,7 +1,7 @@ -package com.egm.stellio.search.util +package com.egm.stellio.search.temporal.util -import com.egm.stellio.search.model.TemporalEntityAttribute.AttributeValueType -import com.egm.stellio.search.model.TemporalQuery +import com.egm.stellio.search.entity.model.TemporalEntityAttribute.AttributeValueType +import com.egm.stellio.search.temporal.model.TemporalQuery fun aggrMethodToSqlAggregate( aggregate: TemporalQuery.Aggregate, diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/util/TemporalEntityBuilder.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalEntityBuilder.kt similarity index 98% rename from search-service/src/main/kotlin/com/egm/stellio/search/util/TemporalEntityBuilder.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalEntityBuilder.kt index e396c052d..2e0315140 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/util/TemporalEntityBuilder.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalEntityBuilder.kt @@ -1,7 +1,8 @@ -package com.egm.stellio.search.util +package com.egm.stellio.search.temporal.util -import com.egm.stellio.search.model.* +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.scope.TemporalScopeBuilder +import com.egm.stellio.search.temporal.model.* import com.egm.stellio.shared.model.ExpandedEntity import com.egm.stellio.shared.model.ExpandedTerm import com.egm.stellio.shared.util.AuthContextModel.AUTH_PROP_SUB @@ -121,7 +122,7 @@ object TemporalEntityBuilder { it.key.datasetId?.let { datasetId -> attributeInstance[NGSILD_DATASET_ID_PROPERTY] = buildNonReifiedPropertyValue(datasetId.toString()) } - val valuesKey = it.key.attributeType.toSimpliedRepresentationKey() + val valuesKey = it.key.attributeType.toSimplifiedRepresentationKey() attributeInstance[valuesKey] = buildExpandedTemporalValue(it.value) { attributeInstanceResult -> attributeInstanceResult as SimplifiedAttributeInstanceResult diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/util/TemporalQueryParamsUtils.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalQueryParamsUtils.kt similarity index 88% rename from search-service/src/main/kotlin/com/egm/stellio/search/util/TemporalQueryParamsUtils.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalQueryParamsUtils.kt index ffb995ef4..26f2e461e 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/util/TemporalQueryParamsUtils.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalQueryParamsUtils.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.util +package com.egm.stellio.search.temporal.util const val TIMEREL_PARAM = "timerel" const val TIMEAT_PARAM = "timeAt" diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/util/EntitiesQueryUtils.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalQueryUtils.kt similarity index 62% rename from search-service/src/main/kotlin/com/egm/stellio/search/util/EntitiesQueryUtils.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalQueryUtils.kt index 4c1790d83..6a537f11c 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/util/EntitiesQueryUtils.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/util/TemporalQueryUtils.kt @@ -1,112 +1,25 @@ -package com.egm.stellio.search.util +package com.egm.stellio.search.temporal.util import arrow.core.* import arrow.core.raise.either -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.TemporalQuery.Aggregate -import com.egm.stellio.search.model.TemporalQuery.Timerel +import com.egm.stellio.search.common.model.Query +import com.egm.stellio.search.entity.util.composeEntitiesQuery +import com.egm.stellio.search.entity.util.composeEntitiesQueryFromPostRequest +import com.egm.stellio.search.entity.util.validateMinimalQueryEntitiesParameters +import com.egm.stellio.search.temporal.model.AttributeInstance +import com.egm.stellio.search.temporal.model.TemporalEntitiesQuery +import com.egm.stellio.search.temporal.model.TemporalQuery import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.BadRequestDataException -import com.egm.stellio.shared.util.* +import com.egm.stellio.shared.util.OptionsParamValue +import com.egm.stellio.shared.util.QUERY_PARAM_OPTIONS +import com.egm.stellio.shared.util.hasValueInOptionsParam +import com.egm.stellio.shared.util.parseTimeParameter import org.springframework.util.MultiValueMap import org.springframework.util.MultiValueMapAdapter import java.time.ZonedDateTime -import java.util.Optional - -fun composeEntitiesQuery( - defaultPagination: ApplicationProperties.Pagination, - requestParams: MultiValueMap, - contexts: List -): Either = either { - val ids = requestParams.getFirst(QUERY_PARAM_ID)?.split(",").orEmpty().toListOfUri().toSet() - val typeSelection = expandTypeSelection(requestParams.getFirst(QUERY_PARAM_TYPE), contexts) - val idPattern = validateIdPattern(requestParams.getFirst(QUERY_PARAM_ID_PATTERN)).bind() - - /** - * Decoding query parameters is not supported by default so a call to a decode function was added query - * with the right parameters values - */ - val q = requestParams.getFirst(QUERY_PARAM_Q)?.decode() - val scopeQ = requestParams.getFirst(QUERY_PARAM_SCOPEQ) - val attrs = parseAndExpandRequestParameter(requestParams.getFirst(QUERY_PARAM_ATTRS), contexts) - val datasetId = parseRequestParameter(requestParams.getFirst(QUERY_PARAM_DATASET_ID)) - val paginationQuery = parsePaginationParameters( - requestParams, - defaultPagination.limitDefault, - defaultPagination.limitMax - ).bind() - - val geoQuery = parseGeoQueryParameters(requestParams.toSingleValueMap(), contexts).bind() - - EntitiesQuery( - ids = ids, - typeSelection = typeSelection, - idPattern = idPattern, - q = q, - scopeQ = scopeQ, - paginationQuery = paginationQuery, - attrs = attrs, - datasetId = datasetId, - geoQuery = geoQuery, - contexts = contexts - ) -} - -fun EntitiesQuery.validateMinimalQueryEntitiesParameters(): Either = either { - if ( - geoQuery == null && - q.isNullOrEmpty() && - typeSelection.isNullOrEmpty() && - attrs.isEmpty() - ) - return@either BadRequestDataException( - "One of 'type', 'attrs', 'q', 'geoQ' must be provided in the query" - ).left().bind() - - this@validateMinimalQueryEntitiesParameters -} - -fun composeEntitiesQueryFromPostRequest( - defaultPagination: ApplicationProperties.Pagination, - query: Query, - requestParams: MultiValueMap, - contexts: List -): Either = either { - val entitySelector = query.entities?.get(0) - val typeSelection = expandTypeSelection(entitySelector?.typeSelection, contexts) - val idPattern = validateIdPattern(entitySelector?.idPattern).bind() - val attrs = query.attrs.orEmpty().map { JsonLdUtils.expandJsonLdTerm(it.trim(), contexts) }.toSet() - val datasetId = query.datasetId.orEmpty().toSet() - val geoQuery = if (query.geoQ != null) { - val geoQueryElements = mapOf( - "geometry" to query.geoQ.geometry, - "coordinates" to query.geoQ.coordinates.toString(), - "georel" to query.geoQ.georel, - "geoproperty" to query.geoQ.geoproperty - ) - parseGeoQueryParameters(geoQueryElements, contexts).bind() - } else null - - val paginationQuery = parsePaginationParameters( - requestParams, - defaultPagination.limitDefault, - defaultPagination.limitMax - ).bind() - - EntitiesQuery( - ids = setOfNotNull(entitySelector?.id), - typeSelection = typeSelection, - idPattern = idPattern, - q = query.q?.decode(), - scopeQ = query.scopeQ, - paginationQuery = paginationQuery, - attrs = attrs, - datasetId = datasetId, - geoQuery = geoQuery, - contexts = contexts - ) -} +import java.util.* fun composeTemporalEntitiesQuery( defaultPagination: ApplicationProperties.Pagination, @@ -228,15 +141,15 @@ fun buildTemporalQuery( return BadRequestDataException(it).left() } - if (timerel == Timerel.BETWEEN && endTimeAtParam == null) + if (timerel == TemporalQuery.Timerel.BETWEEN && endTimeAtParam == null) return BadRequestDataException("'endTimeAt' request parameter is mandatory if 'timerel' is 'between'").left() if (withAggregatedValues && aggrMethodsParam == null) return BadRequestDataException("'aggrMethods' is mandatory if 'aggregatedValues' option is specified").left() val aggregate = aggrMethodsParam?.split(",")?.map { - if (Aggregate.isSupportedAggregate(it)) - Aggregate.forMethod(it)!! + if (TemporalQuery.Aggregate.isSupportedAggregate(it)) + TemporalQuery.Aggregate.forMethod(it)!! else return BadRequestDataException( "'$it' is not a recognized aggregation method for 'aggrMethods' parameter" @@ -264,13 +177,13 @@ fun buildTimerelAndTime( timerelParam: String?, timeAtParam: String?, inQueryEntities: Boolean -): Either> = +): Either> = // when querying a specific temporal entity, timeAt and timerel are optional if (timerelParam == null && timeAtParam == null && !inQueryEntities) { Pair(null, null).right() } else if (timerelParam != null && timeAtParam != null) { val timeRelResult = try { - Timerel.valueOf(timerelParam.uppercase()).right() + TemporalQuery.Timerel.valueOf(timerelParam.uppercase()).right() } catch (e: IllegalArgumentException) { "'timerel' is not valid, it should be one of 'before', 'between', or 'after'".left() } diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalApiResponses.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalApiResponses.kt similarity index 94% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalApiResponses.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalApiResponses.kt index aa8646358..4fc12e749 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalApiResponses.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalApiResponses.kt @@ -1,7 +1,7 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.temporal.web -import com.egm.stellio.search.model.TemporalEntitiesQuery -import com.egm.stellio.search.model.TemporalQuery +import com.egm.stellio.search.temporal.model.TemporalEntitiesQuery +import com.egm.stellio.search.temporal.model.TemporalQuery import com.egm.stellio.shared.model.CompactedEntity import com.egm.stellio.shared.model.toFinalRepresentation import com.egm.stellio.shared.util.JsonUtils.serializeObject diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalEntityHandler.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandler.kt similarity index 93% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalEntityHandler.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandler.kt index 285d6f1d0..1c5a43b59 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalEntityHandler.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandler.kt @@ -1,17 +1,17 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.temporal.web import arrow.core.Either import arrow.core.left import arrow.core.raise.either import arrow.core.right -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.service.AttributeInstanceService -import com.egm.stellio.search.service.EntityPayloadService -import com.egm.stellio.search.service.QueryService -import com.egm.stellio.search.service.TemporalEntityAttributeService -import com.egm.stellio.search.util.composeTemporalEntitiesQuery -import com.egm.stellio.search.web.TemporalApiResponses.buildEntitiesTemporalResponse -import com.egm.stellio.search.web.TemporalApiResponses.buildEntityTemporalResponse +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.entity.service.EntityAttributeService +import com.egm.stellio.search.entity.service.EntityPayloadService +import com.egm.stellio.search.temporal.service.AttributeInstanceService +import com.egm.stellio.search.temporal.service.TemporalQueryService +import com.egm.stellio.search.temporal.util.composeTemporalEntitiesQuery +import com.egm.stellio.search.temporal.web.TemporalApiResponses.buildEntitiesTemporalResponse +import com.egm.stellio.search.temporal.web.TemporalApiResponses.buildEntityTemporalResponse import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* @@ -38,8 +38,8 @@ import java.net.URI class TemporalEntityHandler( private val entityPayloadService: EntityPayloadService, private val attributeInstanceService: AttributeInstanceService, - private val temporalEntityAttributeService: TemporalEntityAttributeService, - private val queryService: QueryService, + private val entityAttributeService: EntityAttributeService, + private val temporalQueryService: TemporalQueryService, private val authorizationService: AuthorizationService, private val applicationProperties: ApplicationProperties ) : BaseHandler() { @@ -154,7 +154,7 @@ class TemporalEntityHandler( val accessRightFilter = authorizationService.computeAccessRightFilter(sub) - val (temporalEntities, total, range) = queryService.queryTemporalEntities( + val (temporalEntities, total, range) = temporalQueryService.queryTemporalEntities( temporalEntitiesQuery, accessRightFilter ).bind() @@ -197,7 +197,7 @@ class TemporalEntityHandler( val temporalEntitiesQuery = composeTemporalEntitiesQuery(applicationProperties.pagination, params, contexts).bind() - val (temporalEntity, range) = queryService.queryTemporalEntity(entityId, temporalEntitiesQuery).bind() + val (temporalEntity, range) = temporalQueryService.queryTemporalEntity(entityId, temporalEntitiesQuery).bind() val compactedEntity = compactEntity(temporalEntity, contexts) @@ -296,7 +296,7 @@ class TemporalEntityHandler( attrId.checkNameIsNgsiLdSupported().bind() val expandedAttrId = expandJsonLdTerm(attrId, contexts) - temporalEntityAttributeService.checkEntityAndAttributeExistence( + entityAttributeService.checkEntityAndAttributeExistence( entityId, expandedAttrId, datasetId diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalEntityOperationsHandler.kt b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityOperationsHandler.kt similarity index 80% rename from search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalEntityOperationsHandler.kt rename to search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityOperationsHandler.kt index d7a105d11..10a314854 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/web/TemporalEntityOperationsHandler.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityOperationsHandler.kt @@ -1,11 +1,11 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.temporal.web import arrow.core.raise.either -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.model.Query -import com.egm.stellio.search.service.QueryService -import com.egm.stellio.search.util.composeTemporalEntitiesQueryFromPostRequest -import com.egm.stellio.search.web.TemporalApiResponses.buildEntitiesTemporalResponse +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.common.model.Query +import com.egm.stellio.search.temporal.service.TemporalQueryService +import com.egm.stellio.search.temporal.util.composeTemporalEntitiesQueryFromPostRequest +import com.egm.stellio.search.temporal.web.TemporalApiResponses.buildEntitiesTemporalResponse import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.util.* import com.egm.stellio.shared.util.JsonLdUtils.compactEntities @@ -20,7 +20,7 @@ import reactor.core.publisher.Mono @RestController @RequestMapping("/ngsi-ld/v1/temporal/entityOperations") class TemporalEntityOperationsHandler( - private val queryService: QueryService, + private val temporalQueryService: TemporalQueryService, private val authorizationService: AuthorizationService, private val applicationProperties: ApplicationProperties ) { @@ -49,7 +49,7 @@ class TemporalEntityOperationsHandler( val accessRightFilter = authorizationService.computeAccessRightFilter(sub) - val (temporalEntities, total, range) = queryService.queryTemporalEntities( + val (temporalEntities, total, range) = temporalQueryService.queryTemporalEntities( temporalEntitiesQuery, accessRightFilter ).bind() diff --git a/search-service/src/main/kotlin/db/migration/V0_29__JsonLd_migration.kt b/search-service/src/main/kotlin/db/migration/V0_29__JsonLd_migration.kt index badc28eb9..15e2f10c2 100644 --- a/search-service/src/main/kotlin/db/migration/V0_29__JsonLd_migration.kt +++ b/search-service/src/main/kotlin/db/migration/V0_29__JsonLd_migration.kt @@ -1,10 +1,10 @@ package db.migration import arrow.core.Either -import com.egm.stellio.search.model.AttributeInstance -import com.egm.stellio.search.model.TemporalEntityAttribute -import com.egm.stellio.search.util.guessPropertyValueType -import com.egm.stellio.search.util.toTemporalAttributeMetadata +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.temporal.model.AttributeInstance +import com.egm.stellio.search.temporal.util.guessPropertyValueType +import com.egm.stellio.search.temporal.util.toTemporalAttributeMetadata import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.AuthContextModel import com.egm.stellio.shared.util.AuthContextModel.AUTH_PROP_SAP diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/listener/IAMListenerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/listener/IAMListenerTests.kt similarity index 96% rename from search-service/src/test/kotlin/com/egm/stellio/search/listener/IAMListenerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/authorization/listener/IAMListenerTests.kt index d867a7b21..4e42fddb8 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/listener/IAMListenerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/listener/IAMListenerTests.kt @@ -1,12 +1,12 @@ -package com.egm.stellio.search.listener +package com.egm.stellio.search.authorization.listener import arrow.core.right -import com.egm.stellio.search.authorization.EntityAccessRightsService -import com.egm.stellio.search.authorization.SubjectReferentialService -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.service.EntityEventService -import com.egm.stellio.search.service.EntityPayloadService +import com.egm.stellio.search.authorization.service.EntityAccessRightsService +import com.egm.stellio.search.authorization.service.SubjectReferentialService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.service.EntityEventService +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.shared.util.GlobalRole import com.egm.stellio.shared.util.SubjectType import com.egm.stellio.shared.util.loadSampleData diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/authorization/AuthorizationServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/AuthorizationServiceTests.kt similarity index 95% rename from search-service/src/test/kotlin/com/egm/stellio/search/authorization/AuthorizationServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/AuthorizationServiceTests.kt index 663ed1dbf..febd20e8f 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/authorization/AuthorizationServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/AuthorizationServiceTests.kt @@ -1,7 +1,7 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.None -import com.egm.stellio.search.model.EntitiesQuery +import com.egm.stellio.search.entity.model.EntitiesQuery import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.PaginationQuery import com.egm.stellio.shared.util.AUTHZ_TEST_COMPOUND_CONTEXTS diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/authorization/EnabledAuthorizationServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/EnabledAuthorizationServiceTests.kt similarity index 98% rename from search-service/src/test/kotlin/com/egm/stellio/search/authorization/EnabledAuthorizationServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/EnabledAuthorizationServiceTests.kt index 7442ae12e..63f309620 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/authorization/EnabledAuthorizationServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/EnabledAuthorizationServiceTests.kt @@ -1,10 +1,13 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.Either import arrow.core.Some import arrow.core.right -import com.egm.stellio.search.authorization.EntityAccessRights.SubjectRightInfo -import com.egm.stellio.search.model.EntitiesQuery +import com.egm.stellio.search.authorization.model.EntityAccessRights +import com.egm.stellio.search.authorization.model.EntityAccessRights.SubjectRightInfo +import com.egm.stellio.search.authorization.model.Group +import com.egm.stellio.search.authorization.model.User +import com.egm.stellio.search.entity.model.EntitiesQuery import com.egm.stellio.shared.model.AccessDeniedException import com.egm.stellio.shared.model.PaginationQuery import com.egm.stellio.shared.util.* diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/authorization/EntityAccessRightsServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/EntityAccessRightsServiceTests.kt similarity index 98% rename from search-service/src/test/kotlin/com/egm/stellio/search/authorization/EntityAccessRightsServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/EntityAccessRightsServiceTests.kt index 1b3b816c4..3bdd458d9 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/authorization/EntityAccessRightsServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/EntityAccessRightsServiceTests.kt @@ -1,9 +1,14 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.Some import arrow.core.right -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.service.EntityPayloadService +import com.egm.stellio.search.authorization.getSubjectInfoForClient +import com.egm.stellio.search.authorization.getSubjectInfoForGroup +import com.egm.stellio.search.authorization.getSubjectInfoForUser +import com.egm.stellio.search.authorization.model.SubjectAccessRight +import com.egm.stellio.search.authorization.model.SubjectReferential +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.search.support.WithTimescaleContainer import com.egm.stellio.shared.model.AccessDeniedException import com.egm.stellio.shared.model.ExpandedTerm diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/authorization/SubjectReferentialServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/SubjectReferentialServiceTests.kt similarity index 98% rename from search-service/src/test/kotlin/com/egm/stellio/search/authorization/SubjectReferentialServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/SubjectReferentialServiceTests.kt index 3fac48ba3..11a990b98 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/authorization/SubjectReferentialServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/service/SubjectReferentialServiceTests.kt @@ -1,6 +1,9 @@ -package com.egm.stellio.search.authorization +package com.egm.stellio.search.authorization.service import arrow.core.Some +import com.egm.stellio.search.authorization.getSubjectInfoForGroup +import com.egm.stellio.search.authorization.getSubjectInfoForUser +import com.egm.stellio.search.authorization.model.SubjectReferential import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.search.support.WithTimescaleContainer import com.egm.stellio.shared.model.AccessDeniedException diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/AnonymousUserHandlerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/web/AnonymousUserHandlerTests.kt similarity index 66% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/AnonymousUserHandlerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/authorization/web/AnonymousUserHandlerTests.kt index d80f2b957..f618d7631 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/AnonymousUserHandlerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/web/AnonymousUserHandlerTests.kt @@ -1,11 +1,13 @@ -package com.egm.stellio.search.web - -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.service.EntityEventService -import com.egm.stellio.search.service.EntityPayloadService -import com.egm.stellio.search.service.QueryService -import com.egm.stellio.search.service.TemporalEntityAttributeService +package com.egm.stellio.search.authorization.web + +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.service.EntityAttributeService +import com.egm.stellio.search.entity.service.EntityEventService +import com.egm.stellio.search.entity.service.EntityPayloadService +import com.egm.stellio.search.entity.service.EntityQueryService +import com.egm.stellio.search.entity.web.EntityHandler +import com.egm.stellio.search.temporal.service.TemporalQueryService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.util.AQUAC_HEADER_LINK import com.ninjasquad.springmockk.MockkBean @@ -31,10 +33,10 @@ class AnonymousUserHandlerTests { private lateinit var entityPayloadService: EntityPayloadService @MockkBean - private lateinit var temporalEntityAttributeService: TemporalEntityAttributeService + private lateinit var entityAttributeService: EntityAttributeService @MockkBean - private lateinit var queryService: QueryService + private lateinit var queryService: TemporalQueryService @MockkBean(relaxed = true) private lateinit var authorizationService: AuthorizationService @@ -42,6 +44,9 @@ class AnonymousUserHandlerTests { @MockkBean private lateinit var entityEventService: EntityEventService + @MockkBean + private lateinit var entityQueryService: EntityQueryService + @Test @WithAnonymousUser fun `it should not authorize an anonymous to call the API`() { diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/EntityAccessControlHandlerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/web/EntityAccessControlHandlerTests.kt similarity index 98% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/EntityAccessControlHandlerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/authorization/web/EntityAccessControlHandlerTests.kt index 7721f753a..d3efd953c 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/EntityAccessControlHandlerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/authorization/web/EntityAccessControlHandlerTests.kt @@ -1,13 +1,13 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.authorization.web import arrow.core.left import arrow.core.right -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.authorization.EntityAccessRights -import com.egm.stellio.search.authorization.EntityAccessRightsService -import com.egm.stellio.search.authorization.User -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.service.EntityPayloadService +import com.egm.stellio.search.authorization.model.EntityAccessRights +import com.egm.stellio.search.authorization.model.User +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.authorization.service.EntityAccessRightsService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/AttributeServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/discovery/service/AttributeServiceTests.kt similarity index 95% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/AttributeServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/discovery/service/AttributeServiceTests.kt index 324692660..41b3415ce 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/AttributeServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/discovery/service/AttributeServiceTests.kt @@ -1,14 +1,17 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.discovery.service import arrow.core.Either -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.AttributeType +import com.egm.stellio.search.common.util.execute +import com.egm.stellio.search.common.util.toUri +import com.egm.stellio.search.discovery.model.AttributeDetails +import com.egm.stellio.search.discovery.model.AttributeType +import com.egm.stellio.search.discovery.model.AttributeTypeInfo +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.search.support.WithKafkaContainer import com.egm.stellio.search.support.WithTimescaleContainer import com.egm.stellio.search.support.gimmeEntityPayload -import com.egm.stellio.search.util.execute -import com.egm.stellio.search.util.toUri import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.ResourceNotFoundException import com.egm.stellio.shared.util.* diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityTypeServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/discovery/service/EntityTypeServiceTests.kt similarity index 95% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/EntityTypeServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/discovery/service/EntityTypeServiceTests.kt index 7e1adb21e..66c3dc665 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityTypeServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/discovery/service/EntityTypeServiceTests.kt @@ -1,14 +1,18 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.discovery.service import arrow.core.Either -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.AttributeType +import com.egm.stellio.search.common.util.execute +import com.egm.stellio.search.common.util.toUri +import com.egm.stellio.search.discovery.model.AttributeInfo +import com.egm.stellio.search.discovery.model.AttributeType +import com.egm.stellio.search.discovery.model.EntityType +import com.egm.stellio.search.discovery.model.EntityTypeInfo +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.search.support.WithKafkaContainer import com.egm.stellio.search.support.WithTimescaleContainer import com.egm.stellio.search.support.gimmeEntityPayload -import com.egm.stellio.search.util.execute -import com.egm.stellio.search.util.toUri import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.ResourceNotFoundException import com.egm.stellio.shared.util.* diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/AttributeHandlerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/discovery/web/AttributeHandlerTests.kt similarity index 95% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/AttributeHandlerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/discovery/web/AttributeHandlerTests.kt index 8cf090d52..0c8ee037c 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/AttributeHandlerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/discovery/web/AttributeHandlerTests.kt @@ -1,13 +1,13 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.discovery.web import arrow.core.left import arrow.core.right -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.model.AttributeDetails -import com.egm.stellio.search.model.AttributeList -import com.egm.stellio.search.model.AttributeType -import com.egm.stellio.search.model.AttributeTypeInfo -import com.egm.stellio.search.service.AttributeService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.discovery.model.AttributeDetails +import com.egm.stellio.search.discovery.model.AttributeList +import com.egm.stellio.search.discovery.model.AttributeType +import com.egm.stellio.search.discovery.model.AttributeTypeInfo +import com.egm.stellio.search.discovery.service.AttributeService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.ResourceNotFoundException import com.egm.stellio.shared.util.* diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/EntityTypeHandlerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/discovery/web/EntityTypeHandlerTests.kt similarity index 97% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/EntityTypeHandlerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/discovery/web/EntityTypeHandlerTests.kt index 4f8425445..d2f3770a6 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/EntityTypeHandlerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/discovery/web/EntityTypeHandlerTests.kt @@ -1,11 +1,11 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.discovery.web import arrow.core.left import arrow.core.right -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.AttributeType -import com.egm.stellio.search.service.EntityTypeService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.discovery.model.* +import com.egm.stellio.search.discovery.model.AttributeType +import com.egm.stellio.search.discovery.service.EntityTypeService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.ResourceNotFoundException import com.egm.stellio.shared.util.* diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/listener/ObservationEventListenerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/listener/ObservationEventListenerTests.kt similarity index 95% rename from search-service/src/test/kotlin/com/egm/stellio/search/listener/ObservationEventListenerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/listener/ObservationEventListenerTests.kt index ff5c18f1b..9f5a6dade 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/listener/ObservationEventListenerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/listener/ObservationEventListenerTests.kt @@ -1,12 +1,12 @@ -package com.egm.stellio.search.listener +package com.egm.stellio.search.entity.listener import arrow.core.right -import com.egm.stellio.search.model.NotUpdatedDetails -import com.egm.stellio.search.model.UpdateOperationResult -import com.egm.stellio.search.model.UpdateResult -import com.egm.stellio.search.model.UpdatedDetails -import com.egm.stellio.search.service.EntityEventService -import com.egm.stellio.search.service.EntityPayloadService +import com.egm.stellio.search.entity.model.NotUpdatedDetails +import com.egm.stellio.search.entity.model.UpdateOperationResult +import com.egm.stellio.search.entity.model.UpdateResult +import com.egm.stellio.search.entity.model.UpdatedDetails +import com.egm.stellio.search.entity.service.EntityEventService +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.shared.model.ExpandedEntity import com.egm.stellio.shared.model.NgsiLdEntity import com.egm.stellio.shared.util.BEEHIVE_TYPE diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/model/EntityModelTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/model/EntityModelTests.kt similarity index 97% rename from search-service/src/test/kotlin/com/egm/stellio/search/model/EntityModelTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/model/EntityModelTests.kt index 89d30032a..3ff05ab8d 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/model/EntityModelTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/model/EntityModelTests.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.entity.model import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.shared.util.AuthContextModel diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/model/UpdateResultTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/model/UpdateResultTests.kt similarity index 98% rename from search-service/src/test/kotlin/com/egm/stellio/search/model/UpdateResultTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/model/UpdateResultTests.kt index 69cc52ba3..d46951752 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/model/UpdateResultTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/model/UpdateResultTests.kt @@ -1,4 +1,4 @@ -package com.egm.stellio.search.model +package com.egm.stellio.search.entity.model import com.egm.stellio.shared.util.toUri import org.junit.jupiter.api.Assertions.assertFalse diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityEventServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityEventServiceTests.kt similarity index 98% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/EntityEventServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityEventServiceTests.kt index 851f242ef..4f768c839 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityEventServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityEventServiceTests.kt @@ -1,10 +1,10 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.right -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.model.UpdateOperationResult -import com.egm.stellio.search.model.UpdateResult -import com.egm.stellio.search.model.UpdatedDetails +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.UpdateOperationResult +import com.egm.stellio.search.entity.model.UpdateResult +import com.egm.stellio.search.entity.model.UpdatedDetails import com.egm.stellio.search.support.EMPTY_PAYLOAD import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.AQUAC_COMPOUND_CONTEXT diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityOperationServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityOperationServiceTests.kt similarity index 95% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/EntityOperationServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityOperationServiceTests.kt index 27bbc5cbd..9736309fc 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityOperationServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityOperationServiceTests.kt @@ -1,14 +1,14 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.left import arrow.core.right -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.model.EMPTY_UPDATE_RESULT -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.model.NotUpdatedDetails -import com.egm.stellio.search.model.UpdateResult -import com.egm.stellio.search.web.BatchEntityError -import com.egm.stellio.search.web.BatchEntitySuccess +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.entity.model.EMPTY_UPDATE_RESULT +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.NotUpdatedDetails +import com.egm.stellio.search.entity.model.UpdateResult +import com.egm.stellio.search.entity.web.BatchEntityError +import com.egm.stellio.search.entity.web.BatchEntitySuccess import com.egm.stellio.shared.model.BadRequestDataException import com.egm.stellio.shared.model.ExpandedEntity import com.egm.stellio.shared.model.InternalErrorException @@ -35,7 +35,7 @@ class EntityOperationServiceTests { private lateinit var entityPayloadService: EntityPayloadService @MockkBean(relaxed = true) - private lateinit var temporalEntityAttributeService: TemporalEntityAttributeService + private lateinit var entityAttributeService: EntityAttributeService @MockkBean private lateinit var authorizationService: AuthorizationService @@ -308,7 +308,7 @@ class EntityOperationServiceTests { @Test fun `batch replace should ask to replace entities`() = runTest { coEvery { - temporalEntityAttributeService.deleteTemporalAttributesOfEntity(any()) + entityAttributeService.deleteTemporalAttributesOfEntity(any()) } returns Unit.right() coEvery { entityPayloadService.appendAttributes(any(), any(), any(), any()) @@ -329,8 +329,8 @@ class EntityOperationServiceTests { ) assertTrue(batchOperationResult.errors.isEmpty()) - coVerify { temporalEntityAttributeService.deleteTemporalAttributesOfEntity(firstEntityURI) } - coVerify { temporalEntityAttributeService.deleteTemporalAttributesOfEntity(secondEntityURI) } + coVerify { entityAttributeService.deleteTemporalAttributesOfEntity(firstEntityURI) } + coVerify { entityAttributeService.deleteTemporalAttributesOfEntity(secondEntityURI) } coVerify { entityPayloadService.appendAttributes(eq(firstEntityURI), any(), false, sub) } diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityQueryServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityPayloadServiceQueryTests.kt similarity index 97% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/EntityQueryServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityPayloadServiceQueryTests.kt index 8afce0713..8faec4ac6 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityQueryServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityPayloadServiceQueryTests.kt @@ -1,10 +1,12 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.right -import com.egm.stellio.search.model.EntitiesQuery -import com.egm.stellio.search.model.EntityPayload +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.model.EntitiesQuery +import com.egm.stellio.search.entity.model.EntityPayload import com.egm.stellio.search.support.WithKafkaContainer import com.egm.stellio.search.support.WithTimescaleContainer +import com.egm.stellio.search.temporal.service.AttributeInstanceService import com.egm.stellio.shared.model.GeoQuery import com.egm.stellio.shared.model.PaginationQuery import com.egm.stellio.shared.util.* @@ -20,6 +22,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.CsvSource import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.test.context.SpringBootTest import org.springframework.data.r2dbc.core.R2dbcEntityTemplate import org.springframework.data.relational.core.query.Criteria @@ -30,7 +33,8 @@ import java.net.URI @SpringBootTest @ActiveProfiles("test") -class EntityQueryServiceTests : WithTimescaleContainer, WithKafkaContainer { +@EnableConfigurationProperties(SearchProperties::class) +class EntityPayloadServiceQueryTests : WithTimescaleContainer, WithKafkaContainer { @Autowired private lateinit var entityPayloadService: EntityPayloadService diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityPayloadServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityPayloadServiceTests.kt similarity index 91% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/EntityPayloadServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityPayloadServiceTests.kt index 6aa967ea6..b969f777a 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/EntityPayloadServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityPayloadServiceTests.kt @@ -1,12 +1,12 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.right -import com.egm.stellio.search.model.* +import com.egm.stellio.search.common.util.deserializeAsMap +import com.egm.stellio.search.entity.model.* import com.egm.stellio.search.support.EMPTY_PAYLOAD import com.egm.stellio.search.support.WithKafkaContainer import com.egm.stellio.search.support.WithTimescaleContainer import com.egm.stellio.search.support.buildSapAttribute -import com.egm.stellio.search.util.deserializeAsMap import com.egm.stellio.shared.model.AlreadyExistsException import com.egm.stellio.shared.model.ResourceNotFoundException import com.egm.stellio.shared.util.* @@ -43,7 +43,7 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { private lateinit var entityPayloadService: EntityPayloadService @MockkBean - private lateinit var temporalEntityAttributeService: TemporalEntityAttributeService + private lateinit var entityAttributeService: EntityAttributeService @Autowired private lateinit var r2dbcEntityTemplate: R2dbcEntityTemplate @@ -143,7 +143,7 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { @Test fun `it should only create an entity payload for a minimal entity`() = runTest { coEvery { - temporalEntityAttributeService.createEntityTemporalReferences(any(), any(), any(), any(), any()) + entityAttributeService.createEntityAttributes(any(), any(), any(), any(), any()) } returns Unit.right() val (expandedEntity, ngsiLdEntity) = @@ -162,7 +162,7 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { } coVerify { - temporalEntityAttributeService.createEntityTemporalReferences( + entityAttributeService.createEntityAttributes( any(), any(), emptyList(), @@ -194,16 +194,16 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { @Test fun `it should merge an entity`() = runTest { coEvery { - temporalEntityAttributeService.createEntityTemporalReferences(any(), any(), any(), any(), any()) + entityAttributeService.createEntityAttributes(any(), any(), any(), any(), any()) } returns Unit.right() coEvery { - temporalEntityAttributeService.mergeEntityAttributes(any(), any(), any(), any(), any(), any()) + entityAttributeService.mergeEntityAttributes(any(), any(), any(), any(), any(), any()) } returns UpdateResult( listOf(UpdatedDetails(INCOMING_PROPERTY, null, UpdateOperationResult.APPENDED)), emptyList() ).right() coEvery { - temporalEntityAttributeService.getForEntity(any(), any(), any()) + entityAttributeService.getForEntity(any(), any(), any()) } returns emptyList() val (expandedEntity, ngsiLdEntity) = @@ -230,14 +230,14 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { } coVerify { - temporalEntityAttributeService.createEntityTemporalReferences( + entityAttributeService.createEntityAttributes( any(), any(), emptyList(), any(), eq("0123456789-1234-5678-987654321") ) - temporalEntityAttributeService.mergeEntityAttributes( + entityAttributeService.mergeEntityAttributes( eq(beehiveTestCId), any(), any(), @@ -245,7 +245,7 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { any(), eq("0123456789-1234-5678-987654321") ) - temporalEntityAttributeService.getForEntity( + entityAttributeService.getForEntity( eq(beehiveTestCId), emptySet(), emptySet() @@ -256,16 +256,16 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { @Test fun `it should merge an entity with new types`() = runTest { coEvery { - temporalEntityAttributeService.createEntityTemporalReferences(any(), any(), any(), any(), any()) + entityAttributeService.createEntityAttributes(any(), any(), any(), any(), any()) } returns Unit.right() coEvery { - temporalEntityAttributeService.mergeEntityAttributes(any(), any(), any(), any(), any(), any()) + entityAttributeService.mergeEntityAttributes(any(), any(), any(), any(), any(), any()) } returns UpdateResult( listOf(UpdatedDetails(INCOMING_PROPERTY, null, UpdateOperationResult.APPENDED)), emptyList() ).right() coEvery { - temporalEntityAttributeService.getForEntity(any(), any(), any()) + entityAttributeService.getForEntity(any(), any(), any()) } returns emptyList() val (expandedEntity, ngsiLdEntity) = @@ -298,19 +298,19 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { @Test fun `it should merge an entity with new types and scopes`() = runTest { coEvery { - temporalEntityAttributeService.createEntityTemporalReferences(any(), any(), any(), any(), any()) + entityAttributeService.createEntityAttributes(any(), any(), any(), any(), any()) } returns Unit.right() coEvery { - temporalEntityAttributeService.mergeEntityAttributes(any(), any(), any(), any(), any(), any()) + entityAttributeService.mergeEntityAttributes(any(), any(), any(), any(), any(), any()) } returns UpdateResult( listOf(UpdatedDetails(INCOMING_PROPERTY, null, UpdateOperationResult.APPENDED)), emptyList() ).right() coEvery { - temporalEntityAttributeService.partialUpdateEntityAttribute(any(), any(), any(), any()) + entityAttributeService.partialUpdateEntityAttribute(any(), any(), any(), any()) } returns EMPTY_UPDATE_RESULT.right() coEvery { - temporalEntityAttributeService.getForEntity(any(), any(), any()) + entityAttributeService.getForEntity(any(), any(), any()) } returns emptyList() val (expandedEntity, ngsiLdEntity) = @@ -353,9 +353,9 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { fun `it should replace an entity`() = runTest { val beehiveURI = "urn:ngsi-ld:BeeHive:TESTC".toUri() coEvery { - temporalEntityAttributeService.createEntityTemporalReferences(any(), any(), any(), any(), any()) + entityAttributeService.createEntityAttributes(any(), any(), any(), any(), any()) } returns Unit.right() - coEvery { temporalEntityAttributeService.deleteTemporalAttributesOfEntity(any()) } returns Unit.right() + coEvery { entityAttributeService.deleteTemporalAttributesOfEntity(any()) } returns Unit.right() val (expandedEntity, ngsiLdEntity) = loadAndPrepareSampleData("beehive_minimal.jsonld").shouldSucceedAndResult() @@ -382,8 +382,8 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { } coVerify { - temporalEntityAttributeService.deleteTemporalAttributesOfEntity(beehiveURI) - temporalEntityAttributeService.createEntityTemporalReferences( + entityAttributeService.deleteTemporalAttributesOfEntity(beehiveURI) + entityAttributeService.createEntityAttributes( any(), any(), emptyList(), @@ -395,9 +395,9 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { @Test fun `it should replace an attribute`() = runTest { - coEvery { temporalEntityAttributeService.getForEntity(any(), any(), any()) } returns emptyList() + coEvery { entityAttributeService.getForEntity(any(), any(), any()) } returns emptyList() coEvery { - temporalEntityAttributeService.replaceEntityAttribute(any(), any(), any(), any(), any()) + entityAttributeService.replaceEntityAttribute(any(), any(), any(), any(), any()) } returns UpdateResult( updated = listOf(UpdatedDetails(INCOMING_PROPERTY, null, UpdateOperationResult.REPLACED)), notUpdated = emptyList() @@ -658,7 +658,7 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { @Test fun `it should delete an entity payload`() = runTest { - coEvery { temporalEntityAttributeService.deleteTemporalAttributesOfEntity(any()) } returns Unit.right() + coEvery { entityAttributeService.deleteTemporalAttributesOfEntity(any()) } returns Unit.right() loadMinimalEntity(entity01Uri, setOf(BEEHIVE_TYPE)) .sampleDataToNgsiLdEntity() @@ -691,10 +691,10 @@ class EntityPayloadServiceTests : WithTimescaleContainer, WithKafkaContainer { @Test fun `it should remove the scopes from an entity`() = runTest { coEvery { - temporalEntityAttributeService.addAttribute(any(), any(), any(), any(), any(), any()) + entityAttributeService.addAttribute(any(), any(), any(), any(), any(), any()) } returns Unit.right() coEvery { - temporalEntityAttributeService.getForEntity(any(), any(), any()) + entityAttributeService.getForEntity(any(), any(), any()) } returns emptyList() loadSampleData("beehive_with_scope.jsonld") diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityQueryServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityQueryServiceTests.kt new file mode 100644 index 000000000..9c51a6175 --- /dev/null +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/EntityQueryServiceTests.kt @@ -0,0 +1,86 @@ +package com.egm.stellio.search.entity.service + +import arrow.core.left +import arrow.core.right +import com.egm.stellio.search.support.* +import com.egm.stellio.shared.model.ResourceNotFoundException +import com.egm.stellio.shared.util.* +import com.ninjasquad.springmockk.MockkBean +import io.mockk.coEvery +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ActiveProfiles +import java.net.URI + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = [EntityQueryService::class]) +@ActiveProfiles("test") +@ExperimentalCoroutinesApi +class EntityQueryServiceTests { + + @Autowired + private lateinit var queryService: EntityQueryService + + @MockkBean + private lateinit var entityPayloadService: EntityPayloadService + + private val entityUri = "urn:ngsi-ld:BeeHive:TESTC".toUri() + + @Test + fun `it should return a JSON-LD entity when querying by id`() = runTest { + coEvery { entityPayloadService.retrieve(any()) } returns gimmeEntityPayload().right() + + queryService.queryEntity(entityUri) + .shouldSucceedWith { + assertEquals(entityUri.toString(), it.id) + assertEquals(listOf(BEEHIVE_TYPE), it.types) + assertEquals(7, it.members.size) + } + } + + @Test + fun `it should return an API exception if no entity exists with the given id`() = runTest { + coEvery { entityPayloadService.retrieve(any()) } returns ResourceNotFoundException("").left() + + queryService.queryEntity(entityUri) + .shouldFail { + assertTrue(it is ResourceNotFoundException) + } + } + + @Test + fun `it should return a list of JSON-LD entities when querying entities`() = runTest { + coEvery { entityPayloadService.queryEntities(any(), any()) } returns listOf(entityUri) + coEvery { entityPayloadService.queryEntitiesCount(any(), any()) } returns 1.right() + coEvery { entityPayloadService.retrieve(any>()) } returns listOf(gimmeEntityPayload()) + + queryService.queryEntities(buildDefaultQueryParams()) { null } + .shouldSucceedWith { + assertEquals(1, it.second) + assertEquals(entityUri.toString(), it.first[0].id) + assertEquals(listOf(BEEHIVE_TYPE), it.first[0].types) + assertEquals(7, it.first[0].members.size) + } + } + + @Test + fun `it should return an empty list if no entity matched the query`() = runTest { + coEvery { entityPayloadService.queryEntities(any(), any()) } returns emptyList() + coEvery { entityPayloadService.queryEntitiesCount(any(), any()) } returns 0.right() + + queryService.queryEntities(buildDefaultQueryParams()) { null } + .shouldSucceedWith { + assertEquals(0, it.second) + assertTrue(it.first.isEmpty()) + } + } + + private fun gimmeEntityPayload() = + gimmeEntityPayload( + entityId = entityUri, + payload = loadSampleData("beehive_expanded.jsonld") + ) +} diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/TemporalEntityAttributeServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/TemporalEntityAttributeServiceTests.kt similarity index 85% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/TemporalEntityAttributeServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/service/TemporalEntityAttributeServiceTests.kt index 511b12d5b..6653bc1d3 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/TemporalEntityAttributeServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/service/TemporalEntityAttributeServiceTests.kt @@ -1,10 +1,15 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.entity.service import arrow.core.right -import com.egm.stellio.search.model.* +import com.egm.stellio.search.entity.model.AttributeMetadata +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.entity.model.UpdateOperationResult import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.search.support.WithKafkaContainer import com.egm.stellio.search.support.WithTimescaleContainer +import com.egm.stellio.search.temporal.model.AttributeInstance +import com.egm.stellio.search.temporal.service.AttributeInstanceService import com.egm.stellio.shared.model.ResourceNotFoundException import com.egm.stellio.shared.model.toNgsiLdAttribute import com.egm.stellio.shared.model.toNgsiLdAttributes @@ -38,7 +43,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon @Autowired @SpykBean - private lateinit var temporalEntityAttributeService: TemporalEntityAttributeService + private lateinit var entityAttributeService: EntityAttributeService @MockkBean private lateinit var attributeInstanceService: AttributeInstanceService @@ -91,10 +96,10 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) val temporalEntityAttributes = - temporalEntityAttributeService.getForEntity( + entityAttributeService.getForEntity( beehiveTestDId, setOf( INCOMING_PROPERTY, @@ -115,13 +120,13 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences( + entityAttributeService.createEntityAttributes( rawEntity, APIC_COMPOUND_CONTEXTS, "0123456789-1234-5678-987654321" ).shouldSucceed() - val teas = temporalEntityAttributeService.getForEntity(beehiveTestCId, emptySet(), emptySet()) + val teas = entityAttributeService.getForEntity(beehiveTestCId, emptySet(), emptySet()) assertEquals(4, teas.size) coVerify { @@ -167,12 +172,12 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences( + entityAttributeService.createEntityAttributes( rawEntity, APIC_COMPOUND_CONTEXTS ).shouldSucceed() - val teas = temporalEntityAttributeService.getForEntity(beehiveTestCId, emptySet(), emptySet()) + val teas = entityAttributeService.getForEntity(beehiveTestCId, emptySet(), emptySet()) assertEquals(2, teas.size) coVerify { @@ -223,13 +228,13 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon } throws RuntimeException("Unexpected DB error!") assertThrows("it should have thrown a RuntimeException") { - temporalEntityAttributeService.createEntityTemporalReferences( + entityAttributeService.createEntityAttributes( rawEntity, APIC_COMPOUND_CONTEXTS ).shouldSucceed() } - val teas = temporalEntityAttributeService.getForEntity( + val teas = entityAttributeService.getForEntity( "urn:ngsi-ld:BeeHive:TESTC".toUri(), emptySet(), emptySet() @@ -243,10 +248,10 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) .shouldSucceed() - val temporalEntityAttribute = temporalEntityAttributeService.getForEntityAndAttribute( + val temporalEntityAttribute = entityAttributeService.getForEntityAndAttribute( beehiveTestCId, INCOMING_PROPERTY ).shouldSucceedAndResult() @@ -255,7 +260,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon val newProperty = loadSampleData("fragments/beehive_new_incoming_property.json") val expandedAttribute = expandAttribute(newProperty, APIC_COMPOUND_CONTEXTS) val newNgsiLdProperty = expandedAttribute.toNgsiLdAttribute().shouldSucceedAndResult() - temporalEntityAttributeService.replaceAttribute( + entityAttributeService.replaceAttribute( temporalEntityAttribute, newNgsiLdProperty, AttributeMetadata( @@ -272,7 +277,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon null ).shouldSucceed() - temporalEntityAttributeService.getForEntityAndAttribute( + entityAttributeService.getForEntityAndAttribute( beehiveTestCId, INCOMING_PROPERTY ).shouldSucceedWith { @@ -291,10 +296,10 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) .shouldSucceed() - val temporalEntityAttribute = temporalEntityAttributeService.getForEntityAndAttribute( + val temporalEntityAttribute = entityAttributeService.getForEntityAndAttribute( beehiveTestCId, INCOMING_PROPERTY ).shouldSucceedAndResult() @@ -302,7 +307,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon val mergedAt = ngsiLdDateTime() val propertyToMerge = loadSampleData("fragments/beehive_mergeAttribute.json") val expandedAttribute = expandAttribute(propertyToMerge, APIC_COMPOUND_CONTEXTS) - temporalEntityAttributeService.mergeAttribute( + entityAttributeService.mergeAttribute( temporalEntityAttribute, INCOMING_PROPERTY, AttributeMetadata( @@ -337,7 +342,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon APIC_COMPOUND_CONTEXTS ) - temporalEntityAttributeService.getForEntityAndAttribute( + entityAttributeService.getForEntityAndAttribute( beehiveTestCId, INCOMING_PROPERTY ).shouldSucceedWith { @@ -355,14 +360,14 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) .shouldSucceed() val createdAt = ngsiLdDateTime() val attributesToMerge = loadSampleData("fragments/beehive_mergeAttributes.json") val expandedAttributes = JsonLdUtils.expandAttributes(attributesToMerge, APIC_COMPOUND_CONTEXTS) val ngsiLdAttributes = expandedAttributes.toMap().toNgsiLdAttributes().shouldSucceedAndResult() - temporalEntityAttributeService.mergeEntityAttributes( + entityAttributeService.mergeEntityAttributes( beehiveTestCId, ngsiLdAttributes, expandedAttributes, @@ -379,7 +384,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon assertTrue(newAttributes.containsAll(listOf(OUTGOING_PROPERTY, TEMPERATURE_PROPERTY))) } - val teas = temporalEntityAttributeService.getForEntity( + val teas = entityAttributeService.getForEntity( beehiveTestCId, emptySet(), emptySet() @@ -421,7 +426,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) .shouldSucceed() val createdAt = ngsiLdDateTime() @@ -429,7 +434,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon val propertyToMerge = loadSampleData("fragments/beehive_mergeAttribute_without_observedAt.json") val expandedAttributes = JsonLdUtils.expandAttributes(propertyToMerge, APIC_COMPOUND_CONTEXTS) val ngsiLdAttributes = expandedAttributes.toMap().toNgsiLdAttributes().shouldSucceedAndResult() - temporalEntityAttributeService.mergeEntityAttributes( + entityAttributeService.mergeEntityAttributes( beehiveTestCId, ngsiLdAttributes, expandedAttributes, @@ -460,7 +465,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) .shouldSucceed() val replacedAt = ngsiLdDateTime() @@ -468,7 +473,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon val expandedAttribute = expandAttribute(propertyToReplace, APIC_COMPOUND_CONTEXTS) val ngsiLdAttribute = expandedAttribute.toNgsiLdAttribute().shouldSucceedAndResult() - temporalEntityAttributeService.replaceEntityAttribute( + entityAttributeService.replaceEntityAttribute( beehiveTestCId, ngsiLdAttribute, expandedAttribute, @@ -476,7 +481,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon null ).shouldSucceed() - temporalEntityAttributeService.getForEntityAndAttribute( + entityAttributeService.getForEntityAndAttribute( beehiveTestCId, INCOMING_PROPERTY ).shouldSucceedWith { @@ -494,7 +499,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) .shouldSucceed() val replacedAt = ngsiLdDateTime() @@ -502,7 +507,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon val expandedAttribute = expandAttribute(propertyToReplace, APIC_COMPOUND_CONTEXTS) val ngsiLdAttribute = expandedAttribute.toNgsiLdAttribute().shouldSucceedAndResult() - temporalEntityAttributeService.replaceEntityAttribute( + entityAttributeService.replaceEntityAttribute( beehiveTestCId, ngsiLdAttribute, expandedAttribute, @@ -522,9 +527,9 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) - temporalEntityAttributeService.getForEntityAndAttribute( + entityAttributeService.getForEntityAndAttribute( beehiveTestCId, INCOMING_PROPERTY ).shouldSucceedWith { assertNotNull(it) } @@ -536,9 +541,9 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) - temporalEntityAttributeService.getForEntityAndAttribute( + entityAttributeService.getForEntityAndAttribute( beehiveTestCId, INCOMING_PROPERTY, "urn:ngsi-ld:Dataset:01234".toUri() @@ -551,9 +556,9 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) - temporalEntityAttributeService.getForEntityAndAttribute( + entityAttributeService.getForEntityAndAttribute( beehiveTestCId, INCOMING_PROPERTY, "urn:ngsi-ld:Dataset:Unknown".toUri() @@ -569,9 +574,9 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() coEvery { attributeInstanceService.deleteInstancesOfAttribute(any(), any(), any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) - temporalEntityAttributeService.deleteTemporalAttribute( + entityAttributeService.deleteTemporalAttribute( beehiveTestDId, INCOMING_PROPERTY, null @@ -581,7 +586,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon attributeInstanceService.deleteInstancesOfAttribute(eq(beehiveTestDId), eq(INCOMING_PROPERTY), null) } - temporalEntityAttributeService.getForEntityAndAttribute(beehiveTestDId, INCOMING_PROPERTY) + entityAttributeService.getForEntityAndAttribute(beehiveTestDId, INCOMING_PROPERTY) .shouldFail { assertInstanceOf(ResourceNotFoundException::class.java, it) } } @@ -592,9 +597,9 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() coEvery { attributeInstanceService.deleteAllInstancesOfAttribute(any(), any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) - temporalEntityAttributeService.deleteTemporalAttribute( + entityAttributeService.deleteTemporalAttribute( beehiveTestCId, INCOMING_PROPERTY, null, @@ -605,7 +610,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon attributeInstanceService.deleteAllInstancesOfAttribute(eq(beehiveTestCId), eq(INCOMING_PROPERTY)) } - temporalEntityAttributeService.getForEntityAndAttribute(beehiveTestCId, INCOMING_PROPERTY) + entityAttributeService.getForEntityAndAttribute(beehiveTestCId, INCOMING_PROPERTY) .shouldFail { assertInstanceOf(ResourceNotFoundException::class.java, it) } } @@ -615,9 +620,9 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) - temporalEntityAttributeService.checkEntityAndAttributeExistence(beehiveTestCId, INCOMING_PROPERTY) + entityAttributeService.checkEntityAndAttributeExistence(beehiveTestCId, INCOMING_PROPERTY) .shouldSucceed() } @@ -627,9 +632,9 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) - val result = temporalEntityAttributeService.checkEntityAndAttributeExistence(beehiveTestCId, "speed") + val result = entityAttributeService.checkEntityAndAttributeExistence(beehiveTestCId, "speed") result.fold( { assertEquals("Attribute speed (default datasetId) was not found", it.message) }, @@ -639,7 +644,7 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon @Test fun `it should return a left entity not found if entity does not exist`() = runTest { - temporalEntityAttributeService.checkEntityAndAttributeExistence( + entityAttributeService.checkEntityAndAttributeExistence( "urn:ngsi-ld:Entity:01".toUri(), "speed" ).fold( @@ -654,11 +659,11 @@ class TemporalEntityAttributeServiceTests : WithTimescaleContainer, WithKafkaCon coEvery { attributeInstanceService.create(any()) } returns Unit.right() - temporalEntityAttributeService.createEntityTemporalReferences(rawEntity, APIC_COMPOUND_CONTEXTS) + entityAttributeService.createEntityAttributes(rawEntity, APIC_COMPOUND_CONTEXTS) .shouldSucceed() val temporalEntityAttributes = - temporalEntityAttributeService.getForEntity( + entityAttributeService.getForEntity( beehiveTestCId, emptySet(), setOf("urn:ngsi-ld:Dataset:01234") diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/EntityHandlerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/web/EntityHandlerTests.kt similarity index 99% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/EntityHandlerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/web/EntityHandlerTests.kt index 3f555a4c4..da66d79be 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/EntityHandlerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/web/EntityHandlerTests.kt @@ -1,13 +1,13 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.entity.web import arrow.core.left import arrow.core.right -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.model.* -import com.egm.stellio.search.service.EntityEventService -import com.egm.stellio.search.service.EntityPayloadService -import com.egm.stellio.search.service.QueryService +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.model.* +import com.egm.stellio.search.entity.service.EntityEventService +import com.egm.stellio.search.entity.service.EntityPayloadService +import com.egm.stellio.search.entity.service.EntityQueryService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* @@ -62,7 +62,7 @@ class EntityHandlerTests { private lateinit var entityPayloadService: EntityPayloadService @MockkBean - private lateinit var queryService: QueryService + private lateinit var queryService: EntityQueryService @MockkBean(relaxed = true) private lateinit var authorizationService: AuthorizationService diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/EntityOperationHandlerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/entity/web/EntityOperationHandlerTests.kt similarity index 98% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/EntityOperationHandlerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/entity/web/EntityOperationHandlerTests.kt index 1ee376b73..304fa39e0 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/EntityOperationHandlerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/entity/web/EntityOperationHandlerTests.kt @@ -1,15 +1,15 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.entity.web import arrow.core.left import arrow.core.right -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.model.EMPTY_UPDATE_RESULT -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.model.UpdateResult -import com.egm.stellio.search.service.EntityOperationService -import com.egm.stellio.search.service.EntityPayloadService -import com.egm.stellio.search.service.QueryService +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.model.EMPTY_UPDATE_RESULT +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.UpdateResult +import com.egm.stellio.search.entity.service.EntityOperationService +import com.egm.stellio.search.entity.service.EntityPayloadService +import com.egm.stellio.search.entity.service.EntityQueryService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.AccessDeniedException import com.egm.stellio.shared.model.ExpandedEntity @@ -51,7 +51,7 @@ class EntityOperationHandlerTests { private lateinit var entityPayloadService: EntityPayloadService @MockkBean - private lateinit var queryService: QueryService + private lateinit var queryService: EntityQueryService @MockkBean private lateinit var authorizationService: AuthorizationService diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/scope/ScopeServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/scope/ScopeServiceTests.kt index 11cfd976b..3ba52d1e7 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/scope/ScopeServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/scope/ScopeServiceTests.kt @@ -1,12 +1,16 @@ package com.egm.stellio.search.scope -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.AttributeInstance.TemporalProperty -import com.egm.stellio.search.service.EntityPayloadService +import com.egm.stellio.search.entity.model.EntitiesQuery +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.OperationType +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.search.support.WithKafkaContainer import com.egm.stellio.search.support.WithTimescaleContainer import com.egm.stellio.search.support.buildDefaultTestTemporalQuery -import com.egm.stellio.search.util.toExpandedAttributeInstance +import com.egm.stellio.search.temporal.model.AttributeInstance.TemporalProperty +import com.egm.stellio.search.temporal.model.TemporalEntitiesQuery +import com.egm.stellio.search.temporal.model.TemporalQuery +import com.egm.stellio.search.temporal.util.toExpandedAttributeInstance import com.egm.stellio.shared.model.PaginationQuery import com.egm.stellio.shared.model.getScopes import com.egm.stellio.shared.util.* diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/scope/TemporalScopeBuilderTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/scope/TemporalScopeBuilderTests.kt index f736e3abf..97798d43b 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/scope/TemporalScopeBuilderTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/scope/TemporalScopeBuilderTests.kt @@ -1,11 +1,11 @@ package com.egm.stellio.search.scope -import com.egm.stellio.search.model.AttributeInstance.TemporalProperty -import com.egm.stellio.search.model.TemporalEntitiesQuery -import com.egm.stellio.search.model.TemporalQuery import com.egm.stellio.search.support.buildDefaultQueryParams import com.egm.stellio.search.support.buildDefaultTestTemporalQuery import com.egm.stellio.search.support.gimmeEntityPayload +import com.egm.stellio.search.temporal.model.AttributeInstance.TemporalProperty +import com.egm.stellio.search.temporal.model.TemporalEntitiesQuery +import com.egm.stellio.search.temporal.model.TemporalQuery import com.egm.stellio.shared.util.JsonUtils import com.egm.stellio.shared.util.assertJsonPayloadsAreEqual import com.egm.stellio.shared.util.loadSampleData diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/support/BusinessObjectsFactory.kt b/search-service/src/test/kotlin/com/egm/stellio/search/support/BusinessObjectsFactory.kt index 508c350f6..b4613eacc 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/support/BusinessObjectsFactory.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/support/BusinessObjectsFactory.kt @@ -1,6 +1,12 @@ package com.egm.stellio.search.support -import com.egm.stellio.search.model.* +import com.egm.stellio.search.entity.model.AttributeMetadata +import com.egm.stellio.search.entity.model.EntitiesQuery +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.temporal.model.AttributeInstance +import com.egm.stellio.search.temporal.model.TemporalEntitiesQuery +import com.egm.stellio.search.temporal.model.TemporalQuery import com.egm.stellio.shared.model.ExpandedTerm import com.egm.stellio.shared.model.PaginationQuery import com.egm.stellio.shared.model.addNonReifiedTemporalProperty diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/support/TestUtils.kt b/search-service/src/test/kotlin/com/egm/stellio/search/support/TestUtils.kt index b83ab9dc0..60a89b76b 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/support/TestUtils.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/support/TestUtils.kt @@ -1,9 +1,9 @@ package com.egm.stellio.search.support -import com.egm.stellio.search.model.AttributeInstance -import com.egm.stellio.search.model.TemporalEntityAttribute -import com.egm.stellio.search.model.TemporalQuery -import com.egm.stellio.search.model.TemporalQuery.Aggregate +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.temporal.model.AttributeInstance +import com.egm.stellio.search.temporal.model.TemporalQuery +import com.egm.stellio.search.temporal.model.TemporalQuery.Aggregate import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.NgsiLdAttribute import com.egm.stellio.shared.model.toNgsiLdAttributes diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/AggregatedQueryServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/AggregatedTemporalQueryServiceTests.kt similarity index 97% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/AggregatedQueryServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/AggregatedTemporalQueryServiceTests.kt index ac8eab234..8f7c956f0 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/AggregatedQueryServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/AggregatedTemporalQueryServiceTests.kt @@ -1,7 +1,9 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.temporal.service -import com.egm.stellio.search.model.* +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.entity.service.EntityAttributeService import com.egm.stellio.search.support.* +import com.egm.stellio.search.temporal.model.* import com.egm.stellio.shared.model.OperationNotSupportedException import com.egm.stellio.shared.util.* import kotlinx.coroutines.test.runTest @@ -25,13 +27,13 @@ import java.util.UUID @SpringBootTest @ActiveProfiles("test") -class AggregatedQueryServiceTests : WithTimescaleContainer, WithKafkaContainer { +class AggregatedTemporalQueryServiceTests : WithTimescaleContainer, WithKafkaContainer { @Autowired private lateinit var attributeInstanceService: AttributeInstanceService @Autowired - private lateinit var temporalEntityAttributeService: TemporalEntityAttributeService + private lateinit var entityAttributeService: EntityAttributeService @Autowired private lateinit var r2dbcEntityTemplate: R2dbcEntityTemplate @@ -438,7 +440,7 @@ class AggregatedQueryServiceTests : WithTimescaleContainer, WithKafkaContainer { createdAt = now, payload = EMPTY_JSON_PAYLOAD ) - temporalEntityAttributeService.create(temporalEntityAttribute) + entityAttributeService.create(temporalEntityAttribute) return temporalEntityAttribute } diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/AttributeInstanceServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/AttributeInstanceServiceTests.kt similarity index 97% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/AttributeInstanceServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/AttributeInstanceServiceTests.kt index f9469ffae..7fce30aef 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/AttributeInstanceServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/AttributeInstanceServiceTests.kt @@ -1,8 +1,11 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.temporal.service -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.TemporalQuery.Timerel +import com.egm.stellio.search.entity.model.AttributeMetadata +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.entity.service.EntityAttributeService import com.egm.stellio.search.support.* +import com.egm.stellio.search.temporal.model.* +import com.egm.stellio.search.temporal.model.TemporalQuery.Timerel import com.egm.stellio.shared.model.ExpandedAttributes import com.egm.stellio.shared.model.ResourceNotFoundException import com.egm.stellio.shared.model.addNonReifiedTemporalProperty @@ -50,7 +53,7 @@ class AttributeInstanceServiceTests : WithTimescaleContainer, WithKafkaContainer private lateinit var attributeInstanceService: AttributeInstanceService @Autowired - private lateinit var temporalEntityAttributeService: TemporalEntityAttributeService + private lateinit var entityAttributeService: EntityAttributeService @Autowired private lateinit var databaseClient: DatabaseClient @@ -78,7 +81,7 @@ class AttributeInstanceServiceTests : WithTimescaleContainer, WithKafkaContainer ) runBlocking { - temporalEntityAttributeService.create(incomingTemporalEntityAttribute) + entityAttributeService.create(incomingTemporalEntityAttribute) } outgoingTemporalEntityAttribute = TemporalEntityAttribute( @@ -90,7 +93,7 @@ class AttributeInstanceServiceTests : WithTimescaleContainer, WithKafkaContainer ) runBlocking { - temporalEntityAttributeService.create(outgoingTemporalEntityAttribute) + entityAttributeService.create(outgoingTemporalEntityAttribute) } jsonTemporalEntityAttribute = TemporalEntityAttribute( @@ -102,7 +105,7 @@ class AttributeInstanceServiceTests : WithTimescaleContainer, WithKafkaContainer ) runBlocking { - temporalEntityAttributeService.create(jsonTemporalEntityAttribute) + entityAttributeService.create(jsonTemporalEntityAttribute) } languageTemporalEntityAttribute = TemporalEntityAttribute( @@ -114,7 +117,7 @@ class AttributeInstanceServiceTests : WithTimescaleContainer, WithKafkaContainer ) runBlocking { - temporalEntityAttributeService.create(languageTemporalEntityAttribute) + entityAttributeService.create(languageTemporalEntityAttribute) } vocabTemporalEntityAttribute = TemporalEntityAttribute( @@ -126,7 +129,7 @@ class AttributeInstanceServiceTests : WithTimescaleContainer, WithKafkaContainer ) runBlocking { - temporalEntityAttributeService.create(vocabTemporalEntityAttribute) + entityAttributeService.create(vocabTemporalEntityAttribute) } } @@ -281,7 +284,7 @@ class AttributeInstanceServiceTests : WithTimescaleContainer, WithKafkaContainer payload = EMPTY_JSON_PAYLOAD ) - temporalEntityAttributeService.create(temporalEntityAttribute2) + entityAttributeService.create(temporalEntityAttribute2) (1..10).forEach { _ -> val observedAt = Instant.now().atZone(ZoneOffset.UTC) @@ -408,7 +411,7 @@ class AttributeInstanceServiceTests : WithTimescaleContainer, WithKafkaContainer payload = EMPTY_JSON_PAYLOAD ) - temporalEntityAttributeService.create(temporalEntityAttribute2) + entityAttributeService.create(temporalEntityAttribute2) (1..10).forEach { _ -> attributeInstanceService.create(gimmeNumericPropertyAttributeInstance(incomingTemporalEntityAttribute.id)) diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/TemporalPaginationServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/TemporalPaginationServiceTests.kt similarity index 94% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/TemporalPaginationServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/TemporalPaginationServiceTests.kt index 763f14faf..09d953a6a 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/TemporalPaginationServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/TemporalPaginationServiceTests.kt @@ -1,10 +1,13 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.temporal.service -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.model.* -import com.egm.stellio.search.service.TemporalPaginationService.getRangeAndPaginatedTEA +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.model.EntitiesQuery +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.search.support.buildDefaultTestTemporalQuery +import com.egm.stellio.search.temporal.model.* +import com.egm.stellio.search.temporal.service.TemporalPaginationService.getRangeAndPaginatedTEA +import com.egm.stellio.search.temporal.util.TemporalEntityAttributeInstancesResult import com.egm.stellio.shared.model.PaginationQuery import com.egm.stellio.shared.util.APIC_COMPOUND_CONTEXTS import com.egm.stellio.shared.util.INCOMING_PROPERTY @@ -52,7 +55,7 @@ class TemporalPaginationServiceTests { return SimplifiedAttributeInstanceResult(value = 1, time = time, temporalEntityAttribute = UUID.randomUUID()) } - private val teaWithInstances: TEAWithInstances = mapOf( + private val teaWithInstances: TemporalEntityAttributeInstancesResult = mapOf( teaIncoming to listOf( getInstance(leastRecentTimestamp), getInstance(leastRecentTimestamp.plusMinutes(1)), @@ -69,7 +72,7 @@ class TemporalPaginationServiceTests { ) ) - private val teaWithInstancesForLastN: TEAWithInstances = mapOf( + private val teaWithInstancesForLastN: TemporalEntityAttributeInstancesResult = mapOf( teaIncoming to listOf( getInstance(leastRecentTimestamp), getInstance(leastRecentTimestamp.plusMinutes(1)), @@ -280,7 +283,7 @@ class TemporalPaginationServiceTests { withAggregatedValues = true ) - val teaWithInstances: TEAWithInstances = + val teaWithInstances: TemporalEntityAttributeInstancesResult = mapOf(teaIncoming to aggregationInstances, teaOutgoing to aggregationInstances) val (newTeas, range) = getRangeAndPaginatedTEA(teaWithInstances, query) diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/QueryServiceTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/TemporalQueryServiceTests.kt similarity index 83% rename from search-service/src/test/kotlin/com/egm/stellio/search/service/QueryServiceTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/TemporalQueryServiceTests.kt index fd86af44a..b09cef33b 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/QueryServiceTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/service/TemporalQueryServiceTests.kt @@ -1,11 +1,14 @@ -package com.egm.stellio.search.service +package com.egm.stellio.search.temporal.service -import arrow.core.left import arrow.core.right -import com.egm.stellio.search.model.* +import com.egm.stellio.search.entity.model.EntitiesQuery +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.entity.service.EntityAttributeService +import com.egm.stellio.search.entity.service.EntityPayloadService import com.egm.stellio.search.scope.ScopeInstanceResult import com.egm.stellio.search.scope.ScopeService import com.egm.stellio.search.support.* +import com.egm.stellio.search.temporal.model.* import com.egm.stellio.shared.model.PaginationQuery import com.egm.stellio.shared.model.ResourceNotFoundException import com.egm.stellio.shared.util.* @@ -25,13 +28,13 @@ import org.springframework.test.context.ActiveProfiles import java.net.URI import java.time.ZonedDateTime -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = [QueryService::class]) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = [TemporalQueryService::class]) @ActiveProfiles("test") @ExperimentalCoroutinesApi -class QueryServiceTests { +class TemporalQueryServiceTests { @Autowired - private lateinit var queryService: QueryService + private lateinit var queryService: TemporalQueryService @MockkBean private lateinit var entityPayloadService: EntityPayloadService @@ -43,64 +46,15 @@ class QueryServiceTests { private lateinit var attributeInstanceService: AttributeInstanceService @MockkBean - private lateinit var temporalEntityAttributeService: TemporalEntityAttributeService + private lateinit var entityAttributeService: EntityAttributeService private val now = ngsiLdDateTime() private val entityUri = "urn:ngsi-ld:BeeHive:TESTC".toUri() - @Test - fun `it should return a JSON-LD entity when querying by id`() = runTest { - coEvery { entityPayloadService.retrieve(any()) } returns gimmeEntityPayload().right() - - queryService.queryEntity(entityUri) - .shouldSucceedWith { - assertEquals(entityUri.toString(), it.id) - assertEquals(listOf(BEEHIVE_TYPE), it.types) - assertEquals(7, it.members.size) - } - } - - @Test - fun `it should return an API exception if no entity exists with the given id`() = runTest { - coEvery { entityPayloadService.retrieve(any()) } returns ResourceNotFoundException("").left() - - queryService.queryEntity(entityUri) - .shouldFail { - assertTrue(it is ResourceNotFoundException) - } - } - - @Test - fun `it should return a list of JSON-LD entities when querying entities`() = runTest { - coEvery { entityPayloadService.queryEntities(any(), any()) } returns listOf(entityUri) - coEvery { entityPayloadService.queryEntitiesCount(any(), any()) } returns 1.right() - coEvery { entityPayloadService.retrieve(any>()) } returns listOf(gimmeEntityPayload()) - - queryService.queryEntities(buildDefaultQueryParams()) { null } - .shouldSucceedWith { - assertEquals(1, it.second) - assertEquals(entityUri.toString(), it.first[0].id) - assertEquals(listOf(BEEHIVE_TYPE), it.first[0].types) - assertEquals(7, it.first[0].members.size) - } - } - - @Test - fun `it should return an empty list if no entity matched the query`() = runTest { - coEvery { entityPayloadService.queryEntities(any(), any()) } returns emptyList() - coEvery { entityPayloadService.queryEntitiesCount(any(), any()) } returns 0.right() - - queryService.queryEntities(buildDefaultQueryParams()) { null } - .shouldSucceedWith { - assertEquals(0, it.second) - assertTrue(it.first.isEmpty()) - } - } - @Test fun `it should return an API exception if the entity does not exist`() = runTest { - coEvery { temporalEntityAttributeService.getForEntity(any(), any(), any()) } returns emptyList() + coEvery { entityAttributeService.getForEntity(any(), any(), any()) } returns emptyList() queryService.queryTemporalEntity( entityUri, @@ -143,7 +97,7 @@ class QueryServiceTests { ) } - coEvery { temporalEntityAttributeService.getForEntity(any(), any(), any()) } returns teas + coEvery { entityAttributeService.getForEntity(any(), any(), any()) } returns teas coEvery { entityPayloadService.retrieve(any()) } returns gimmeEntityPayload().right() coEvery { scopeService.retrieveHistory(any(), any()) } returns emptyList().right() coEvery { @@ -172,7 +126,7 @@ class QueryServiceTests { ) coVerify { - temporalEntityAttributeService.getForEntity(entityUri, emptySet(), emptySet()) + entityAttributeService.getForEntity(entityUri, emptySet(), emptySet()) attributeInstanceService.search( match { temporalEntitiesQuery -> temporalEntitiesQuery.temporalQuery.timerel == TemporalQuery.Timerel.AFTER && @@ -270,7 +224,7 @@ class QueryServiceTests { coEvery { entityPayloadService.queryEntities(any(), any()) } returns listOf(entityUri) coEvery { - temporalEntityAttributeService.getForTemporalEntities(any(), any()) + entityAttributeService.getForTemporalEntities(any(), any()) } returns listOf(temporalEntityAttribute) coEvery { entityPayloadService.queryEntitiesCount(any(), any()) } returns 1.right() coEvery { scopeService.retrieveHistory(any(), any()) } returns emptyList().right() @@ -304,7 +258,7 @@ class QueryServiceTests { ) { null } coVerify { - temporalEntityAttributeService.getForTemporalEntities( + entityAttributeService.getForTemporalEntities( listOf(entityUri), EntitiesQuery( typeSelection = "$BEEHIVE_TYPE,$APIARY_TYPE", @@ -345,7 +299,7 @@ class QueryServiceTests { coEvery { entityPayloadService.queryEntities(any(), any()) } returns listOf(entityUri) coEvery { - temporalEntityAttributeService.getForTemporalEntities(any(), any()) + entityAttributeService.getForTemporalEntities(any(), any()) } returns listOf(temporalEntityAttribute) coEvery { scopeService.retrieveHistory(any(), any()) } returns emptyList().right() coEvery { diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerPaginationTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerPaginationTests.kt similarity index 94% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerPaginationTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerPaginationTests.kt index 3b2ecb606..89b4c33ac 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerPaginationTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerPaginationTests.kt @@ -1,8 +1,8 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.temporal.web import arrow.core.Either import arrow.core.right -import com.egm.stellio.search.config.SearchProperties +import com.egm.stellio.search.common.config.SearchProperties import com.egm.stellio.shared.util.BEEHIVE_TYPE import com.egm.stellio.shared.util.loadAndExpandSampleData import com.egm.stellio.shared.util.toNgsiLdFormat @@ -35,7 +35,7 @@ class TemporalEntityHandlerPaginationTests : TemporalEntityHandlerTestCommon() { val secondTemporalEntity = loadAndExpandSampleData("beehive.jsonld") coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right( Triple( listOf(firstTemporalEntity, secondTemporalEntity), @@ -53,7 +53,7 @@ class TemporalEntityHandlerPaginationTests : TemporalEntityHandlerTestCommon() { coEvery { entityPayloadService.checkEntityExistence(any()) } returns Unit.right() coEvery { entityPayloadService.getTypes(any()) } returns listOf(BEEHIVE_TYPE).right() coEvery { - queryService.queryTemporalEntity(any(), any()) + temporalQueryService.queryTemporalEntity(any(), any()) } returns Either.Right( firstTemporalEntity to range ) @@ -72,7 +72,7 @@ class TemporalEntityHandlerPaginationTests : TemporalEntityHandlerTestCommon() { .exchange() coVerify { - queryService.queryTemporalEntities( + temporalQueryService.queryTemporalEntities( match { temporalEntitiesQuery -> temporalEntitiesQuery.temporalQuery.instanceLimit == 5 && !temporalEntitiesQuery.temporalQuery.hasLastN() @@ -96,7 +96,7 @@ class TemporalEntityHandlerPaginationTests : TemporalEntityHandlerTestCommon() { .exchange() coVerify { - queryService.queryTemporalEntities( + temporalQueryService.queryTemporalEntities( match { temporalEntitiesQuery -> temporalEntitiesQuery.temporalQuery.instanceLimit == 5 && temporalEntitiesQuery.temporalQuery.lastN == 7 diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerTestCommon.kt b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerTestCommon.kt similarity index 74% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerTestCommon.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerTestCommon.kt index de1c2fbcd..5e7c45bff 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerTestCommon.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerTestCommon.kt @@ -1,8 +1,11 @@ -package com.egm.stellio.search.web - -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.service.* +package com.egm.stellio.search.temporal.web + +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.service.EntityAttributeService +import com.egm.stellio.search.entity.service.EntityPayloadService +import com.egm.stellio.search.temporal.service.AttributeInstanceService +import com.egm.stellio.search.temporal.service.TemporalQueryService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.util.JSON_LD_MEDIA_TYPE import com.egm.stellio.shared.util.MOCK_USER_SUB @@ -24,7 +27,7 @@ open class TemporalEntityHandlerTestCommon { protected lateinit var webClient: WebTestClient @MockkBean(relaxed = true) - protected lateinit var queryService: QueryService + protected lateinit var temporalQueryService: TemporalQueryService @MockkBean protected lateinit var entityPayloadService: EntityPayloadService @@ -33,7 +36,7 @@ open class TemporalEntityHandlerTestCommon { protected lateinit var attributeInstanceService: AttributeInstanceService @MockkBean(relaxed = true) - protected lateinit var temporalEntityAttributeService: TemporalEntityAttributeService + protected lateinit var entityAttributeService: EntityAttributeService @MockkBean protected lateinit var authorizationService: AuthorizationService diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerTests.kt similarity index 95% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerTests.kt index a05fbbfd9..bd41cd458 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityHandlerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityHandlerTests.kt @@ -1,16 +1,16 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.temporal.web import arrow.core.Either import arrow.core.Some import arrow.core.left import arrow.core.right -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.model.EntityPayload -import com.egm.stellio.search.model.SimplifiedAttributeInstanceResult -import com.egm.stellio.search.model.TemporalEntityAttribute -import com.egm.stellio.search.model.TemporalQuery +import com.egm.stellio.search.common.config.SearchProperties +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.search.support.buildDefaultTestTemporalQuery +import com.egm.stellio.search.temporal.model.SimplifiedAttributeInstanceResult +import com.egm.stellio.search.temporal.model.TemporalQuery import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.* import com.egm.stellio.shared.util.* @@ -271,7 +271,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { .exchange() .expectStatus().isForbidden - coVerify { temporalEntityAttributeService.getForEntityAndAttribute(any(), any()) wasNot Called } + coVerify { entityAttributeService.getForEntityAndAttribute(any(), any()) wasNot Called } coVerify { attributeInstanceService.addAttributeInstance(any(), any(), any()) wasNot Called } } @@ -325,7 +325,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { val returnedExpandedEntity = mockkClass(ExpandedEntity::class, relaxed = true) coEvery { - queryService.queryTemporalEntity(any(), any()) + temporalQueryService.queryTemporalEntity(any(), any()) } returns (returnedExpandedEntity to null).right() webClient.get() @@ -488,7 +488,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { buildDefaultMockResponsesForGetEntity() coEvery { - queryService.queryTemporalEntity(any(), any()) + temporalQueryService.queryTemporalEntity(any(), any()) } throws ResourceNotFoundException("Entity urn:ngsi-ld:BeeHive:TESTC was not found") webClient.get() @@ -515,7 +515,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { val returnedExpandedEntity = mockkClass(ExpandedEntity::class, relaxed = true) coEvery { - queryService.queryTemporalEntity(any(), any()) + temporalQueryService.queryTemporalEntity(any(), any()) } returns (returnedExpandedEntity to null).right() webClient.get() @@ -528,7 +528,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { .expectStatus().isOk coVerify { - queryService.queryTemporalEntity( + temporalQueryService.queryTemporalEntity( eq(entityUri), match { temporalEntitiesQuery -> temporalEntitiesQuery.temporalQuery.timerel == TemporalQuery.Timerel.BETWEEN && @@ -540,7 +540,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { } ) } - confirmVerified(queryService) + confirmVerified(temporalQueryService) } @Test @@ -549,7 +549,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { val returnedExpandedEntity = mockkClass(ExpandedEntity::class, relaxed = true) coEvery { - queryService.queryTemporalEntity(any(), any()) + temporalQueryService.queryTemporalEntity(any(), any()) } returns (returnedExpandedEntity to null).right() webClient.get() @@ -570,7 +570,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { val returnedExpandedEntity = mockkClass(ExpandedEntity::class, relaxed = true) coEvery { - queryService.queryTemporalEntity(any(), any()) + temporalQueryService.queryTemporalEntity(any(), any()) } returns (returnedExpandedEntity to null).right() webClient.get() @@ -673,7 +673,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { val entityResponseWith2temporalEvolutions = loadAndExpandSampleData(entityFileName) coEvery { - temporalEntityAttributeService.getForEntity(any(), any(), any()) + entityAttributeService.getForEntity(any(), any(), any()) } returns listOf(entityTemporalProperties[0], entityTemporalProperties[1]) val attributes = listOf(INCOMING_PROPERTY, OUTGOING_PROPERTY) @@ -694,7 +694,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { } coEvery { - queryService.queryTemporalEntity(any(), any()) + temporalQueryService.queryTemporalEntity(any(), any()) } returns (entityResponseWith2temporalEvolutions to null).right() } @@ -727,7 +727,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) webClient.get() @@ -741,7 +741,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { .expectBody().json("[]") coVerify { - queryService.queryTemporalEntities( + temporalQueryService.queryTemporalEntities( match { temporalEntitiesQuery -> temporalEntitiesQuery.entitiesQuery.paginationQuery.limit == 30 && temporalEntitiesQuery.entitiesQuery.paginationQuery.offset == 0 && @@ -763,7 +763,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(listOf(firstTemporalEntity, secondTemporalEntity), 2, null)) webClient.get() @@ -789,7 +789,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(listOf(firstTemporalEntity, secondTemporalEntity), 2, null)) webClient.get() @@ -817,7 +817,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(listOf(firstTemporalEntity, secondTemporalEntity), 2, null)) webClient.get() @@ -840,7 +840,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `query temporal entity should return 200 and empty response if requested offset does not exist`() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } - coEvery { queryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) + coEvery { temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) webClient.get() .uri( @@ -856,7 +856,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `query temporal entities should return 200 and the number of results if count is asked for`() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } - coEvery { queryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) + coEvery { temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) webClient.get() .uri( @@ -877,7 +877,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(listOf(firstTemporalEntity, secondTemporalEntity), 2, null)) webClient.get() @@ -904,7 +904,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(listOf(firstTemporalEntity, secondTemporalEntity), 3, null)) webClient.get() @@ -931,7 +931,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { fun `query temporal entity should return 400 if requested offset is less than zero`() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } throws BadRequestDataException( "Offset must be greater than zero and limit must be strictly greater than zero" ) @@ -959,7 +959,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { fun `query temporal entity should return 400 if limit is equal or less than zero`() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } throws BadRequestDataException( "Offset must be greater than zero and limit must be strictly greater than zero" ) @@ -987,7 +987,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { fun `query temporal entity should return 403 if limit is greater than the maximum authorized limit`() { coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } coEvery { - queryService.queryTemporalEntities(any(), any()) + temporalQueryService.queryTemporalEntities(any(), any()) } throws TooManyResultsException( "You asked for 200 results, but the supported maximum limit is 100" ) @@ -1250,7 +1250,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `delete attribute temporal should return a 204 if the attribute has been successfully deleted`() { - coEvery { temporalEntityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() + coEvery { entityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() coEvery { authorizationService.userCanUpdateEntity(any(), sub) } returns Unit.right() coEvery { entityPayloadService.deleteAttribute(any(), any(), any()) @@ -1265,7 +1265,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { .expectBody().isEmpty coVerify { - temporalEntityAttributeService.checkEntityAndAttributeExistence(eq(entityUri), eq(TEMPERATURE_PROPERTY)) + entityAttributeService.checkEntityAndAttributeExistence(eq(entityUri), eq(TEMPERATURE_PROPERTY)) authorizationService.userCanUpdateEntity(eq(entityUri), eq(sub)) entityPayloadService.deleteAttribute( eq(entityUri), @@ -1277,7 +1277,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `delete attribute temporal should delete all instances if deleteAll flag is true`() { - coEvery { temporalEntityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() + coEvery { entityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() coEvery { authorizationService.userCanUpdateEntity(any(), sub) } returns Unit.right() coEvery { entityPayloadService.deleteAttribute(any(), any(), any(), any()) @@ -1304,10 +1304,10 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `delete attribute temporal should delete instance with the provided datasetId`() { val datasetId = "urn:ngsi-ld:Dataset:temperature:1" - coEvery { temporalEntityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() + coEvery { entityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() coEvery { authorizationService.userCanUpdateEntity(any(), sub) } returns Unit.right() coEvery { - temporalEntityAttributeService.checkEntityAndAttributeExistence(any(), any(), any()) + entityAttributeService.checkEntityAndAttributeExistence(any(), any(), any()) } returns Unit.right() coEvery { entityPayloadService.deleteAttribute(any(), any(), any()) @@ -1333,7 +1333,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `delete attribute temporal should return a 404 if the entity is not found`() { coEvery { - temporalEntityAttributeService.checkEntityAndAttributeExistence(any(), any()) + entityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns ResourceNotFoundException(entityNotFoundMessage(entityUri.toString())).left() webClient.method(HttpMethod.DELETE) @@ -1355,7 +1355,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `delete attribute temporal should return a 404 if the attribute is not found`() { - coEvery { temporalEntityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() + coEvery { entityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() coEvery { authorizationService.userCanUpdateEntity(any(), sub) } returns Unit.right() coEvery { entityPayloadService.deleteAttribute(any(), any(), any(), any()) @@ -1380,7 +1380,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `delete attribute temporal should return a 400 if the request is not correct`() { - coEvery { temporalEntityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() + coEvery { entityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() coEvery { authorizationService.userCanUpdateEntity(any(), sub) } returns Unit.right() coEvery { entityPayloadService.deleteAttribute(any(), any(), any()) @@ -1456,7 +1456,7 @@ class TemporalEntityHandlerTests : TemporalEntityHandlerTestCommon() { @Test fun `delete attribute temporal should return a 403 if user is not allowed to update entity`() { - coEvery { temporalEntityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() + coEvery { entityAttributeService.checkEntityAndAttributeExistence(any(), any()) } returns Unit.right() coEvery { entityPayloadService.getTypes(any()) } returns listOf(BEEHIVE_TYPE).right() coEvery { authorizationService.userCanUpdateEntity(any(), sub) diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityOperationsHandlerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityOperationsHandlerTests.kt similarity index 89% rename from search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityOperationsHandlerTests.kt rename to search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityOperationsHandlerTests.kt index efcbfd000..c0d01bd6d 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/web/TemporalEntityOperationsHandlerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/temporal/web/TemporalEntityOperationsHandlerTests.kt @@ -1,11 +1,11 @@ -package com.egm.stellio.search.web +package com.egm.stellio.search.temporal.web import arrow.core.Either -import com.egm.stellio.search.authorization.AuthorizationService -import com.egm.stellio.search.config.SearchProperties -import com.egm.stellio.search.model.TemporalQuery -import com.egm.stellio.search.service.QueryService +import com.egm.stellio.search.authorization.service.AuthorizationService +import com.egm.stellio.search.common.config.SearchProperties import com.egm.stellio.search.support.buildDefaultTestTemporalQuery +import com.egm.stellio.search.temporal.model.TemporalQuery +import com.egm.stellio.search.temporal.service.TemporalQueryService import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.util.* import com.ninjasquad.springmockk.MockkBean @@ -32,7 +32,7 @@ class TemporalEntityOperationsHandlerTests { private lateinit var webClient: WebTestClient @MockkBean(relaxed = true) - private lateinit var queryService: QueryService + private lateinit var temporalQueryService: TemporalQueryService @MockkBean private lateinit var authorizationService: AuthorizationService @@ -58,7 +58,7 @@ class TemporalEntityOperationsHandlerTests { ) coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } - coEvery { queryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) + coEvery { temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) val query = """ { @@ -83,7 +83,7 @@ class TemporalEntityOperationsHandlerTests { .expectStatus().isOk coVerify { - queryService.queryTemporalEntities( + temporalQueryService.queryTemporalEntities( match { temporalEntitiesQuery -> temporalEntitiesQuery.entitiesQuery.paginationQuery.limit == 30 && temporalEntitiesQuery.entitiesQuery.paginationQuery.offset == 0 && @@ -107,7 +107,7 @@ class TemporalEntityOperationsHandlerTests { ) coEvery { authorizationService.computeAccessRightFilter(any()) } returns { null } - coEvery { queryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) + coEvery { temporalQueryService.queryTemporalEntities(any(), any()) } returns Either.Right(Triple(emptyList(), 2, null)) val query = """ { @@ -133,7 +133,7 @@ class TemporalEntityOperationsHandlerTests { .expectHeader().valueEquals(RESULTS_COUNT_HEADER, "2") coVerify { - queryService.queryTemporalEntities( + temporalQueryService.queryTemporalEntities( match { temporalEntitiesQuery -> temporalEntitiesQuery.entitiesQuery.paginationQuery.limit == 30 && temporalEntitiesQuery.entitiesQuery.paginationQuery.offset == 0 && @@ -148,7 +148,7 @@ class TemporalEntityOperationsHandlerTests { ) } - confirmVerified(queryService) + confirmVerified(temporalQueryService) } @Test diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/util/AttributeInstanceUtilsTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/util/AttributeInstanceUtilsTests.kt index 8329bc3dc..b07fd3d0e 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/util/AttributeInstanceUtilsTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/util/AttributeInstanceUtilsTests.kt @@ -1,6 +1,7 @@ package com.egm.stellio.search.util -import com.egm.stellio.search.model.TemporalEntityAttribute +import com.egm.stellio.search.entity.model.TemporalEntityAttribute +import com.egm.stellio.search.temporal.util.guessAttributeValueType import com.egm.stellio.shared.util.JsonLdUtils.expandAttribute import com.egm.stellio.shared.util.NGSILD_TEST_CORE_CONTEXTS import com.egm.stellio.shared.util.ngsiLdDateTime diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/util/EntitiesQueryUtilsTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/util/EntitiesQueryUtilsTests.kt index c3c259b80..15e4a27c4 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/util/EntitiesQueryUtilsTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/util/EntitiesQueryUtilsTests.kt @@ -2,12 +2,15 @@ package com.egm.stellio.search.util import arrow.core.Either import arrow.core.raise.either -import com.egm.stellio.search.model.AttributeInstance -import com.egm.stellio.search.model.EntitiesQuery -import com.egm.stellio.search.model.Query -import com.egm.stellio.search.model.TemporalQuery +import com.egm.stellio.search.common.model.Query +import com.egm.stellio.search.entity.model.EntitiesQuery +import com.egm.stellio.search.entity.util.composeEntitiesQuery import com.egm.stellio.search.support.buildDefaultPagination import com.egm.stellio.search.support.buildDefaultTestTemporalQuery +import com.egm.stellio.search.temporal.model.AttributeInstance +import com.egm.stellio.search.temporal.model.TemporalQuery +import com.egm.stellio.search.temporal.util.buildTemporalQuery +import com.egm.stellio.search.temporal.util.composeTemporalEntitiesQuery import com.egm.stellio.shared.config.ApplicationProperties import com.egm.stellio.shared.model.APIException import com.egm.stellio.shared.model.BadRequestDataException @@ -242,7 +245,12 @@ class EntitiesQueryUtilsTests { contexts: List ): Either = either { val query = Query(requestBody).bind() - composeEntitiesQueryFromPostRequest(defaultPagination, query, requestParams, contexts).bind() + com.egm.stellio.search.entity.util.composeEntitiesQueryFromPostRequest( + defaultPagination, + query, + requestParams, + contexts + ).bind() } @Test diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/util/PatchAttributeTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/util/PatchAttributeTests.kt index acb08d941..56b3fc425 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/util/PatchAttributeTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/util/PatchAttributeTests.kt @@ -1,5 +1,7 @@ package com.egm.stellio.search.util +import com.egm.stellio.search.temporal.util.mergePatch +import com.egm.stellio.search.temporal.util.partialUpdatePatch import com.egm.stellio.shared.util.JsonLdUtils.expandAttribute import com.egm.stellio.shared.util.JsonUtils.serializeObject import com.egm.stellio.shared.util.NGSILD_TEST_CORE_CONTEXTS diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntitiesParameterizedSource.kt b/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntitiesParameterizedSource.kt index 8dca9b1bc..7181df4c7 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntitiesParameterizedSource.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntitiesParameterizedSource.kt @@ -1,8 +1,12 @@ package com.egm.stellio.search.util -import com.egm.stellio.search.model.* +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.search.support.buildAttributeInstancePayload +import com.egm.stellio.search.temporal.model.EntityTemporalResult +import com.egm.stellio.search.temporal.model.FullAttributeInstanceResult +import com.egm.stellio.search.temporal.model.SimplifiedAttributeInstanceResult import com.egm.stellio.shared.util.BEEHIVE_TYPE import com.egm.stellio.shared.util.JsonLdUtils import com.egm.stellio.shared.util.loadSampleData diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntityBuilderTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntityBuilderTests.kt index 4077a2a10..474416b44 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntityBuilderTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntityBuilderTests.kt @@ -1,11 +1,15 @@ package com.egm.stellio.search.util -import com.egm.stellio.search.model.* -import com.egm.stellio.search.model.AggregatedAttributeInstanceResult.AggregateResult +import com.egm.stellio.search.entity.model.EntityPayload +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.scope.ScopeInstanceResult import com.egm.stellio.search.support.EMPTY_JSON_PAYLOAD import com.egm.stellio.search.support.buildDefaultQueryParams import com.egm.stellio.search.support.buildDefaultTestTemporalQuery +import com.egm.stellio.search.temporal.model.* +import com.egm.stellio.search.temporal.model.AggregatedAttributeInstanceResult.AggregateResult +import com.egm.stellio.search.temporal.util.TemporalEntityAttributeInstancesResult +import com.egm.stellio.search.temporal.util.TemporalEntityBuilder import com.egm.stellio.shared.util.* import com.egm.stellio.shared.util.JsonLdUtils.NGSILD_CREATED_AT_PROPERTY import com.egm.stellio.shared.util.JsonUtils.serializeObject diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntityParameterizedSource.kt b/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntityParameterizedSource.kt index a6c2d87d0..8a2eca7c7 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntityParameterizedSource.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/util/TemporalEntityParameterizedSource.kt @@ -1,10 +1,11 @@ package com.egm.stellio.search.util -import com.egm.stellio.search.model.* +import com.egm.stellio.search.entity.model.TemporalEntityAttribute import com.egm.stellio.search.scope.FullScopeInstanceResult import com.egm.stellio.search.scope.ScopeInstanceResult import com.egm.stellio.search.scope.SimplifiedScopeInstanceResult import com.egm.stellio.search.support.* +import com.egm.stellio.search.temporal.model.* import com.egm.stellio.shared.util.JsonLdUtils import com.egm.stellio.shared.util.loadSampleData import com.egm.stellio.shared.util.toUri