Skip to content

Conversation

@OleksandrChmyrNAV
Copy link
Contributor

Lagt til registrering av hendelser:

MESSAGE_VALIDATED_AGAINST_CPA
VALIDATION_AGAINST_CPA_FAILED

@OleksandrChmyrNAV OleksandrChmyrNAV requested a review from a team as a code owner May 22, 2025 07:43
@OleksandrChmyrNAV OleksandrChmyrNAV changed the title #190 registrere hendelser i cpa repo #190 Registrere hendelser i cpa-repo May 22, 2025
Comment on lines 1 to 56
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

interface EventRegistrationService {
suspend fun registerEvent(
eventType: EventType,
validationRequest: ValidationRequest,
eventData: String = "{}"
)
}

class EventRegistrationServiceImpl(
private val eventLoggingService: EventLoggingService
) : EventRegistrationService {
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")
}
}
Copy link
Contributor

@ivanskodje ivanskodje May 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dette skurrer litt for meg pga. double takes når jeg leser koden: Vi logger at vi "publiserer event" her, men metoden vi kaller heter logEvent, og den ligger i eventLoggingService. Det gir inntrykk av at vi blander begreper, noe som gjør det vanskeligere å forstå hva som faktisk skjer. Vi burde ta et steg tilbake og vurdere om både metodenavnet og servicenavnet bør endres for å bedre gjenspeile det den egentlig gjør.

I tillegg mener jeg logglinjen som sier at et event publiseres, burde flyttes inn i eventLoggingService, hvis det faktisk er der publiseringen skjer. På den måten blir det lettere å se hvilket ansvar tjenesten har, og vi får samlet all logging av event-publisering på ett sted. Hvis det allerede logges der inne, kan loggen i denne klassen fjernes.

Til slutt, og kanskje viktigst ifh til navngiving: Klassenavnet EventRegistrationServiceImpl sier lite om hva implementasjonen faktisk gjør. Vi bør unngå generiske navn som dette, og heller bruke noe som beskriver implementasjonen tydeligere,, for eksempel KafkaEventPublisherService (e.l.), hvis det er det den gjør. Samtidig bør vi også unngå legacy mønstre som IInterface-prefiks eller Impl-postfix, slike navn gir lite verdi og gjør koden mindre tydelig.

Copy link
Contributor Author

@OleksandrChmyrNAV OleksandrChmyrNAV May 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Takk for en grundig semantisk analyse! 🙌

  1. Angående Publishing event er jeg helt enig. Det er bare et ord til for den samme handlingen. Opprinnelig ide var å kalle det som skjer i emottak-utils (altså kommunikasjon med Kafka) "logging events" og det som skjer i andre tjenester (altså bygging Event objekter ut av domene modeller) "registering events".
  2. EventLoggingService har ingen logging i det hele tatt, fordi klassen ligger i emottak-utils. Det betyr at man må sende logger objekt som avhengighet ved oppretting av servicen. Det ble utført da jeg ville ha så få avhengigheter i emottak-utils som mulig 🙂
  3. -Impl postfix markerer at det er den ekte utførelsen av grensesnittet i motsetning til klassen med -Fake postfiks, som markerer at utførelsen er for testformål. Hvis det blir andre ekte utførelser av servicen, kan vi sikkert bruke andre postfixer for dem.
  4. Hvis det blir neste runde av navngiving show kan vi bestemme hvilke mønstre gir verdi til koden. Som du så i går det finnes delte meninger på saken.

Copy link
Contributor

@kfh kfh May 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Samtidig bør vi også unngå legacy mønstre som IInterface-prefiks eller Impl-postfix, slike navn gir lite verdi og gjør koden mindre tydelig.

@ivanskodje I Kotlin finnes det til og med en fin måte å implementere et interface på så vi slipper disse Impl-klassene osv. Jeg foreslo det tidligere ref: #135 (comment)

Da kan du f.eks. ha en default implementasjon ala: MyService og evt tester og fakes som fakeService osv. Trenger du en ny implementasjon beskriver du hva den er i implementasjonsnavnet f.eks AnewService.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Samtidig bør vi også unngå legacy mønstre som IInterface-prefiks eller Impl-postfix, slike navn gir lite verdi og gjør koden mindre tydelig.

@ivanskodje I Kotlin finnes det til og med en fin måte å implementere et interface på så vi slipper disse Impl-klassene osv. Jeg foreslo det tidligere ref: #135 (comment)

Da kan du f.eks. ha en default implementasjon ala: MyService og evt tester og fakes som fakeService osv. Trenger du en ny implementasjon beskriver du hva den er i implementasjonsnavnet f.eks AnewService.

Litt enig med Oleksandr i den tråden du delte, men jeg er ikke enig i at vi skal bruke Impl postfix i noen som helst omstendigheter. Det har også ingenting med Test klassenavn å gjøre ved bruk av Fake som Oleksander tok opp som eksempel i denne tråden. Det er litt ironisk, fordi Test klasse navnet er fint fordi det beskriver hva det er, og ikke bare Impl. Det er bedre å gi implementasjonen et navn som beskriver hva den faktisk gjør, siden Impl-navngiving er et antipattern.
Det gir oss ingen informasjon om implementasjonens hensikt, og gjør det vanskeligere å forstå eller navigere i koden. Slike navn overlever ofte refaktorering og blir stående selv om innholdet endres, noe som bidrar til teknisk gjeld.

Men, default implementasjon trikset som du delte er fortsatt mye bedre alternativ enn å bruke Impl som er resultat av ikke ideelt navngiving 😅

Copy link
Contributor

@kfh kfh May 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Hvis det blir neste runde av navngiving show kan vi bestemme hvilke mønstre gir verdi til koden. Som du så i går det finnes delte meninger på saken.

wolf-of-wall-street-the-show-goes-on

Copy link
Contributor

@ivanskodje ivanskodje May 23, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tabs Vs Spaces neste-neste uke også! 🔥 😃


private fun <T> cpaRepoTestApp(testBlock: suspend ApplicationTestBuilder.() -> T) = testApplication {
application(cpaApplicationModule(postgres.dataSource, postgres.dataSource, oracle.dataSource))
val eventRegistrationService = EventRegistrationServiceFake()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Synes denne ble fin og tydelig - vi ser raskt og enkelt at dette er en egen test implementasjon 👍

Copy link
Contributor

@ivanskodje ivanskodje left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Synes det blir bra. Bra bruk av interface for å gjøre koden lettere å teste også 👍

Jeg har lagt inn en kommentar rundt navngiving og lesbarhet, der jeg tror det kan være lurt å vurdere noen justeringer for å unngå mulige utfordringer senere.

@OleksandrChmyrNAV OleksandrChmyrNAV merged commit ec6ed1a into main May 23, 2025
8 checks passed
@terjenilssen terjenilssen deleted the #190-registrere-hendelser-i-cpa-repo branch July 23, 2025 11:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants