Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PEK-503 Legg til mulighet til å pinge, ping SPK #151

Merged
merged 1 commit into from
Sep 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class SecurityConfig(
fun configure(http: HttpSecurity): DefaultSecurityFilterChain = http.run {
csrf { it.disable() }
authorizeHttpRequests {
it.requestMatchers(antMatcher("/actuator/**")).permitAll().anyRequest().authenticated()
it.requestMatchers(antMatcher("/actuator/**"), antMatcher("/v2025/tjenestepensjon/ping")).permitAll().anyRequest().authenticated()
}
oauth2ResourceServer {
it.authenticationManagerResolver(issuerResolver)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package no.nav.tjenestepensjon.simulering.ping

import com.fasterxml.jackson.annotation.JsonFormat
import java.time.LocalDateTime

class PingResponse(
val provider: String,
val tjeneste: String,
val melding: String,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
val timestamp: LocalDateTime = LocalDateTime.now()){
override fun toString(): String {
return "PingResponse(provider='$provider', tjeneste='$tjeneste, timestamp=$timestamp, melding='$melding')"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package no.nav.tjenestepensjon.simulering.ping

interface Pingable {
fun ping(): PingResponse
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package no.nav.tjenestepensjon.simulering.rest

import io.github.oshai.kotlinlogging.KotlinLogging
import no.nav.tjenestepensjon.simulering.ping.PingResponse
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.dto.Tjenestepensjon2025Mapper.mapToVellykketTjenestepensjonSimuleringResponse
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.dto.request.SimulerTjenestepensjonRequestDto
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.dto.response.SimulerTjenestepensjonResponseDto
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.dto.response.SimuleringsResultatTypeDto
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.exception.BrukerErIkkeMedlemException
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.exception.TpOrdningStoettesIkkeException
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.TjenestepensjonV2025Service
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController
Expand Down Expand Up @@ -35,4 +37,9 @@ class TjenestepensjonSimuleringV2025Controller(
return SimulerTjenestepensjonResponseDto(SimuleringsResultatTypeDto.ERROR, e.message)
}
}

@GetMapping("/v2025/tjenestepensjon/ping")
fun ping(): List<PingResponse> {
return tjenestepensjonV2025Service.ping()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@ import no.nav.tjenestepensjon.simulering.model.domain.TpOrdningDto
import no.nav.tjenestepensjon.simulering.model.domain.FNR
import no.nav.tjenestepensjon.simulering.model.domain.HateoasWrapper
import no.nav.tjenestepensjon.simulering.model.domain.TPOrdningIdDto
import no.nav.tjenestepensjon.simulering.ping.PingResponse
import no.nav.tjenestepensjon.simulering.ping.Pingable
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.TjenestepensjonV2025Client
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.spk.SPKTjenestepensjonClient
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.spk.SPKTjenestepensjonClient.Companion
import org.springframework.beans.factory.annotation.Value
import org.springframework.cache.annotation.Cacheable
import org.springframework.http.HttpStatus
import org.springframework.stereotype.Service
import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.reactive.function.client.bodyToFlux
import org.springframework.web.reactive.function.client.bodyToMono
import org.springframework.web.reactive.function.client.*
import org.springframework.web.server.ResponseStatusException
import reactor.core.Exceptions
import reactor.core.publisher.Flux
Expand All @@ -30,7 +33,7 @@ class TpClient(
private val jsonMapper: JsonMapper,
@Value("\${tp.url}") private var tpUrl: String,
@Value("\${tp.scope}") private val tpScope: String,
) {
) : Pingable {
private val log = KotlinLogging.logger {}

@Cacheable(TP_ORDNING_PERSON_CACHE)
Expand Down Expand Up @@ -103,7 +106,33 @@ class TpClient(
}

fun handleRemoteError(logMessage: String?): ResponseStatusException {
log.error{"Error fetching data from TP: $logMessage"}
log.error { "Error fetching data from TP: $logMessage" }
return ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR)
}

override fun ping(): PingResponse {
try{
val response = webClient.get()
.uri("$tpUrl/actuator/health/liveness")
.headers { it.setBearerAuth(aadClient.getToken(tpScope)) }
.retrieve().bodyToMono(String::class.java)
.block() ?: "PING OK, ingen response body"
return PingResponse(PROVIDER, TJENESTE, response)
} catch (e: WebClientResponseException) {
val errorMsg = "Failed to ping $PROVIDER ${e.responseBodyAsString}"
log.error(e) { errorMsg }
return PingResponse(PROVIDER, TJENESTE, errorMsg)
} catch (e: WebClientRequestException) {
log.error(e) { "Failed to ping $PROVIDER with url ${e.uri}" }
return PingResponse(PROVIDER, TJENESTE, "Failed")
} catch (e: Exception) {
log.error(e) { "An unexpected error occurred while pinging $PROVIDER ${e.message}" }
return PingResponse(PROVIDER, TJENESTE, "Unexpected error: ${e.message}")
}
}

companion object {
const val PROVIDER = "Tp-registeret"
const val TJENESTE = "TpForhold"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,8 @@ import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.exception.Tjen
interface TjenestepensjonV2025Client {
@Throws(TjenestepensjonSimuleringException::class)
fun simuler(request: SimulerTjenestepensjonRequestDto): Result<SimulertTjenestepensjon>

companion object {
const val TJENESTE = "tjenestepensjonV2025"
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service

import no.nav.tjenestepensjon.simulering.ping.PingResponse
import no.nav.tjenestepensjon.simulering.service.TpClient
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.domain.SimulertTjenestepensjon
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.dto.request.SimulerTjenestepensjonRequestDto
Expand All @@ -11,14 +12,14 @@ import org.springframework.stereotype.Service

@Service
class TjenestepensjonV2025Service(
private val tpClient: TpClient,
private val tp: TpClient,
private val spk: SPKTjenestepensjonClient,
private val klp: KLPTjenestepensjonClient,
) {

@Throws(BrukerErIkkeMedlemException::class, TpOrdningStoettesIkkeException::class)
fun simuler(request: SimulerTjenestepensjonRequestDto): Result<SimulertTjenestepensjon> {
val tpOrdningNavn = tpClient.findTPForhold(request.fnr).flatMap { it.alias }.firstOrNull()
val tpOrdningNavn = tp.findTPForhold(request.fnr).flatMap { it.alias }.firstOrNull()
?: "spk" //TODO throw BrukerErIkkeMedlemException()

return when (tpOrdningNavn.lowercase()) {
Expand All @@ -27,4 +28,11 @@ class TjenestepensjonV2025Service(
else -> throw TpOrdningStoettesIkkeException(tpOrdningNavn)
}
}

fun ping(): List<PingResponse> {
return listOf(
spk.ping(),
klp.ping(),
tp.ping())
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,28 @@
package no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.klp

import io.github.oshai.kotlinlogging.KotlinLogging
import no.nav.tjenestepensjon.simulering.ping.PingResponse
import no.nav.tjenestepensjon.simulering.ping.Pingable
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.domain.SimulertTjenestepensjon
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.dto.request.SimulerTjenestepensjonRequestDto
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.exception.TjenestepensjonSimuleringException
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.TjenestepensjonV2025Client
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.TjenestepensjonV2025Client.Companion.TJENESTE
import org.springframework.stereotype.Service
import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.reactive.function.client.WebClientRequestException
import org.springframework.web.reactive.function.client.WebClientResponseException
import org.springframework.web.reactive.function.client.bodyToMono

@Service
class KLPTjenestepensjonClient(private val klpWebClient: WebClient) : TjenestepensjonV2025Client {
class KLPTjenestepensjonClient(private val klpWebClient: WebClient) : TjenestepensjonV2025Client, Pingable {
private val log = KotlinLogging.logger {}

override fun simuler(request: SimulerTjenestepensjonRequestDto): Result<SimulertTjenestepensjon> {
try {
val response = klpWebClient
.post()
.uri("/api/oftp/simulering/3200")
.uri(SIMULER_PATH)
.bodyValue(KLPMapper.mapToRequest(request))
.retrieve()
.bodyToMono<KLPSimulerTjenestepensjonResponse>()
Expand All @@ -34,4 +37,14 @@ class KLPTjenestepensjonClient(private val klpWebClient: WebClient) : Tjenestepe
return Result.failure(TjenestepensjonSimuleringException("Failed to send request to simulate tjenestepensjon 2025 hos KLP"))
}
}

override fun ping(): PingResponse {
return PingResponse(PROVIDER, TJENESTE, "Støttes ikke")
}

companion object {
private const val SIMULER_PATH = "/api/oftp/simulering/3200"
private const val PING_PATH = ""
private const val PROVIDER = "KLP"
}
}
Original file line number Diff line number Diff line change
@@ -1,37 +1,67 @@
package no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.spk

import io.github.oshai.kotlinlogging.KotlinLogging
import no.nav.tjenestepensjon.simulering.ping.PingResponse
import no.nav.tjenestepensjon.simulering.ping.Pingable
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.domain.SimulertTjenestepensjon
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.dto.request.SimulerTjenestepensjonRequestDto
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.exception.TjenestepensjonSimuleringException
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.TjenestepensjonV2025Client
import no.nav.tjenestepensjon.simulering.v2025.tjenestepensjon.v1.service.TjenestepensjonV2025Client.Companion.TJENESTE
import org.springframework.stereotype.Service
import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.reactive.function.client.WebClientRequestException
import org.springframework.web.reactive.function.client.WebClientResponseException
import org.springframework.web.reactive.function.client.bodyToMono

@Service
class SPKTjenestepensjonClient(private val spkWebClient: WebClient) : TjenestepensjonV2025Client {
class SPKTjenestepensjonClient(private val spkWebClient: WebClient) : TjenestepensjonV2025Client, Pingable {
private val log = KotlinLogging.logger {}

override fun simuler(request: SimulerTjenestepensjonRequestDto): Result<SimulertTjenestepensjon> {
try {
val response = spkWebClient
.post()
.uri("/nav/v2/tjenestepensjon/simuler/3010")
.uri(SIMULER_PATH)
.bodyValue(SPKMapper.mapToRequest(request))
.retrieve()
.bodyToMono<SPKSimulerTjenestepensjonResponse>()
.block()
return response?.let { Result.success(SPKMapper.mapToResponse(it)) } ?: Result.failure(TjenestepensjonSimuleringException("No response body"))
} catch (e: WebClientResponseException) {
val errorMsg = "Failed to simulate tjenestepensjon 2025 hos SPK ${ e.responseBodyAsString}"
val errorMsg = "Failed to simulate tjenestepensjon 2025 hos SPK ${e.responseBodyAsString}"
log.error(e) { errorMsg }
return Result.failure(TjenestepensjonSimuleringException(errorMsg))
} catch (e: WebClientRequestException){
} catch (e: WebClientRequestException) {
log.error(e) { "Failed to send request to simulate tjenestepensjon 2025 hos SPK med url ${e.uri}" }
return Result.failure(TjenestepensjonSimuleringException("Failed to send request to simulate tjenestepensjon 2025 hos SPK"))
}
}

override fun ping(): PingResponse {
try {
val response = spkWebClient.get()
.uri(PING_PATH)
.retrieve()
.bodyToMono<String>()
.block() ?: "PING OK, ingen response body"
return PingResponse(PROVIDER, TJENESTE, response)
} catch (e: WebClientResponseException) {
val errorMsg = "Failed to ping SPK ${e.responseBodyAsString}"
log.error(e) { errorMsg }
return PingResponse(PROVIDER, TJENESTE, errorMsg)
} catch (e: WebClientRequestException) {
log.error(e) { "Failed to ping SPK with url ${e.uri}" }
return PingResponse(PROVIDER, TJENESTE, "Failed to ping to SPK")
} catch (e: Exception) {
log.error(e) { "An unexpected error occurred while pinging ${PROVIDER} ${e.message}" }
return PingResponse(PROVIDER, TJENESTE, "Unexpected error: ${e.message}")
}
}

companion object {
private const val SIMULER_PATH = "/nav/v2/tjenestepensjon/simuler/3010"
private const val PING_PATH = "/nav/admin/ping"
private const val PROVIDER = "SPK"
}
}
Loading