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

Feature/navn tss mottaker #896

Merged
merged 4 commits into from
Sep 13, 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
4 changes: 2 additions & 2 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ services:
- AZURE_OPENID_CONFIG_JWKS_URI=https://login.microsoftonline.com/966ac572-f5b7-4bbe-aa88-c76419c0f851/discovery/v2.0/keys
- AZURE_OPENID_CONFIG_ISSUER=https://login.microsoftonline.com/966ac572-f5b7-4bbe-aa88-c76419c0f851/v2.0
- AZURE_APP_CLIENT_ID=66a118a6-95db-4a64-be81-3af02048a46e
- AZURE_APP_PRE_AUTHORIZED_APPS=[{"name":"skribenten-backend-lokal","clientId":"d8057f3d-871b-4ea9-973e-f5facdc04590"}]
- AZURE_APP_PRE_AUTHORIZED_APPS=[{"name":"skribenten-backend","clientId":"adce3431-deeb-422f-959c-298b644b7611"}]
# Allows requests without auth-header #opens up debug port
- JAVA_TOOL_OPTIONS=-Dio.ktor.development=true -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
build: ./pensjon-brevbaker
Expand Down Expand Up @@ -133,7 +133,7 @@ services:
EXPRESS_PORT: "8084"
EXPRESS_HOST: "::"
SKRIBENTEN_API_URL: "http://skribenten-backend:8080"
SKRIBENTEN_API_SCOPE: "api://dev-gcp.pensjonsbrev.skribenten-backend-lokal/.default"
SKRIBENTEN_API_SCOPE: "api://dev-gcp.pensjonsbrev.skribenten-backend/.default"

brevoppskrift:
profiles:
Expand Down
3 changes: 0 additions & 3 deletions pensjon-brevbaker/.nais/dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ preAuthorized:
- name: locust
namespace: pensjonsbrev
cluster: dev-gcp
- name: skribenten-backend-lokal
namespace: pensjonsbrev
cluster: dev-gcp
- name: skribenten-backend
namespace: pensjonsbrev
cluster: dev-gcp
Expand Down
3 changes: 2 additions & 1 deletion skribenten-backend/fetch-secrets.sh
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ which base64 || (
) || exit 1

