Skip to content

Commit 8e2f857

Browse files
authored
Refactoring (#3)
* Refactoring OrderlinjeAPI.kt * BadRequest message 💅 * Remove stale todos * Simplification of ServiceForespørselAPI.kt * Logging 💅 * Added try-catches to OrdreAPI.kt since there is no StatusPages plugin in this project.
1 parent 2328415 commit 8e2f857

File tree

4 files changed

+97
-79
lines changed

4 files changed

+97
-79
lines changed

src/main/kotlin/no/nav/hjelpemidler/api/OrdreAPI.kt

Lines changed: 46 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package no.nav.hjelpemidler.api
33
import io.ktor.http.HttpStatusCode
44
import io.ktor.server.application.call
55
import io.ktor.server.request.receive
6+
import io.ktor.server.response.respond
67
import io.ktor.server.routing.Route
78
import io.ktor.server.routing.post
89
import mu.KotlinLogging
@@ -18,47 +19,59 @@ private val log = KotlinLogging.logger { }
1819

1920
fun Route.ordreAPI(context: Context) {
2021
post("/ordrekvittering") {
21-
val kvittering = call.receive<Ordrekvittering>()
22-
log.info {
23-
"Mottok ordrekvittering, $kvittering"
22+
try {
23+
val kvittering = call.receive<Ordrekvittering>()
24+
log.info {
25+
"Mottok ordrekvittering, $kvittering"
26+
}
27+
context.publish(
28+
kvittering.saksnummer,
29+
OrdrekvitteringMottatt(kvittering = kvittering)
30+
)
31+
call.response.status(HttpStatusCode.OK)
32+
} catch (e: Exception) {
33+
log.error(e) { "Uventet feil under prosessering" }
34+
call.respond(HttpStatusCode.InternalServerError)
35+
return@post
2436
}
25-
context.publish(
26-
kvittering.saksnummer,
27-
OrdrekvitteringMottatt(kvittering = kvittering)
28-
)
29-
call.response.status(HttpStatusCode.OK)
3037
}
3138
post("/ordrefeilmelding") {
32-
val feilmelding = call.receive<Ordrefeilmelding>()
33-
log.warn {
34-
"Mottok ordrefeilmelding, $feilmelding"
35-
}
36-
context.publish(
37-
feilmelding.saksnummer,
38-
OrdrefeilmeldingMottatt(feilmelding = feilmelding)
39-
)
40-
if (Configuration.profile == Profile.PROD) {
41-
Slack.post(
42-
text = "*${Configuration.profile}* - $feilmelding - <@${Configuration.slackRecipient}>",
43-
channel = "#digihot-oebs"
39+
try {
40+
val feilmelding = call.receive<Ordrefeilmelding>()
41+
log.warn {
42+
"Mottok ordrefeilmelding, $feilmelding"
43+
}
44+
context.publish(
45+
feilmelding.saksnummer,
46+
OrdrefeilmeldingMottatt(feilmelding = feilmelding)
4447
)
45-
Ntfy.publish(
46-
Ntfy.Notification(
47-
title = "Mottok ordrefeilmelding",
48-
message = "Status: ${feilmelding.status}",
49-
priority = Ntfy.Priority.HIGH,
50-
actions = setOf(
51-
Ntfy.Action(
52-
action = Ntfy.ActionType.VIEW,
53-
label = "Se detaljer i Slack",
54-
clear = true,
55-
url = "https://nav-it.slack.com/archives/C02LS2W05E1"
48+
if (Configuration.profile == Profile.PROD) {
49+
Slack.post(
50+
text = "*${Configuration.profile}* - $feilmelding - <@${Configuration.slackRecipient}>",
51+
channel = "#digihot-oebs"
52+
)
53+
Ntfy.publish(
54+
Ntfy.Notification(
55+
title = "Mottok ordrefeilmelding",
56+
message = "Status: ${feilmelding.status}",
57+
priority = Ntfy.Priority.HIGH,
58+
actions = setOf(
59+
Ntfy.Action(
60+
action = Ntfy.ActionType.VIEW,
61+
label = "Se detaljer i Slack",
62+
clear = true,
63+
url = "https://nav-it.slack.com/archives/C02LS2W05E1"
64+
)
5665
)
5766
)
5867
)
59-
)
68+
}
69+
call.response.status(HttpStatusCode.OK)
70+
} catch (e: Exception) {
71+
log.error(e) { "Uventet feil under prosessering" }
72+
call.respond(HttpStatusCode.InternalServerError)
73+
return@post
6074
}
61-
call.response.status(HttpStatusCode.OK)
6275
}
6376
}
6477

src/main/kotlin/no/nav/hjelpemidler/api/OrdrelinjeAPI.kt

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper
55
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
66
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
77
import com.fasterxml.jackson.module.kotlin.readValue
8-
import io.ktor.client.request.request
98
import io.ktor.http.HttpStatusCode
109
import io.ktor.server.application.ApplicationCall
1110
import io.ktor.server.application.call
@@ -41,9 +40,21 @@ internal fun Route.ordrelinjeAPI(context: Context) {
4140
post("/push") {
4241
logg.info("incoming push")
4342
try {
44-
val ordrelinje = parseOrdrelinje(context, call) ?: return@post
43+
// Parse innkommende json/xml
44+
val ordrelinje = parseOrdrelinje(context, call) ?:
45+
return@post call.respond(HttpStatusCode.BadRequest, "request body was not in a valid format")
46+
47+
// Vi deler alle typer ordrelinjer med kommune-apiet
4548
sendUvalidertOrdrelinjeTilRapid(context, ordrelinje.toRåOrdrelinje())
46-
validerOrdrelinje(context, ordrelinje)
49+
50+
// Avslutt tidlig hvis ordrelinjen ikke er relevant for oss
51+
if (!erOrdrelinjeRelevantForOss(context, ordrelinje)) {
52+
logg.info("Urelevant ordrelinje mottatt og ignorert")
53+
call.respond(HttpStatusCode.OK)
54+
return@post
55+
}
56+
57+
// Anti-corruption lag
4758
val melding = if (ordrelinje.erOpprettetFraHOTSAK()) {
4859
parseHotsakOrdrelinje(context, ordrelinje)
4960
context.metrics.hotsakSF()
@@ -54,15 +65,13 @@ internal fun Route.ordrelinjeAPI(context: Context) {
5465
opprettInfotrygdOrdrelinje(ordrelinje)
5566
}
5667

68+
// Publiser resultat
5769
publiserMelding(context, ordrelinje, melding)
5870
call.respond(HttpStatusCode.OK)
59-
} catch (e: RapidsAndRiverException) {
60-
logg.error(e) { "Feil under prosessering" }
61-
call.respond(HttpStatusCode.InternalServerError, "Feil under prosessering")
62-
return@post
63-
} catch (e: RuntimeException) {
64-
logg.error(e) { "Feil under prosessering" }
65-
call.respond(HttpStatusCode.OK)
71+
72+
} catch (e: Exception) {
73+
logg.error(e) { "Uventet feil under prosessering" }
74+
call.respond(HttpStatusCode.InternalServerError)
6675
return@post
6776
}
6877
}
@@ -77,7 +86,13 @@ private suspend fun parseOrdrelinje(context: Context, call: ApplicationCall): Or
7786
val requestBody: String = call.receiveText()
7887
context.metrics.meldingFraOebs()
7988
if (Configuration.profile != Configuration.Profile.PROD) {
80-
sikkerlogg.info("Received $incomingFormatType push request from OEBS: $requestBody")
89+
withLoggingContext(
90+
mapOf(
91+
"requestBody" to requestBody,
92+
)
93+
) {
94+
sikkerlogg.info("Received $incomingFormatType push request from OEBS")
95+
}
8196
}
8297

8398
// Check for valid json request
@@ -90,32 +105,26 @@ private suspend fun parseOrdrelinje(context: Context, call: ApplicationCall): Or
90105
}.fiksTommeSerienumre()
91106

92107
if (Configuration.profile != Configuration.Profile.PROD) {
93-
sikkerlogg.info(
94-
"Parsing incoming $incomingFormatType request successful: ${
95-
mapperJson.writeValueAsString(
96-
ordrelinje
97-
)
98-
}"
99-
)
108+
withLoggingContext(
109+
mapOf(
110+
"ordrelinje" to mapperJson.writeValueAsString(ordrelinje),
111+
)
112+
) {
113+
sikkerlogg.info("Parsing incoming $incomingFormatType request successful")
114+
}
100115
}
101116
context.metrics.oebsParsingOk()
102117
return ordrelinje
103118
} catch (e: Exception) {
104119
// Deal with invalid json/xml in request
105120
withLoggingContext(
106121
mapOf(
107-
"rawRequestBody" to requestBody,
122+
"requestBody" to requestBody,
108123
)
109124
) {
110-
sikkerlogg.info("Parsing incoming $incomingFormatType request failed with exception (responding 4xx): $e")
111-
if (Configuration.profile != Configuration.Profile.PROD) {
112-
sikkerlogg.info(
113-
"$incomingFormatType in failed parsing: ${mapperJson.writeValueAsString(requestBody)}"
114-
)
115-
}
125+
sikkerlogg.error(e) { "Parsing incoming $incomingFormatType request failed with exception (responding 4xx)" }
116126
}
117127
context.metrics.oebsParsingFeilet()
118-
call.respond(HttpStatusCode.BadRequest, "bad request: $incomingFormatType not valid")
119128
return null
120129
}
121130
}
@@ -136,12 +145,12 @@ private fun sendUvalidertOrdrelinjeTilRapid(context: Context, ordrelinje: RåOrd
136145
context.metrics.meldingTilRapidSuksess()
137146
} catch (e: Exception) {
138147
context.metrics.meldingTilRapidFeilet()
139-
sikkerlogg.error("Sending av uvalidert ordrelinje til rapid feilet, exception: $e\n\n${e.printStackTrace()}")
148+
sikkerlogg.error(e) { "Sending av uvalidert ordrelinje til rapid feilet" }
140149
throw RapidsAndRiverException("Noe gikk feil ved publisering av melding")
141150
}
142151
}
143152

144-
private fun validerOrdrelinje(context: Context, ordrelinje: OrdrelinjeOebs) {
153+
private fun erOrdrelinjeRelevantForOss(context: Context, ordrelinje: OrdrelinjeOebs): Boolean {
145154
if (ordrelinje.serviceforespørseltype != "Vedtak Infotrygd") {
146155
if (ordrelinje.serviceforespørseltype == "") {
147156
logg.info(
@@ -155,7 +164,7 @@ private fun validerOrdrelinje(context: Context, ordrelinje: OrdrelinjeOebs) {
155164
)
156165
context.metrics.sfTypeUlikVedtakInfotrygd()
157166
}
158-
throw RuntimeException("Ugyldig ordrelinje")
167+
return false
159168
} else {
160169
context.metrics.sfTypeVedtakInfotrygd()
161170
}
@@ -166,10 +175,12 @@ private fun validerOrdrelinje(context: Context, ordrelinje: OrdrelinjeOebs) {
166175
) {
167176
logg.info("Mottok melding fra oebs med irrelevant hjelpemiddeltype ${ordrelinje.hjelpemiddeltype}. Avbryter prosessering")
168177
context.metrics.irrelevantHjelpemiddeltype()
169-
throw RuntimeException("Ugyldig ordrelinje")
178+
return false
170179
} else {
171180
context.metrics.rettHjelpemiddeltype()
172181
}
182+
183+
return true
173184
}
174185

175186
private fun publiserMelding(
@@ -182,22 +193,21 @@ private fun publiserMelding(
182193
context.publish(ordrelinje.fnrBruker, mapperJson.writeValueAsString(melding))
183194
context.metrics.meldingTilRapidSuksess()
184195

185-
// TODO: Remove logging when interface stabilizes
186196
ordrelinje.fnrBruker = "MASKERT"
187197
if (ordrelinje.sendtTilAdresse.take(4).toIntOrNull() == null) {
188198
// If address is not municipality-intake we mask it in logging.
189199
ordrelinje.sendtTilAdresse = "MASKERT"
190200
}
191-
sikkerlogg.info(
192-
"Ordrelinje med OebsId ${ordrelinje.oebsId} mottatt og sendt til rapid: ${
193-
mapperJson.writeValueAsString(
194-
ordrelinje
195-
)
196-
}"
197-
)
201+
withLoggingContext(
202+
mapOf(
203+
"ordrelinje" to mapperJson.writeValueAsString(ordrelinje),
204+
)
205+
) {
206+
sikkerlogg.info("Ordrelinje med OebsId ${ordrelinje.oebsId} mottatt og sendt til rapid")
207+
}
198208
} catch (e: Exception) {
199209
context.metrics.meldingTilRapidFeilet()
200-
sikkerlogg.error("Sending til rapid feilet", e)
210+
sikkerlogg.error(e) { "Sending til rapid feilet" }
201211
throw RapidsAndRiverException("Noe gikk feil ved publisering av melding")
202212
}
203213
}

src/main/kotlin/no/nav/hjelpemidler/api/ServiceForespørselAPI.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,10 @@ internal fun Route.serviceforespørselAPI(context: Context) {
3333
)
3434
publiserMelding(context, serviceForespørselEndring, sfMessage)
3535
call.respond(HttpStatusCode.OK)
36-
} catch (e: RapidsAndRiverException) {
36+
} catch (e: Exception) {
3737
logg.error(e) { "Feil under prosessering" }
3838
call.respond(HttpStatusCode.InternalServerError, "Feil under prosessering")
3939
return@post
40-
} catch (e: RuntimeException) {
41-
logg.error(e) { "Feil under prosessering" }
42-
call.respond(HttpStatusCode.OK)
43-
return@post
4440
}
4541
}
4642
}
@@ -88,7 +84,7 @@ private fun publiserMelding(
8884
context.metrics.meldingTilRapidSuksess()
8985
} catch (e: Exception) {
9086
context.metrics.meldingTilRapidFeilet()
91-
sikkerlogg.error("Sending til rapid feilet", e)
87+
sikkerlogg.error(e) { "Sending til rapid feilet" }
9288
throw RapidsAndRiverException("Noe gikk feil ved publisering av melding")
9389
}
9490
}

src/main/kotlin/no/nav/hjelpemidler/model/OrdrelinjeOebs.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ data class OrdrelinjeOebs(
8181
val enhet: String,
8282

8383
@JsonProperty("AccountNumber")
84-
// TODO: Skift tilbake til val når ting stabiliserer seg
8584
var fnrBruker: String,
8685

8786
// Sidan dette feltet har informasjon som kan bli utdatert blir ikkje dette brukt.

0 commit comments

Comments
 (0)