Kotlin - kodeeksempler kodeverk

Eksempel som viser hvordan man kan opprette en http klient som kommuniserer med kodeverk ved å bruke Spring i programmeringsspråket Kotlin.

Spring konfigurering:

# application.yaml

api:
  client:
    yrkesskade_baseurl: https://yrkesskade-ekstern-gateway.nav.no

Klient for å kommunisere med kodeverk:

// KodeverkClient.kt

@Component
class KodeverkClient(
    val webClientBuilder: WebClient.Builder,
    @Value("\${api.client.yrkesskade_baseurl}") val yrkesskadeBaseurl: String
) {

    private val webClient = createWebClient(yrkesskadeBaseurl)

    @Retryable
    fun hentKodeverkForType(type: String, spraak: String): Map<String, KodeverdiDto>? {
        return kallKodeverkApi(type, null)
    }

    @Retryable
    fun hentKodeverkForTypeOgKategori(
        type: String,
        kategori: String,
        spraak: String
    ): Map<String, KodeverdiDto>? {
        return kallKodeverkApi(type, kategori)
    }

    private fun kallKodeverkApi(
        typenavn: String,
        kategorinavn: String?,
        spraak: String = "nb"
    ): Map<String, KodeverdiDto>? {

        val response = webClient.get().uri { uriBuilder ->
            uriBuilder
                .pathSegment("api")
                .pathSegment("v1")
                .pathSegment("kodeverk")
                .pathSegment("typer")
                .pathSegment(typenavn)

            if (kategorinavn != null) {
                uriBuilder
                    .pathSegment("kategorier")
                    .pathSegment(kategorinavn)
            }

            uriBuilder.pathSegment("kodeverdier")
            uriBuilder.queryParam("spraak", spraak)
            uriBuilder.build()
        }
            .retrieve()
            .bodyToMono<KodeverdiResponsDto>()
            .block() ?: throw RuntimeException("Kunne ikke hente kodeverkverdier for type $typenavn")

        return response.kodeverdierMap
    }

    /**
     * En felles metode for å opprette en webclient med spesifisert URL
     */
    fun createWebClient(url: String): WebClient = webClientBuilder
        .baseUrl(url)
        .clientConnector(ReactorClientHttpConnector(HttpClient.newConnection()))
        .build()
}