Skip to content

Commit ec6ed1a

Browse files
#190 Registrere hendelser i cpa-repo (#138)
* Lagt til requestId i ValidationRequest * Lagt til Hoplit configurasjon for cpa-repo * Lagt til registrering av MESSAGE_VALIDATED_AGAINST_CPA hendelse * Fikset EndToEndTest * Registrert hendelse VALIDATION_AGAINST_CPA_FAILED * Fjernet @OptIn markering fra klasser * Forbedret semantikken i logglinjer * Revert "Lagt til requestId i ValidationRequest" This reverts commit 815db9d. * Tatt i bruk request ID fra GET parameter * Lagt til sender metadata for MESSAGE_VALIDATED_AGAINST_CPA hendelse
1 parent faf4e14 commit ec6ed1a

File tree

12 files changed

+186
-20
lines changed

12 files changed

+186
-20
lines changed

.nais/cpa-repo-dev.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ spec:
5757
mountPath: /secrets/oracle/creds
5858
- kvPath: /oracle/data/dev/config/emottak_q1
5959
mountPath: /secrets/oracle/config
60+
kafka:
61+
pool: nav-dev
6062
webproxy: true
6163
accessPolicy:
6264
inbound:

cpa-repo/build.gradle.kts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ tasks {
3535
}
3636
}
3737

38+
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().all {
39+
compilerOptions {
40+
freeCompilerArgs = listOf("-opt-in=kotlin.uuid.ExperimentalUuidApi,com.sksamuel.hoplite.ExperimentalHoplite")
41+
}
42+
}
43+
3844
dependencies {
3945
api(project(":felles"))
4046
api(project(":ebxml-processing-model"))
@@ -53,6 +59,8 @@ dependencies {
5359
implementation(libs.bundles.exposed)
5460
implementation(libs.bundles.logging)
5561
implementation(libs.bundles.prometheus)
62+
implementation(libs.hoplite.core)
63+
implementation(libs.hoplite.hocon)
5664
implementation(libs.ktor.serialization.kotlinx.json)
5765
implementation(libs.ktor.client.core)
5866
implementation(libs.ktor.client.cio)

cpa-repo/src/main/kotlin/no/nav/emottak/cpa/App.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,18 @@ import io.micrometer.prometheusmetrics.PrometheusMeterRegistry
2222
import kotlinx.coroutines.runBlocking
2323
import no.nav.emottak.cpa.auth.AZURE_AD_AUTH
2424
import no.nav.emottak.cpa.auth.AuthConfig
25+
import no.nav.emottak.cpa.configuration.config
2526
import no.nav.emottak.cpa.persistence.CPARepository
2627
import no.nav.emottak.cpa.persistence.Database
2728
import no.nav.emottak.cpa.persistence.cpaDbConfig
2829
import no.nav.emottak.cpa.persistence.cpaMigrationConfig
2930
import no.nav.emottak.cpa.persistence.gammel.PartnerRepository
3031
import no.nav.emottak.cpa.persistence.oracleConfig
32+
import no.nav.emottak.cpa.util.EventRegistrationService
33+
import no.nav.emottak.cpa.util.EventRegistrationServiceImpl
3134
import no.nav.emottak.utils.environment.getEnvVar
35+
import no.nav.emottak.utils.kafka.client.EventPublisherClient
36+
import no.nav.emottak.utils.kafka.service.EventLoggingService
3237
import no.nav.security.token.support.v3.tokenValidationSupport
3338
import org.oasis_open.committees.ebxml_cppa.schema.cpp_cpa_2_0.CollaborationProtocolAgreement
3439
import org.slf4j.LoggerFactory
@@ -38,21 +43,28 @@ fun main() {
3843
if (getEnvVar("NAIS_CLUSTER_NAME", "local") != "prod-fss") {
3944
DecoroutinatorRuntime.load()
4045
}
46+
47+
val kafkaPublisherClient = EventPublisherClient(config().kafka)
48+
val eventLoggingService = EventLoggingService(config().eventLogging, kafkaPublisherClient)
49+
val eventRegistrationService = EventRegistrationServiceImpl(eventLoggingService)
50+
4151
embeddedServer(
4252
Netty,
4353
port = 8080,
4454
module = cpaApplicationModule(
4555
cpaDbConfig.value,
4656
cpaMigrationConfig.value,
47-
oracleConfig.value
57+
oracleConfig.value,
58+
eventRegistrationService
4859
)
4960
).start(wait = true)
5061
}
5162

5263
fun cpaApplicationModule(
5364
cpaDbConfig: HikariConfig,
5465
cpaMigrationConfig: HikariConfig,
55-
emottakDbConfig: HikariConfig? = null
66+
emottakDbConfig: HikariConfig? = null,
67+
eventRegistrationService: EventRegistrationService
5668
): Application.() -> Unit {
5769
return {
5870
val database = Database(cpaDbConfig)
@@ -77,7 +89,7 @@ fun cpaApplicationModule(
7789
routing {
7890
if (oracleDb != null) {
7991
partnerId(PartnerRepository(oracleDb), cpaRepository)
80-
validateCpa(cpaRepository, PartnerRepository(oracleDb))
92+
validateCpa(cpaRepository, PartnerRepository(oracleDb), eventRegistrationService)
8193
}
8294
getCPA(cpaRepository)
8395
getTimeStamps(cpaRepository)

cpa-repo/src/main/kotlin/no/nav/emottak/cpa/Routes.kt

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ import io.ktor.server.routing.post
1515
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry
1616
import kotlinx.coroutines.Dispatchers
1717
import kotlinx.coroutines.withContext
18+
import kotlinx.serialization.encodeToString
19+
import kotlinx.serialization.json.Json
1820
import no.nav.emottak.cpa.auth.AZURE_AD_AUTH
1921
import no.nav.emottak.cpa.feil.CpaValidationException
2022
import no.nav.emottak.cpa.feil.MultiplePartnerException
2123
import no.nav.emottak.cpa.feil.PartnerNotFoundException
2224
import no.nav.emottak.cpa.persistence.CPARepository
2325
import no.nav.emottak.cpa.persistence.gammel.PartnerRepository
26+
import no.nav.emottak.cpa.util.EventRegistrationService
2427
import no.nav.emottak.cpa.validation.MessageDirection
2528
import no.nav.emottak.cpa.validation.partyInfoHasRoleServiceActionCombo
2629
import no.nav.emottak.cpa.validation.validate
@@ -38,6 +41,8 @@ import no.nav.emottak.message.model.ValidationResult
3841
import no.nav.emottak.util.createX509Certificate
3942
import no.nav.emottak.util.marker
4043
import no.nav.emottak.utils.environment.getEnvVar
44+
import no.nav.emottak.utils.kafka.model.EventType
45+
import no.nav.emottak.utils.serialization.toEventDataJson
4146
import no.nav.security.token.support.v3.TokenValidationContextPrincipal
4247
import org.oasis_open.committees.ebxml_cppa.schema.cpp_cpa_2_0.CollaborationProtocolAgreement
4348
import java.util.Date
@@ -174,11 +179,14 @@ fun Route.postCpa(cpaRepository: CPARepository) = post("/cpa") {
174179
}
175180
}
176181

177-
fun Route.validateCpa(cpaRepository: CPARepository, partnerRepository: PartnerRepository) = post("/cpa/validate/{$REQUEST_ID}") {
182+
fun Route.validateCpa(
183+
cpaRepository: CPARepository,
184+
partnerRepository: PartnerRepository,
185+
eventRegistrationService: EventRegistrationService
186+
) = post("/cpa/validate/{$REQUEST_ID}") {
178187
val validateRequest = call.receive(ValidationRequest::class)
179188

180-
// TODO: Skal brukes i kall mot Event-logging:
181-
// val requestId = call.parameters[REQUEST_ID] ?: throw BadRequestException("Mangler $REQUEST_ID")
189+
val requestId = call.parameters[REQUEST_ID] ?: throw BadRequestException("Mangler $REQUEST_ID")
182190

183191
try {
184192
log.info(validateRequest.marker(), "Validerer ebms mot CPA")
@@ -213,7 +221,6 @@ fun Route.validateCpa(cpaRepository: CPARepository, partnerRepository: PartnerRe
213221

214222
val partnerId = runCatching { partnerRepository.findPartnerId(cpa.cpaid) }.getOrNull()
215223

216-
// TODO: Event-logging OK
217224
call.respond(
218225
HttpStatusCode.OK,
219226
ValidationResult(
@@ -232,22 +239,48 @@ fun Route.validateCpa(cpaRepository: CPARepository, partnerRepository: PartnerRe
232239
partnerId
233240
)
234241
)
242+
243+
val eventData = Json.encodeToString(
244+
mapOf("sender" to fromParty.partyName)
245+
)
246+
247+
eventRegistrationService.registerEvent(
248+
EventType.MESSAGE_VALIDATED_AGAINST_CPA,
249+
validateRequest,
250+
requestId,
251+
eventData
252+
)
235253
} catch (ebmsEx: EbmsException) {
236-
// TODO: Event-logging feil?
254+
eventRegistrationService.registerEvent(
255+
EventType.VALIDATION_AGAINST_CPA_FAILED,
256+
validateRequest,
257+
requestId,
258+
ebmsEx.toEventDataJson()
259+
)
237260
log.error(validateRequest.marker(), ebmsEx.message, ebmsEx)
238261
call.respond(
239262
HttpStatusCode.OK,
240263
ValidationResult(error = ebmsEx.feil)
241264
)
242265
} catch (ex: NotFoundException) {
243-
// TODO: Event-logging feil?
266+
eventRegistrationService.registerEvent(
267+
EventType.VALIDATION_AGAINST_CPA_FAILED,
268+
validateRequest,
269+
requestId,
270+
ex.toEventDataJson()
271+
)
244272
log.error(validateRequest.marker(), "${ex.message}")
245273
call.respond(
246274
HttpStatusCode.OK,
247275
ValidationResult(error = listOf(Feil(ErrorCode.DELIVERY_FAILURE, "${ex.message}")))
248276
)
249277
} catch (ex: Exception) {
250-
// TODO: Event-logging feil
278+
eventRegistrationService.registerEvent(
279+
EventType.VALIDATION_AGAINST_CPA_FAILED,
280+
validateRequest,
281+
requestId,
282+
ex.toEventDataJson()
283+
)
251284
log.error(validateRequest.marker(), ex.message, ex)
252285
call.respond(
253286
HttpStatusCode.OK,
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package no.nav.emottak.cpa.configuration
2+
3+
import no.nav.emottak.utils.config.EventLogging
4+
import no.nav.emottak.utils.config.Kafka
5+
6+
data class Config(
7+
val kafka: Kafka,
8+
val eventLogging: EventLogging
9+
)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package no.nav.emottak.cpa.configuration
2+
3+
import com.sksamuel.hoplite.ConfigLoader
4+
import com.sksamuel.hoplite.addEnvironmentSource
5+
import com.sksamuel.hoplite.addResourceSource
6+
7+
fun config() = ConfigLoader.builder()
8+
.addEnvironmentSource()
9+
.addResourceSource("/application-personal.conf", optional = true)
10+
.addResourceSource("/kafka_common.conf")
11+
.addResourceSource("/application.conf")
12+
.withExplicitSealedTypes()
13+
.build()
14+
.loadConfigOrThrow<Config>()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package no.nav.emottak.cpa.util
2+
3+
import no.nav.emottak.cpa.log
4+
import no.nav.emottak.message.model.ValidationRequest
5+
import no.nav.emottak.utils.common.parseOrGenerateUuid
6+
import no.nav.emottak.utils.kafka.model.Event
7+
import no.nav.emottak.utils.kafka.model.EventType
8+
import no.nav.emottak.utils.kafka.service.EventLoggingService
9+
10+
interface EventRegistrationService {
11+
suspend fun registerEvent(
12+
eventType: EventType,
13+
validationRequest: ValidationRequest,
14+
requestId: String,
15+
eventData: String = "{}"
16+
)
17+
}
18+
19+
class EventRegistrationServiceImpl(
20+
private val eventLoggingService: EventLoggingService
21+
) : EventRegistrationService {
22+
override suspend fun registerEvent(
23+
eventType: EventType,
24+
validationRequest: ValidationRequest,
25+
requestId: String,
26+
eventData: String
27+
) {
28+
log.debug("Registering event for requestId: $requestId")
29+
30+
try {
31+
val event = Event(
32+
eventType = eventType,
33+
requestId = requestId.parseOrGenerateUuid(),
34+
contentId = "",
35+
messageId = validationRequest.messageId,
36+
eventData = eventData
37+
)
38+
log.debug("Registering event: {}", event)
39+
40+
eventLoggingService.logEvent(event)
41+
log.debug("Event is registered successfully")
42+
} catch (e: Exception) {
43+
log.error("Error while registering event: ${e.message}", e)
44+
}
45+
}
46+
}
47+
48+
class EventRegistrationServiceFake : EventRegistrationService {
49+
override suspend fun registerEvent(
50+
eventType: EventType,
51+
validationRequest: ValidationRequest,
52+
requestId: String,
53+
eventData: String
54+
) {
55+
log.debug("Registering event $eventType for validationRequest: $validationRequest and eventData: $eventData")
56+
}
57+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
kafka {
3+
groupId = "cpa-repo"
4+
}

cpa-repo/src/test/kotlin/no/nav/emottak/cpa/CPARepoIntegrationTest.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import kotlinx.serialization.json.Json
2626
import no.nav.emottak.cpa.auth.AZURE_AD_AUTH
2727
import no.nav.emottak.cpa.auth.AuthConfig
2828
import no.nav.emottak.cpa.databasetest.PostgresOracleTest
29+
import no.nav.emottak.cpa.util.EventRegistrationServiceFake
2930
import no.nav.emottak.message.model.Addressing
3031
import no.nav.emottak.message.model.Direction.IN
3132
import no.nav.emottak.message.model.EmailAddress
@@ -55,7 +56,16 @@ import kotlin.test.assertTrue
5556
class CPARepoIntegrationTest : PostgresOracleTest() {
5657

5758
private fun <T> cpaRepoTestApp(testBlock: suspend ApplicationTestBuilder.() -> T) = testApplication {
58-
application(cpaApplicationModule(postgres.dataSource, postgres.dataSource, oracle.dataSource))
59+
val eventRegistrationService = EventRegistrationServiceFake()
60+
61+
application(
62+
cpaApplicationModule(
63+
postgres.dataSource,
64+
postgres.dataSource,
65+
oracle.dataSource,
66+
eventRegistrationService
67+
)
68+
)
5969
testBlock()
6070
}
6171

cpa-repo/src/test/kotlin/no/nav/emottak/cpa/PartnerIntegrationTest.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import io.ktor.server.testing.ApplicationTestBuilder
99
import io.ktor.server.testing.testApplication
1010
import no.nav.emottak.cpa.databasetest.PostgresOracleTest
1111
import no.nav.emottak.cpa.persistence.gammel.PARTNER_CPA
12+
import no.nav.emottak.cpa.util.EventRegistrationServiceFake
1213
import org.jetbrains.exposed.sql.deleteAll
1314
import org.jetbrains.exposed.sql.insert
1415
import org.jetbrains.exposed.sql.transactions.transaction
@@ -35,7 +36,16 @@ class PartnerIntegrationTest : PostgresOracleTest() {
3536
}
3637

3738
fun <T> cpaRepoTestApp(testBlock: suspend ApplicationTestBuilder.() -> T) = testApplication {
38-
application(cpaApplicationModule(postgres.dataSource, postgres.dataSource, oracle.dataSource))
39+
val eventRegistrationService = EventRegistrationServiceFake()
40+
41+
application(
42+
cpaApplicationModule(
43+
postgres.dataSource,
44+
postgres.dataSource,
45+
oracle.dataSource,
46+
eventRegistrationService
47+
)
48+
)
3949
testBlock()
4050
}
4151

0 commit comments

Comments
 (0)