mkdir -p secrets
kubectl --context $KUBE_CLUSTER -n pensjonsbrev get secret azure-skribenten-backend-lokal -o json | jq '.data | map_values(@base64d)' > secrets/azuread.json
secret_name="$(kubectl --context $KUBE_CLUSTER -n pensjonsbrev get azureapp skribenten-backend -o=jsonpath='{.spec.secretName}')"
kubectl --context $KUBE_CLUSTER -n pensjonsbrev get secret "${secret_name}" -o json | jq '.data | map_values(@base64d)' > secrets/azuread.json
echo "Creating azuread.env file from azuread.json..."
jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' secrets/azuread.json > secrets/azuread.env
echo "azuread.env file created in the \"secrets\" folder."
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,30 @@ fun Application.configureRouting(authConfig: JwtConfig, skribentenConfig: Config
val krrService = KrrService(servicesConfig.getConfig("krr"), authService)
val brevbakerService = BrevbakerService(servicesConfig.getConfig("brevbaker"), authService)
val brevmetadataService = BrevmetadataService(servicesConfig.getConfig("brevmetadata"))
val tjenestebussIntegrasjonService =
TjenestebussIntegrasjonService(
servicesConfig.getConfig("tjenestebussintegrasjon"),
servicesConfig.getConfig("samhandlerProxy"),
authService
)
val samhandlerService = SamhandlerService(servicesConfig.getConfig("samhandlerProxy"), authService)
val tjenestebussIntegrasjonService = TjenestebussIntegrasjonService(servicesConfig.getConfig("tjenestebussintegrasjon"), authService)
val navansattService = NavansattService(servicesConfig.getConfig("navansatt"), authService)
val legacyBrevService = LegacyBrevService(brevmetadataService, safService, penService, navansattService)
val brevmalService = BrevmalService(penService, brevmetadataService, brevbakerService)
val brevredigeringService = BrevredigeringService(brevbakerService, penService, navansattService)
val brevredigeringService = BrevredigeringService(brevbakerService, penService, navansattService, samhandlerService)


routing {
healthRoute()

authenticate(authConfig.name) {
setupServiceStatus(safService, penService, pensjonPersonDataService, pdlService, krrService, brevbakerService, brevmetadataService, tjenestebussIntegrasjonService, navansattService)
setupServiceStatus(
safService,
penService,
pensjonPersonDataService,
pdlService,
krrService,
brevbakerService,
brevmetadataService,
samhandlerService,
tjenestebussIntegrasjonService,
navansattService
)

landRoute()
brevmal(brevbakerService)
Expand All @@ -54,7 +61,7 @@ fun Application.configureRouting(authConfig: JwtConfig, skribentenConfig: Config
safService,
)
brev(brevredigeringService)
tjenestebussIntegrasjonRoute(tjenestebussIntegrasjonService)
tjenestebussIntegrasjonRoute(samhandlerService, tjenestebussIntegrasjonService)
meRoute(navansattService)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import no.nav.pensjon.brev.skribenten.model.Api
import no.nav.pensjon.brev.skribenten.model.Pen

fun Mottaker.toApi(): Api.OverstyrtMottaker = when (type) {
MottakerType.SAMHANDLER -> Api.OverstyrtMottaker.Samhandler(tssId!!)
MottakerType.SAMHANDLER -> Api.OverstyrtMottaker.Samhandler(tssId!!, null)
MottakerType.NORSK_ADRESSE -> Api.OverstyrtMottaker.NorskAdresse(navn!!, postnummer!!, poststed!!, adresselinje1, adresselinje2, adresselinje3)
MottakerType.UTENLANDSK_ADRESSE -> Api.OverstyrtMottaker.UtenlandskAdresse(
navn!!,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ object Api {
JsonSubTypes.Type(OverstyrtMottaker.UtenlandskAdresse::class, name = "UtenlandskAdresse"),
)
sealed class OverstyrtMottaker {
data class Samhandler(val tssId: String) : OverstyrtMottaker()
data class Samhandler(val tssId: String, val navn: String?) : OverstyrtMottaker()
data class NorskAdresse(
val navn: String,
val postnummer: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,18 @@ import io.ktor.server.routing.*
import no.nav.pensjon.brev.skribenten.routes.tjenestebussintegrasjon.dto.FinnSamhandlerRequestDto
import no.nav.pensjon.brev.skribenten.routes.tjenestebussintegrasjon.dto.HentSamhandlerAdresseRequestDto
import no.nav.pensjon.brev.skribenten.routes.tjenestebussintegrasjon.dto.HentSamhandlerRequestDto
import no.nav.pensjon.brev.skribenten.services.SamhandlerService
import no.nav.pensjon.brev.skribenten.services.TjenestebussIntegrasjonService

fun Route.tjenestebussIntegrasjonRoute(tjenestebussIntegrasjonService: TjenestebussIntegrasjonService) {
fun Route.tjenestebussIntegrasjonRoute(samhandlerService: SamhandlerService, tjenestebussIntegrasjonService: TjenestebussIntegrasjonService) {

post("/finnSamhandler") {
val requestDto = call.receive<FinnSamhandlerRequestDto>()
call.respond(tjenestebussIntegrasjonService.finnSamhandler(call, requestDto))
call.respond(samhandlerService.finnSamhandler(call, requestDto))
}
post("/hentSamhandler") {
val requestDto = call.receive<HentSamhandlerRequestDto>()
call.respond(tjenestebussIntegrasjonService.hentSamhandler(call, requestDto.idTSSEkstern))
call.respond(samhandlerService.hentSamhandler(call, requestDto.idTSSEkstern))
}
post("/hentSamhandlerAdresse") {
val requestDto = call.receive<HentSamhandlerAdresseRequestDto>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class BrevredigeringService(
private val brevbakerService: BrevbakerService,
private val penService: PenService,
private val navansattService: NavansattService,
private val samhandlerService: SamhandlerService,
) {
companion object {
val RESERVASJON_TIMEOUT = 10.minutes.toJavaDuration()
Expand Down Expand Up @@ -94,7 +95,7 @@ class BrevredigeringService(
Mottaker.new(it.id.value) { oppdater(mottaker) }
}
}.mapBrev(template)
}.oppdaterMedAnsattNavn(call)
}.oppdaterMedEksternData(call)
}
}

Expand Down Expand Up @@ -125,7 +126,7 @@ class BrevredigeringService(
saksbehandlerValg = nyeSaksbehandlerValg ?: brev.saksbehandlerValg
sistRedigertAvNavIdent = call.principal().navIdent()
}.mapBrev(template)
}.oppdaterMedAnsattNavn(call)
}.oppdaterMedEksternData(call)
}
}

Expand All @@ -138,7 +139,7 @@ class BrevredigeringService(
mottaker?.oppdater(patch.mottaker) ?: Mottaker.new(brevId) { oppdater(patch.mottaker) }
}
}?.also { Brevredigering.reload(it, true) }?.let {
it.mapBrev(brevbakerService.getRedigerbarTemplate(call, it.brevkode)).oppdaterMedAnsattNavn(call)
it.mapBrev(brevbakerService.getRedigerbarTemplate(call, it.brevkode)).oppdaterMedEksternData(call)
}
}

Expand All @@ -161,7 +162,7 @@ class BrevredigeringService(
redigertBrev = it
this.signaturSignerende = signaturSignerende
}.mapBrev(template)
}.oppdaterMedAnsattNavn(call)
}.oppdaterMedEksternData(call)
}
}

