From 815db9d6ae3368a6f6a92ffa0c540b724146897d Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Wed, 21 May 2025 12:47:49 +0200 Subject: [PATCH 01/10] Lagt til requestId i ValidationRequest --- .../no/nav/emottak/cpa/CPARepoIntegrationTest.kt | 12 ++++++++---- .../src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt | 3 ++- .../nav/emottak/ebms/validation/DokumentValidator.kt | 3 ++- .../kotlin/no/nav/emottak/message/model/Payload.kt | 3 ++- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt index ecaa670bd..3f0b398f9 100644 --- a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt +++ b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt @@ -105,7 +105,8 @@ class CPARepoIntegrationTest : PostgresOracleTest() { Party(listOf(PartyId("HER", "8090595")), "Utleverer"), "HarBorgerEgenandelFritak", "EgenandelForesporsel" - ) + ), + "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" ) val response = httpClient.post("/cpa/validate/121212") { setBody(validationRequest) @@ -138,7 +139,8 @@ class CPARepoIntegrationTest : PostgresOracleTest() { Party(listOf(PartyId("HER", "79768")), "Frikortregister"), "HarBorgerEgenandelFritak", "EgenandelForesporsel" - ) + ), + "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" ) val response = httpClient.post("/cpa/validate/121212") { setBody(validationRequest) @@ -172,7 +174,8 @@ class CPARepoIntegrationTest : PostgresOracleTest() { Party(listOf(PartyId("HER", "8090595")), "Utleverer"), "OppgjorsKontroll", "Oppgjorskrav" - ) + ), + "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" ) val response = httpClient.post("/cpa/validate/121212") { setBody(validationRequest) @@ -206,7 +209,8 @@ class CPARepoIntegrationTest : PostgresOracleTest() { Party(listOf(PartyId("HER", "8090595")), "Utleverer"), "OppgjorsKontroll", "Oppgjorskrav" - ) + ), + "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" ) val response = httpClient.post("/cpa/validate/121212") { setBody(validationRequest) diff --git a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt index c2e4a6e8f..3e7df7381 100644 --- a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt +++ b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt @@ -31,7 +31,8 @@ fun createValidValidationRequest() = ValidationRequest( messageId = "", conversationId = "", cpaId = "nav:qass:35065", - createValidAddressing() + createValidAddressing(), + "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" ) fun createValidAddressing() = Addressing( diff --git a/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/validation/DokumentValidator.kt b/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/validation/DokumentValidator.kt index 87c774076..297d28534 100644 --- a/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/validation/DokumentValidator.kt +++ b/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/validation/DokumentValidator.kt @@ -29,7 +29,8 @@ class DokumentValidator(val httpClient: CpaRepoClient) { message.messageId, message.conversationId, message.cpaId, - message.addressing + message.addressing, + message.requestId ) val validationResult = withContext(Dispatchers.IO) { httpClient.postValidate(message.requestId, validationRequest) diff --git a/ebxml-processing-model/src/main/kotlin/no/nav/emottak/message/model/Payload.kt b/ebxml-processing-model/src/main/kotlin/no/nav/emottak/message/model/Payload.kt index b9dfb86e6..b364084da 100644 --- a/ebxml-processing-model/src/main/kotlin/no/nav/emottak/message/model/Payload.kt +++ b/ebxml-processing-model/src/main/kotlin/no/nav/emottak/message/model/Payload.kt @@ -87,7 +87,8 @@ data class ValidationRequest( val messageId: String, val conversationId: String, val cpaId: String, - val addressing: Addressing + val addressing: Addressing, + val requestId: String ) @Serializable From 4af3bb9ecb70015d91efcd846ed5ce87d133b9b9 Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Wed, 21 May 2025 14:26:20 +0200 Subject: [PATCH 02/10] Lagt til Hoplit configurasjon for cpa-repo --- cpa-repo/build.gradle.kts | 2 ++ .../no/nav/emottak/cpa/configuration/Config.kt | 9 +++++++++ .../emottak/cpa/configuration/Configurator.kt | 16 ++++++++++++++++ cpa-repo/src/main/resources/application.conf | 4 ++++ 4 files changed, 31 insertions(+) create mode 100644 cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Config.kt create mode 100644 cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt create mode 100644 cpa-repo/src/main/resources/application.conf diff --git a/cpa-repo/build.gradle.kts b/cpa-repo/build.gradle.kts index dc9f79262..947522acf 100644 --- a/cpa-repo/build.gradle.kts +++ b/cpa-repo/build.gradle.kts @@ -53,6 +53,8 @@ dependencies { implementation(libs.bundles.exposed) implementation(libs.bundles.logging) implementation(libs.bundles.prometheus) + implementation(libs.hoplite.core) + implementation(libs.hoplite.hocon) implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.ktor.client.core) implementation(libs.ktor.client.cio) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Config.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Config.kt new file mode 100644 index 000000000..c8f2cc37f --- /dev/null +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Config.kt @@ -0,0 +1,9 @@ +package no.nav.emottak.ebms.configuration + +import no.nav.emottak.utils.config.EventLogging +import no.nav.emottak.utils.config.Kafka + +data class Config( + val kafka: Kafka, + val eventLogging: EventLogging +) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt new file mode 100644 index 000000000..a73611a9e --- /dev/null +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt @@ -0,0 +1,16 @@ +package no.nav.emottak.ebms.configuration + +import com.sksamuel.hoplite.ConfigLoader +import com.sksamuel.hoplite.ExperimentalHoplite +import com.sksamuel.hoplite.addEnvironmentSource +import com.sksamuel.hoplite.addResourceSource + +@OptIn(ExperimentalHoplite::class) +fun config() = ConfigLoader.builder() + .addEnvironmentSource() + .addResourceSource("/application-personal.conf", optional = true) + .addResourceSource("/kafka_common.conf") + .addResourceSource("/application.conf") + .withExplicitSealedTypes() + .build() + .loadConfigOrThrow() diff --git a/cpa-repo/src/main/resources/application.conf b/cpa-repo/src/main/resources/application.conf new file mode 100644 index 000000000..a7aaaca4b --- /dev/null +++ b/cpa-repo/src/main/resources/application.conf @@ -0,0 +1,4 @@ + +kafka { + groupId = "cpa-repo" +} From 6c23f8e7a53ddec2c507f376cfd8f0968205de80 Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Wed, 21 May 2025 15:22:21 +0200 Subject: [PATCH 03/10] Lagt til registrering av MESSAGE_VALIDATED_AGAINST_CPA hendelse --- .nais/cpa-repo-dev.yaml | 2 + .../src/main/kotlin/no/nav/emottak/cpa/App.kt | 18 +++++- .../main/kotlin/no/nav/emottak/cpa/Routes.kt | 14 ++++- .../nav/emottak/cpa/configuration/Config.kt | 2 +- .../emottak/cpa/configuration/Configurator.kt | 2 +- .../nav/emottak/cpa/util/EventRegistration.kt | 58 +++++++++++++++++++ .../nav/emottak/cpa/CPARepoIntegrationTest.kt | 12 +++- .../nav/emottak/cpa/PartnerIntegrationTest.kt | 12 +++- 8 files changed, 111 insertions(+), 9 deletions(-) create mode 100644 cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt diff --git a/.nais/cpa-repo-dev.yaml b/.nais/cpa-repo-dev.yaml index bb385d643..122e5c569 100644 --- a/.nais/cpa-repo-dev.yaml +++ b/.nais/cpa-repo-dev.yaml @@ -57,6 +57,8 @@ spec: mountPath: /secrets/oracle/creds - kvPath: /oracle/data/dev/config/emottak_q1 mountPath: /secrets/oracle/config + kafka: + pool: nav-dev webproxy: true accessPolicy: inbound: diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/App.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/App.kt index 6b69e8580..994f18c4d 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/App.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/App.kt @@ -22,13 +22,18 @@ import io.micrometer.prometheusmetrics.PrometheusMeterRegistry import kotlinx.coroutines.runBlocking import no.nav.emottak.cpa.auth.AZURE_AD_AUTH import no.nav.emottak.cpa.auth.AuthConfig +import no.nav.emottak.cpa.configuration.config import no.nav.emottak.cpa.persistence.CPARepository import no.nav.emottak.cpa.persistence.Database import no.nav.emottak.cpa.persistence.cpaDbConfig import no.nav.emottak.cpa.persistence.cpaMigrationConfig import no.nav.emottak.cpa.persistence.gammel.PartnerRepository import no.nav.emottak.cpa.persistence.oracleConfig +import no.nav.emottak.cpa.util.EventRegistrationService +import no.nav.emottak.cpa.util.EventRegistrationServiceImpl import no.nav.emottak.utils.environment.getEnvVar +import no.nav.emottak.utils.kafka.client.EventPublisherClient +import no.nav.emottak.utils.kafka.service.EventLoggingService import no.nav.security.token.support.v3.tokenValidationSupport import org.oasis_open.committees.ebxml_cppa.schema.cpp_cpa_2_0.CollaborationProtocolAgreement import org.slf4j.LoggerFactory @@ -38,13 +43,19 @@ fun main() { if (getEnvVar("NAIS_CLUSTER_NAME", "local") != "prod-fss") { DecoroutinatorRuntime.load() } + + val kafkaPublisherClient = EventPublisherClient(config().kafka) + val eventLoggingService = EventLoggingService(config().eventLogging, kafkaPublisherClient) + val eventRegistrationService = EventRegistrationServiceImpl(eventLoggingService) + embeddedServer( Netty, port = 8080, module = cpaApplicationModule( cpaDbConfig.value, cpaMigrationConfig.value, - oracleConfig.value + oracleConfig.value, + eventRegistrationService ) ).start(wait = true) } @@ -52,7 +63,8 @@ fun main() { fun cpaApplicationModule( cpaDbConfig: HikariConfig, cpaMigrationConfig: HikariConfig, - emottakDbConfig: HikariConfig? = null + emottakDbConfig: HikariConfig? = null, + eventRegistrationService: EventRegistrationService ): Application.() -> Unit { return { val database = Database(cpaDbConfig) @@ -77,7 +89,7 @@ fun cpaApplicationModule( routing { if (oracleDb != null) { partnerId(PartnerRepository(oracleDb), cpaRepository) - validateCpa(cpaRepository, PartnerRepository(oracleDb)) + validateCpa(cpaRepository, PartnerRepository(oracleDb), eventRegistrationService) } getCPA(cpaRepository) getTimeStamps(cpaRepository) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt index f87b6ed8e..79c0ee704 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt @@ -21,6 +21,7 @@ import no.nav.emottak.cpa.feil.MultiplePartnerException import no.nav.emottak.cpa.feil.PartnerNotFoundException import no.nav.emottak.cpa.persistence.CPARepository import no.nav.emottak.cpa.persistence.gammel.PartnerRepository +import no.nav.emottak.cpa.util.EventRegistrationService import no.nav.emottak.cpa.validation.MessageDirection import no.nav.emottak.cpa.validation.partyInfoHasRoleServiceActionCombo import no.nav.emottak.cpa.validation.validate @@ -38,6 +39,7 @@ import no.nav.emottak.message.model.ValidationResult import no.nav.emottak.util.createX509Certificate import no.nav.emottak.util.marker import no.nav.emottak.utils.environment.getEnvVar +import no.nav.emottak.utils.kafka.model.EventType import no.nav.security.token.support.v3.TokenValidationContextPrincipal import org.oasis_open.committees.ebxml_cppa.schema.cpp_cpa_2_0.CollaborationProtocolAgreement import java.util.Date @@ -174,7 +176,11 @@ fun Route.postCpa(cpaRepository: CPARepository) = post("/cpa") { } } -fun Route.validateCpa(cpaRepository: CPARepository, partnerRepository: PartnerRepository) = post("/cpa/validate/{$REQUEST_ID}") { +fun Route.validateCpa( + cpaRepository: CPARepository, + partnerRepository: PartnerRepository, + eventRegistrationService: EventRegistrationService +) = post("/cpa/validate/{$REQUEST_ID}") { val validateRequest = call.receive(ValidationRequest::class) // TODO: Skal brukes i kall mot Event-logging: @@ -213,7 +219,6 @@ fun Route.validateCpa(cpaRepository: CPARepository, partnerRepository: PartnerRe val partnerId = runCatching { partnerRepository.findPartnerId(cpa.cpaid) }.getOrNull() - // TODO: Event-logging OK call.respond( HttpStatusCode.OK, ValidationResult( @@ -232,6 +237,11 @@ fun Route.validateCpa(cpaRepository: CPARepository, partnerRepository: PartnerRe partnerId ) ) + + eventRegistrationService.registerEvent( + EventType.MESSAGE_VALIDATED_AGAINST_CPA, + validateRequest + ) } catch (ebmsEx: EbmsException) { // TODO: Event-logging feil? log.error(validateRequest.marker(), ebmsEx.message, ebmsEx) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Config.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Config.kt index c8f2cc37f..0d6c61698 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Config.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Config.kt @@ -1,4 +1,4 @@ -package no.nav.emottak.ebms.configuration +package no.nav.emottak.cpa.configuration import no.nav.emottak.utils.config.EventLogging import no.nav.emottak.utils.config.Kafka diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt index a73611a9e..2c85b5800 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt @@ -1,4 +1,4 @@ -package no.nav.emottak.ebms.configuration +package no.nav.emottak.cpa.configuration import com.sksamuel.hoplite.ConfigLoader import com.sksamuel.hoplite.ExperimentalHoplite diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt new file mode 100644 index 000000000..78043b494 --- /dev/null +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt @@ -0,0 +1,58 @@ +package no.nav.emottak.cpa.util + +import no.nav.emottak.cpa.log +import no.nav.emottak.message.model.ValidationRequest +import no.nav.emottak.utils.common.parseOrGenerateUuid +import no.nav.emottak.utils.kafka.model.Event +import no.nav.emottak.utils.kafka.model.EventType +import no.nav.emottak.utils.kafka.service.EventLoggingService +import kotlin.uuid.ExperimentalUuidApi + +interface EventRegistrationService { + suspend fun registerEvent( + eventType: EventType, + validationRequest: ValidationRequest, + eventData: String = "{}" + ) +} + +class EventRegistrationServiceImpl( + private val eventLoggingService: EventLoggingService +) : EventRegistrationService { + @OptIn(ExperimentalUuidApi::class) + override suspend fun registerEvent( + eventType: EventType, + validationRequest: ValidationRequest, + eventData: String + ) { + log.debug("Registering event for requestId: ${validationRequest.requestId}") + + try { + val requestId = validationRequest.requestId.parseOrGenerateUuid() + + val event = Event( + eventType = eventType, + requestId = requestId, + contentId = "", + messageId = validationRequest.messageId, + eventData = eventData + ) + log.debug("Publishing event: $event") + + eventLoggingService.logEvent(event) + log.debug("Event published successfully") + } catch (e: Exception) { + log.error("Error while registering event: ${e.message}", e) + } + } +} + +class EventRegistrationServiceFake : EventRegistrationService { + override suspend fun registerEvent( + eventType: EventType, + validationRequest: ValidationRequest, + eventData: String + ) { + log.debug("Registering event $eventType for validationRequest: $validationRequest and eventData: $eventData") + } +} diff --git a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt index 3f0b398f9..ade907bc2 100644 --- a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt +++ b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt @@ -26,6 +26,7 @@ import kotlinx.serialization.json.Json import no.nav.emottak.cpa.auth.AZURE_AD_AUTH import no.nav.emottak.cpa.auth.AuthConfig import no.nav.emottak.cpa.databasetest.PostgresOracleTest +import no.nav.emottak.cpa.util.EventRegistrationServiceFake import no.nav.emottak.message.model.Addressing import no.nav.emottak.message.model.Direction.IN import no.nav.emottak.message.model.EmailAddress @@ -55,7 +56,16 @@ import kotlin.test.assertTrue class CPARepoIntegrationTest : PostgresOracleTest() { private fun cpaRepoTestApp(testBlock: suspend ApplicationTestBuilder.() -> T) = testApplication { - application(cpaApplicationModule(postgres.dataSource, postgres.dataSource, oracle.dataSource)) + val eventRegistrationService = EventRegistrationServiceFake() + + application( + cpaApplicationModule( + postgres.dataSource, + postgres.dataSource, + oracle.dataSource, + eventRegistrationService + ) + ) testBlock() } diff --git a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/PartnerIntegrationTest.kt b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/PartnerIntegrationTest.kt index 1052d869b..059d537fb 100644 --- a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/PartnerIntegrationTest.kt +++ b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/PartnerIntegrationTest.kt @@ -9,6 +9,7 @@ import io.ktor.server.testing.ApplicationTestBuilder import io.ktor.server.testing.testApplication import no.nav.emottak.cpa.databasetest.PostgresOracleTest import no.nav.emottak.cpa.persistence.gammel.PARTNER_CPA +import no.nav.emottak.cpa.util.EventRegistrationServiceFake import org.jetbrains.exposed.sql.deleteAll import org.jetbrains.exposed.sql.insert import org.jetbrains.exposed.sql.transactions.transaction @@ -35,7 +36,16 @@ class PartnerIntegrationTest : PostgresOracleTest() { } fun cpaRepoTestApp(testBlock: suspend ApplicationTestBuilder.() -> T) = testApplication { - application(cpaApplicationModule(postgres.dataSource, postgres.dataSource, oracle.dataSource)) + val eventRegistrationService = EventRegistrationServiceFake() + + application( + cpaApplicationModule( + postgres.dataSource, + postgres.dataSource, + oracle.dataSource, + eventRegistrationService + ) + ) testBlock() } From 0c7f2c26d07c1b918186a2cced262db25d454df0 Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Wed, 21 May 2025 15:31:13 +0200 Subject: [PATCH 04/10] Fikset EndToEndTest --- .../nav/emottak/ebms/util/EventRegistration.kt | 6 +++--- .../nav/emottak/ebms/test/IntegrasjonsTest.kt | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/util/EventRegistration.kt b/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/util/EventRegistration.kt index fedfa3459..51086bb34 100644 --- a/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/util/EventRegistration.kt +++ b/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/util/EventRegistration.kt @@ -50,12 +50,12 @@ class EventRegistrationServiceImpl( messageId = ebMSDocument.transform().messageId, eventData = eventData ) - log.debug("Event reg. test: Publishing event: $event") + log.debug("Publishing event: $event") eventLoggingService.logEvent(event) - log.debug("Event reg. test: Event published successfully") + log.debug("Event published successfully") } catch (e: Exception) { - log.error("Event reg. test: Error while registering event: ${e.message}", e) + log.error("Error while registering event: ${e.message}", e) } } diff --git a/ebms-provider/src/test/kotlin/no/nav/emottak/ebms/test/IntegrasjonsTest.kt b/ebms-provider/src/test/kotlin/no/nav/emottak/ebms/test/IntegrasjonsTest.kt index 633ac53cd..c507f40f1 100644 --- a/ebms-provider/src/test/kotlin/no/nav/emottak/ebms/test/IntegrasjonsTest.kt +++ b/ebms-provider/src/test/kotlin/no/nav/emottak/ebms/test/IntegrasjonsTest.kt @@ -27,7 +27,6 @@ import no.nav.emottak.ebms.processing.ProcessingService import no.nav.emottak.ebms.scopedAuthHttpClient import no.nav.emottak.ebms.sendin.SendInService import no.nav.emottak.ebms.testConfiguration -import no.nav.emottak.ebms.util.EventRegistrationServiceFake import no.nav.emottak.ebms.validation.DokumentValidator import no.nav.emottak.ebms.validation.MimeHeaders import no.nav.security.mock.oauth2.MockOAuth2Server @@ -38,6 +37,8 @@ import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.testcontainers.containers.PostgreSQLContainer import no.nav.emottak.cpa.persistence.Database as CpaDatabase +import no.nav.emottak.cpa.util.EventRegistrationServiceFake as CpaEventRegistrationServiceFake +import no.nav.emottak.ebms.util.EventRegistrationServiceFake as EbmsEventRegistrationServiceFake open class EndToEndTest { companion object { @@ -46,7 +47,8 @@ open class EndToEndTest { val mockOAuth2Server = MockOAuth2Server().also { it.start(port = 3344) } val ebmsProviderUrl = "http://localhost:$portnoEbmsProvider" val cpaRepoUrl = "http://localhost:$portnoCpaRepo" - val eventRegistrationService = EventRegistrationServiceFake() + val ebmsEventRegistrationService = EbmsEventRegistrationServiceFake() + val cpaEventRegistrationService = CpaEventRegistrationServiceFake() // TODO Start mailserver og payload processor val cpaRepoDbContainer: PostgreSQLContainer @@ -78,14 +80,19 @@ open class EndToEndTest { cpaRepoServer = embeddedServer( Netty, port = portnoCpaRepo, - module = cpaApplicationModule(cpaRepoDb.dataSource, cpaRepoDb.dataSource, cpaRepoDb.dataSource) + module = cpaApplicationModule( + cpaRepoDb.dataSource, + cpaRepoDb.dataSource, + cpaRepoDb.dataSource, + cpaEventRegistrationService + ) ).also { it.start() }.engine ebmsProviderServer = embeddedServer( Netty, port = portnoEbmsProvider, - module = { ebmsProviderModule(dokumentValidator, processingService, sendInService, eventRegistrationService) } + module = { ebmsProviderModule(dokumentValidator, processingService, sendInService, ebmsEventRegistrationService) } ).also { it.start() }.engine @@ -104,7 +111,7 @@ class IntegrasjonsTest : EndToEndTest() { @Test fun basicEndpointTest() = testApplication { - application { ebmsProviderModule(dokumentValidator, processingService, sendInService, eventRegistrationService) } + application { ebmsProviderModule(dokumentValidator, processingService, sendInService, ebmsEventRegistrationService) } val response = client.get("/") Assertions.assertEquals(HttpStatusCode.OK, response.status) Assertions.assertEquals("{\"status\":\"Hello\"}", response.bodyAsText()) From 74527d91f94d1bc47ec33ddac632bc85f9c9e5de Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Wed, 21 May 2025 15:43:45 +0200 Subject: [PATCH 05/10] Registrert hendelse VALIDATION_AGAINST_CPA_FAILED --- .../main/kotlin/no/nav/emottak/cpa/Routes.kt | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt index 79c0ee704..9334d39bf 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt @@ -40,6 +40,7 @@ import no.nav.emottak.util.createX509Certificate import no.nav.emottak.util.marker import no.nav.emottak.utils.environment.getEnvVar import no.nav.emottak.utils.kafka.model.EventType +import no.nav.emottak.utils.serialization.toEventDataJson import no.nav.security.token.support.v3.TokenValidationContextPrincipal import org.oasis_open.committees.ebxml_cppa.schema.cpp_cpa_2_0.CollaborationProtocolAgreement import java.util.Date @@ -243,21 +244,33 @@ fun Route.validateCpa( validateRequest ) } catch (ebmsEx: EbmsException) { - // TODO: Event-logging feil? + eventRegistrationService.registerEvent( + EventType.VALIDATION_AGAINST_CPA_FAILED, + validateRequest, + ebmsEx.toEventDataJson() + ) log.error(validateRequest.marker(), ebmsEx.message, ebmsEx) call.respond( HttpStatusCode.OK, ValidationResult(error = ebmsEx.feil) ) } catch (ex: NotFoundException) { - // TODO: Event-logging feil? + eventRegistrationService.registerEvent( + EventType.VALIDATION_AGAINST_CPA_FAILED, + validateRequest, + ex.toEventDataJson() + ) log.error(validateRequest.marker(), "${ex.message}") call.respond( HttpStatusCode.OK, ValidationResult(error = listOf(Feil(ErrorCode.DELIVERY_FAILURE, "${ex.message}"))) ) } catch (ex: Exception) { - // TODO: Event-logging feil + eventRegistrationService.registerEvent( + EventType.VALIDATION_AGAINST_CPA_FAILED, + validateRequest, + ex.toEventDataJson() + ) log.error(validateRequest.marker(), ex.message, ex) call.respond( HttpStatusCode.OK, From 4d8a312b23d65a0143440c1d188e6f719814fe93 Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Wed, 21 May 2025 16:03:48 +0200 Subject: [PATCH 06/10] Fjernet @OptIn markering fra klasser --- cpa-repo/build.gradle.kts | 6 ++++++ .../kotlin/no/nav/emottak/cpa/configuration/Configurator.kt | 2 -- .../kotlin/no/nav/emottak/cpa/util/EventRegistration.kt | 2 -- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cpa-repo/build.gradle.kts b/cpa-repo/build.gradle.kts index 947522acf..66306d930 100644 --- a/cpa-repo/build.gradle.kts +++ b/cpa-repo/build.gradle.kts @@ -35,6 +35,12 @@ tasks { } } +tasks.withType().all { + compilerOptions { + freeCompilerArgs = listOf("-opt-in=kotlin.uuid.ExperimentalUuidApi,com.sksamuel.hoplite.ExperimentalHoplite") + } +} + dependencies { api(project(":felles")) api(project(":ebxml-processing-model")) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt index 2c85b5800..852ff3e4e 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/configuration/Configurator.kt @@ -1,11 +1,9 @@ package no.nav.emottak.cpa.configuration import com.sksamuel.hoplite.ConfigLoader -import com.sksamuel.hoplite.ExperimentalHoplite import com.sksamuel.hoplite.addEnvironmentSource import com.sksamuel.hoplite.addResourceSource -@OptIn(ExperimentalHoplite::class) fun config() = ConfigLoader.builder() .addEnvironmentSource() .addResourceSource("/application-personal.conf", optional = true) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt index 78043b494..83ea1631c 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt @@ -6,7 +6,6 @@ import no.nav.emottak.utils.common.parseOrGenerateUuid import no.nav.emottak.utils.kafka.model.Event import no.nav.emottak.utils.kafka.model.EventType import no.nav.emottak.utils.kafka.service.EventLoggingService -import kotlin.uuid.ExperimentalUuidApi interface EventRegistrationService { suspend fun registerEvent( @@ -19,7 +18,6 @@ interface EventRegistrationService { class EventRegistrationServiceImpl( private val eventLoggingService: EventLoggingService ) : EventRegistrationService { - @OptIn(ExperimentalUuidApi::class) override suspend fun registerEvent( eventType: EventType, validationRequest: ValidationRequest, From b8b807ec3e52b436593065a7d00fa11324060a63 Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Thu, 22 May 2025 11:45:33 +0200 Subject: [PATCH 07/10] Forbedret semantikken i logglinjer --- .../main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt index 83ea1631c..1c42e2f1c 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt @@ -35,10 +35,10 @@ class EventRegistrationServiceImpl( messageId = validationRequest.messageId, eventData = eventData ) - log.debug("Publishing event: $event") + log.debug("Registering event: {}", event) eventLoggingService.logEvent(event) - log.debug("Event published successfully") + log.debug("Event is registered successfully") } catch (e: Exception) { log.error("Error while registering event: ${e.message}", e) } From 06987b2499c868b142ec1646f12997dfb515208d Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Thu, 22 May 2025 15:34:36 +0200 Subject: [PATCH 08/10] Revert "Lagt til requestId i ValidationRequest" This reverts commit 815db9d6ae3368a6f6a92ffa0c540b724146897d. --- .../no/nav/emottak/cpa/CPARepoIntegrationTest.kt | 12 ++++-------- .../src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt | 3 +-- .../nav/emottak/ebms/validation/DokumentValidator.kt | 3 +-- .../kotlin/no/nav/emottak/message/model/Payload.kt | 3 +-- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt index ade907bc2..4af690c7c 100644 --- a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt +++ b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt @@ -115,8 +115,7 @@ class CPARepoIntegrationTest : PostgresOracleTest() { Party(listOf(PartyId("HER", "8090595")), "Utleverer"), "HarBorgerEgenandelFritak", "EgenandelForesporsel" - ), - "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" + ) ) val response = httpClient.post("/cpa/validate/121212") { setBody(validationRequest) @@ -149,8 +148,7 @@ class CPARepoIntegrationTest : PostgresOracleTest() { Party(listOf(PartyId("HER", "79768")), "Frikortregister"), "HarBorgerEgenandelFritak", "EgenandelForesporsel" - ), - "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" + ) ) val response = httpClient.post("/cpa/validate/121212") { setBody(validationRequest) @@ -184,8 +182,7 @@ class CPARepoIntegrationTest : PostgresOracleTest() { Party(listOf(PartyId("HER", "8090595")), "Utleverer"), "OppgjorsKontroll", "Oppgjorskrav" - ), - "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" + ) ) val response = httpClient.post("/cpa/validate/121212") { setBody(validationRequest) @@ -219,8 +216,7 @@ class CPARepoIntegrationTest : PostgresOracleTest() { Party(listOf(PartyId("HER", "8090595")), "Utleverer"), "OppgjorsKontroll", "Oppgjorskrav" - ), - "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" + ) ) val response = httpClient.post("/cpa/validate/121212") { setBody(validationRequest) diff --git a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt index 3e7df7381..c2e4a6e8f 100644 --- a/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt +++ b/cpa-repo/src/test/kotlin/no/nav/emottak/cpa/TestUtil.kt @@ -31,8 +31,7 @@ fun createValidValidationRequest() = ValidationRequest( messageId = "", conversationId = "", cpaId = "nav:qass:35065", - createValidAddressing(), - "9cb28a36-faf3-44ef-aa46-6d3db35a72bc" + createValidAddressing() ) fun createValidAddressing() = Addressing( diff --git a/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/validation/DokumentValidator.kt b/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/validation/DokumentValidator.kt index 297d28534..87c774076 100644 --- a/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/validation/DokumentValidator.kt +++ b/ebms-provider/src/main/kotlin/no/nav/emottak/ebms/validation/DokumentValidator.kt @@ -29,8 +29,7 @@ class DokumentValidator(val httpClient: CpaRepoClient) { message.messageId, message.conversationId, message.cpaId, - message.addressing, - message.requestId + message.addressing ) val validationResult = withContext(Dispatchers.IO) { httpClient.postValidate(message.requestId, validationRequest) diff --git a/ebxml-processing-model/src/main/kotlin/no/nav/emottak/message/model/Payload.kt b/ebxml-processing-model/src/main/kotlin/no/nav/emottak/message/model/Payload.kt index b364084da..b9dfb86e6 100644 --- a/ebxml-processing-model/src/main/kotlin/no/nav/emottak/message/model/Payload.kt +++ b/ebxml-processing-model/src/main/kotlin/no/nav/emottak/message/model/Payload.kt @@ -87,8 +87,7 @@ data class ValidationRequest( val messageId: String, val conversationId: String, val cpaId: String, - val addressing: Addressing, - val requestId: String + val addressing: Addressing ) @Serializable From 66110868d6089c4728683778abea1883eb73e72a Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Thu, 22 May 2025 15:57:55 +0200 Subject: [PATCH 09/10] Tatt i bruk request ID fra GET parameter --- cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt | 10 ++++++---- .../no/nav/emottak/cpa/util/EventRegistration.kt | 9 +++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt index 9334d39bf..c6e5b9f0d 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt @@ -184,8 +184,7 @@ fun Route.validateCpa( ) = post("/cpa/validate/{$REQUEST_ID}") { val validateRequest = call.receive(ValidationRequest::class) - // TODO: Skal brukes i kall mot Event-logging: - // val requestId = call.parameters[REQUEST_ID] ?: throw BadRequestException("Mangler $REQUEST_ID") + val requestId = call.parameters[REQUEST_ID] ?: throw BadRequestException("Mangler $REQUEST_ID") try { log.info(validateRequest.marker(), "Validerer ebms mot CPA") @@ -238,15 +237,16 @@ fun Route.validateCpa( partnerId ) ) - eventRegistrationService.registerEvent( EventType.MESSAGE_VALIDATED_AGAINST_CPA, - validateRequest + validateRequest, + requestId ) } catch (ebmsEx: EbmsException) { eventRegistrationService.registerEvent( EventType.VALIDATION_AGAINST_CPA_FAILED, validateRequest, + requestId, ebmsEx.toEventDataJson() ) log.error(validateRequest.marker(), ebmsEx.message, ebmsEx) @@ -258,6 +258,7 @@ fun Route.validateCpa( eventRegistrationService.registerEvent( EventType.VALIDATION_AGAINST_CPA_FAILED, validateRequest, + requestId, ex.toEventDataJson() ) log.error(validateRequest.marker(), "${ex.message}") @@ -269,6 +270,7 @@ fun Route.validateCpa( eventRegistrationService.registerEvent( EventType.VALIDATION_AGAINST_CPA_FAILED, validateRequest, + requestId, ex.toEventDataJson() ) log.error(validateRequest.marker(), ex.message, ex) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt index 1c42e2f1c..58626931c 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/util/EventRegistration.kt @@ -11,6 +11,7 @@ interface EventRegistrationService { suspend fun registerEvent( eventType: EventType, validationRequest: ValidationRequest, + requestId: String, eventData: String = "{}" ) } @@ -21,16 +22,15 @@ class EventRegistrationServiceImpl( override suspend fun registerEvent( eventType: EventType, validationRequest: ValidationRequest, + requestId: String, eventData: String ) { - log.debug("Registering event for requestId: ${validationRequest.requestId}") + log.debug("Registering event for requestId: $requestId") try { - val requestId = validationRequest.requestId.parseOrGenerateUuid() - val event = Event( eventType = eventType, - requestId = requestId, + requestId = requestId.parseOrGenerateUuid(), contentId = "", messageId = validationRequest.messageId, eventData = eventData @@ -49,6 +49,7 @@ class EventRegistrationServiceFake : EventRegistrationService { override suspend fun registerEvent( eventType: EventType, validationRequest: ValidationRequest, + requestId: String, eventData: String ) { log.debug("Registering event $eventType for validationRequest: $validationRequest and eventData: $eventData") From 6ce15c2db36f09114fd6184c68184c24eb5954c4 Mon Sep 17 00:00:00 2001 From: Oleksandr Chmyr Date: Fri, 23 May 2025 13:25:43 +0200 Subject: [PATCH 10/10] Lagt til sender metadata for MESSAGE_VALIDATED_AGAINST_CPA hendelse --- cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt index c6e5b9f0d..712f665ec 100644 --- a/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt +++ b/cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt @@ -15,6 +15,8 @@ import io.ktor.server.routing.post import io.micrometer.prometheusmetrics.PrometheusMeterRegistry import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import no.nav.emottak.cpa.auth.AZURE_AD_AUTH import no.nav.emottak.cpa.feil.CpaValidationException import no.nav.emottak.cpa.feil.MultiplePartnerException @@ -237,10 +239,16 @@ fun Route.validateCpa( partnerId ) ) + + val eventData = Json.encodeToString( + mapOf("sender" to fromParty.partyName) + ) + eventRegistrationService.registerEvent( EventType.MESSAGE_VALIDATED_AGAINST_CPA, validateRequest, - requestId + requestId, + eventData ) } catch (ebmsEx: EbmsException) { eventRegistrationService.registerEvent(