Expand Down Expand Up @@ -195,19 +196,19 @@ class BrevredigeringService(
).map { brev.redigertBrev.updateEditedLetter(it) }
.map {
val template = brevbakerService.getRedigerbarTemplate(call, brev.brevkode)
transaction { brev.apply { redigertBrev = it }.mapBrev(template) }.oppdaterMedAnsattNavn(call)
transaction { brev.apply { redigertBrev = it }.mapBrev(template) }.oppdaterMedEksternData(call)
}
}
} else {
val template = transaction { Brevredigering.findByIdAndSaksId(brevId, saksId)?.brevkode }?.let { brevbakerService.getRedigerbarTemplate(call, it) }
transaction { Brevredigering.findByIdAndSaksId(brevId, saksId)?.mapBrev(template) }?.let { Ok(it.oppdaterMedAnsattNavn(call)) }
transaction { Brevredigering.findByIdAndSaksId(brevId, saksId)?.mapBrev(template) }?.let { Ok(it.oppdaterMedEksternData(call)) }
}

suspend fun hentBrevForSak(call: ApplicationCall, saksId: Long): List<Api.BrevInfo> =
newSuspendedTransaction {
Brevredigering.find { BrevredigeringTable.saksId eq saksId }.map {
mapBrevInfo(it, brevbakerService.getRedigerbarTemplate(call, it.brevkode))
.oppdaterMedAnsattNavn(call )
.oppdaterMedEksternData(call )
}
}

Expand Down Expand Up @@ -420,17 +421,19 @@ class BrevredigeringService(
)
}

private suspend fun Api.BrevResponse.oppdaterMedAnsattNavn(call: ApplicationCall): Api.BrevResponse =
copy(info = info.oppdaterMedAnsattNavn(call))
private suspend fun Api.BrevResponse.oppdaterMedEksternData(call: ApplicationCall): Api.BrevResponse =
copy(info = info.oppdaterMedEksternData(call))

private suspend fun Api.BrevInfo.oppdaterMedAnsattNavn(call: ApplicationCall): Api.BrevInfo =
private suspend fun Api.BrevInfo.oppdaterMedEksternData(call: ApplicationCall): Api.BrevInfo =
copy(
opprettetAv = opprettetAv.oppdaterMedNavn(call),
sistredigertAv = sistredigertAv.oppdaterMedNavn(call),
status = if (status is Api.BrevStatus.UnderRedigering) {
Api.BrevStatus.UnderRedigering(status.redigeresAv.oppdaterMedNavn(call))
} else status
} else status,
mottaker = if (mottaker is Samhandler) mottaker.copy(navn = samhandlerService.hentSamhandlerNavn(call, mottaker.tssId)) else mottaker,
)

private suspend fun Api.NavAnsatt.oppdaterMedNavn(call: ApplicationCall): Api.NavAnsatt =
Api.NavAnsatt(id, navansattService.hentNavansatt(call, id.id)?.navn)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package no.nav.pensjon.brev.skribenten.services

import com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
import com.typesafe.config.Config
import io.ktor.client.plugins.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.request.*
import io.ktor.http.*
import io.ktor.http.ContentType.Application.Json
import io.ktor.serialization.jackson.*
import io.ktor.server.application.*
import no.nav.pensjon.brev.skribenten.Cache
import no.nav.pensjon.brev.skribenten.auth.AzureADOnBehalfOfAuthorizedHttpClient
import no.nav.pensjon.brev.skribenten.auth.AzureADService
import no.nav.pensjon.brev.skribenten.routes.tjenestebussintegrasjon.dto.FinnSamhandlerRequestDto
import no.nav.pensjon.brev.skribenten.routes.tjenestebussintegrasjon.dto.FinnSamhandlerResponseDto
import no.nav.pensjon.brev.skribenten.routes.tjenestebussintegrasjon.dto.HentSamhandlerResponseDto
import org.slf4j.LoggerFactory

class SamhandlerService(configSamhandlerProxy: Config, authService: AzureADService): ServiceStatus {
private val samhandlerProxyUrl = configSamhandlerProxy.getString("url")
private val samhandlerProxyScope = configSamhandlerProxy.getString("scope")

private val samhandlerProxyClient =
AzureADOnBehalfOfAuthorizedHttpClient(samhandlerProxyScope, authService) {
defaultRequest {
url(samhandlerProxyUrl)
}
install(ContentNegotiation) {
jackson {
disable(FAIL_ON_UNKNOWN_PROPERTIES)
}
}
}

private val logger = LoggerFactory.getLogger(SamhandlerService::class.java)

suspend fun finnSamhandler(
call: ApplicationCall,
requestDto: FinnSamhandlerRequestDto,
): FinnSamhandlerResponseDto =
samhandlerProxyClient.post(call, "/api/samhandler/finnSamhandler") {
contentType(Json)
accept(Json)
setBody(lagRequest(requestDto))
}.toServiceResult<FinnSamhandlerResponse>()
.map { it.toFinnSamhandlerResponseDto() }
.catch { message, status ->
logger.error("Feil ved samhandler søk. Status: $status Melding: $message")
FinnSamhandlerResponseDto("Feil ved henting av samhandler")
}

suspend fun hentSamhandler(
call: ApplicationCall,
idTSSEkstern: String,
): HentSamhandlerResponseDto =
samhandlerProxyClient.get(call, "/api/samhandler/hentSamhandlerEnkel/") {
url {
appendPathSegments(idTSSEkstern)
}
contentType(Json)
accept(Json)
}.toServiceResult<SamhandlerEnkel>()
.map { it.toHentSamhandlerResponseDto() }
.catch { message, status ->
logger.error("Feil ved henting av samhandler fra tjenestebuss-integrasjon. Status: $status Melding: $message")
HentSamhandlerResponseDto(null, HentSamhandlerResponseDto.FailureType.GENERISK)
}

private val samhandlerNavnCache = Cache<String, String>()
suspend fun hentSamhandlerNavn(call: ApplicationCall, idTSSEkstern: String): String? = samhandlerNavnCache.cached(idTSSEkstern) {
hentSamhandler(call, idTSSEkstern).success?.navn
}

override val name = "SamhandlerService"
override suspend fun ping(call: ApplicationCall): ServiceResult<Boolean> =
samhandlerProxyClient.get(call, "/api/samhandler/ping").toServiceResult<String>().map { true }

private fun lagRequest(requestDto: FinnSamhandlerRequestDto) =
when (requestDto) {
is FinnSamhandlerRequestDto.DirekteOppslag -> {
Soek(
navn = null,
idType = requestDto.identtype,
offentligId = requestDto.id,
samhandlerType = requestDto.samhandlerType.name,
)
}
is FinnSamhandlerRequestDto.Organisasjonsnavn -> {
Soek(
navn = requestDto.navn,
idType = null,
offentligId = null,
samhandlerType = requestDto.samhandlerType.name,
)
}
is FinnSamhandlerRequestDto.Personnavn -> {
Soek(
"${requestDto.etternavn} ${requestDto.fornavn}",
null,
null,
requestDto.samhandlerType.name,
)
}
}

data class Soek(
val navn: String?,
val idType: String?,
val offentligId: String?,
val samhandlerType: String?,
)

data class FinnSamhandlerResponse(
val samhandlerList: List<Samhandler>,
)

private fun FinnSamhandlerResponse.toFinnSamhandlerResponseDto() =
FinnSamhandlerResponseDto(
samhandlere = samhandlerList.flatMap { samhandler ->
samhandler.avdelinger.map { avdeling ->
FinnSamhandlerResponseDto.Samhandler(
navn = avdeling.avdelingNavn.takeIf { !it.isNullOrBlank() } ?: samhandler.navn,
samhandlerType = samhandler.samhandlerType,
offentligId = samhandler.offentligId,
idType = samhandler.idType,
idTSSEkstern = avdeling.idTSSEkstern
)
}
}
)

data class SamhandlerEnkel(
val navn: String,
val samhandlerType: String,
val offentligId: String,
val idType: String,
)

data class Samhandler(
val navn: String,
val samhandlerType: String,
val offentligId: String,
val idType: String,
val avdelinger: List<Avdeling>,
)

data class Avdeling(
val idTSSEkstern: String,
val avdelingNavn: String?,
val avdelingType: String?,
val avdelingsnr: String?
)

private fun SamhandlerEnkel.toHentSamhandlerResponseDto() =
HentSamhandlerResponseDto(
success = HentSamhandlerResponseDto.Success(
navn = navn,
samhandlerType = samhandlerType,
offentligId = offentligId,
idType = idType,
),
failure = null
)
}
Loading