Skip to content

Commit 177bd73

Browse files
beredskapstatistikk (#14)
* beredskapstatistikk
1 parent d7230e8 commit 177bd73

File tree

10 files changed

+198
-60
lines changed

10 files changed

+198
-60
lines changed

src/main/kotlin/no/nav/tms/statistikk/varsel/VarselAktivertSink.kt

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import com.fasterxml.jackson.module.kotlin.readValue
44
import io.github.oshai.kotlinlogging.KotlinLogging
55
import no.nav.helse.rapids_rivers.*
66
import no.nav.tms.statistikk.defaultDeserializer
7+
import no.nav.tms.statistikk.varsel.BeredskapMetadata.Companion.beredskapMetadata
78

89
class VarselAktivertSink(
910
rapidsConnection: RapidsConnection,
1011
private val repository: VarselRepository
11-
): River.PacketListener {
12+
) : River.PacketListener {
1213

1314
private val log = KotlinLogging.logger {}
1415

@@ -27,18 +28,38 @@ class VarselAktivertSink(
2728
"innhold",
2829
"sensitivitet"
2930
)
30-
it.interestedIn("aktivFremTil","eksternVarslingBestilling")
31+
it.interestedIn("aktivFremTil", "eksternVarslingBestilling", "metadata")
3132
}
3233
}.register(this)
3334
}
3435

3536
override fun onPacket(packet: JsonMessage, context: MessageContext) {
3637
val aktivertVarsel: AktivertVarsel = objectMapper.readValue(packet.toJson())
37-
3838
repository.insertVarsel(aktivertVarsel)
39+
packet.beredskapMetadata()?.let {
40+
repository.insertBeredskapReference(it, packet["varselId"].asText())
41+
}
3942
}
4043

4144
override fun onError(problems: MessageProblems, context: MessageContext) {
4245
log.info { problems.toString() }
4346
}
4447
}
48+
49+
class BeredskapMetadata private constructor(
50+
val tittel: String?,
51+
val ref: String?
52+
) {
53+
val isEmpty = tittel == null && ref == null
54+
55+
companion object {
56+
fun JsonMessage.beredskapMetadata() = BeredskapMetadata(
57+
this["metadata"].findValue("beredskap_tittel")?.asText(),
58+
this["metadata"].findValue("beredskap_ref")?.asText()
59+
).let {
60+
if (it.isEmpty)
61+
null
62+
else it
63+
}
64+
}
65+
}

src/main/kotlin/no/nav/tms/statistikk/varsel/VarselRepository.kt

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import no.nav.tms.statistikk.database.Database
55
import no.nav.tms.statistikk.toUtcLocalDateTime
66

77
class VarselRepository(private val database: Database) {
8-
fun insertVarsel(varsel: AktivertVarsel) = database.update {
9-
queryOf("""
8+
fun insertVarsel(varsel: AktivertVarsel) {
9+
database.update {
10+
queryOf(
11+
"""
1012
insert into varsel(
1113
eventId,
1214
ident,
@@ -35,25 +37,27 @@ class VarselRepository(private val database: Database) {
3537
:eksternVarslingBestilt
3638
) on conflict do nothing
3739
""",
38-
mapOf(
39-
"eventId" to varsel.varselId,
40-
"ident" to varsel.ident,
41-
"type" to varsel.type,
42-
"namespace" to varsel.produsent.namespace,
43-
"appnavn" to varsel.produsent.appnavn,
44-
"tekstlengde" to varsel.tekstLengde,
45-
"lenke" to varsel.harLenke,
46-
"sikkerhetsnivaa" to varsel.sensitivitet.loginLevel,
47-
"aktiv" to true,
48-
"frist" to varsel.frist,
49-
"forstBehandlet" to varsel.opprettet.toUtcLocalDateTime(),
50-
"eksternVarslingBestilt" to varsel.eksternVarslingBestilt
40+
mapOf(
41+
"eventId" to varsel.varselId,
42+
"ident" to varsel.ident,
43+
"type" to varsel.type,
44+
"namespace" to varsel.produsent.namespace,
45+
"appnavn" to varsel.produsent.appnavn,
46+
"tekstlengde" to varsel.tekstLengde,
47+
"lenke" to varsel.harLenke,
48+
"sikkerhetsnivaa" to varsel.sensitivitet.loginLevel,
49+
"aktiv" to true,
50+
"frist" to varsel.frist,
51+
"forstBehandlet" to varsel.opprettet.toUtcLocalDateTime(),
52+
"eksternVarslingBestilt" to varsel.eksternVarslingBestilt
53+
)
5154
)
52-
)
55+
}
5356
}
5457

5558
fun updateVarsel(varselInaktivert: VarselInaktivert) = database.update {
56-
queryOf("""
59+
queryOf(
60+
"""
5761
update varsel set aktiv = false, inaktivertTidspunkt = :tidspunkt, inaktivertKilde = :kilde
5862
where eventId = :eventId
5963
""",
@@ -66,7 +70,8 @@ class VarselRepository(private val database: Database) {
6670
}
6771

6872
fun registerVarselPerDag(varselPerDag: VarselPerDag) = database.update {
69-
queryOf("""
73+
queryOf(
74+
"""
7075
insert into varsler_per_dag(dato, ident, type, ekstern_varsling, antall)
7176
values(:dato, :ident, :type, :eksternVarsling, 1)
7277
on conflict (dato, ident, type, ekstern_varsling) do update set antall = varsler_per_dag.antall + 1
@@ -79,4 +84,32 @@ class VarselRepository(private val database: Database) {
7984
)
8085
)
8186
}
87+
88+
fun insertBeredskapReference(beredskapMetadata: BeredskapMetadata, varselId: String) {
89+
database.update {
90+
queryOf(
91+
"""
92+
insert into beredskapsvarsel (beredskap_ref,beredskap_tittel)
93+
values(:ref, :tittel)
94+
on conflict do nothing
95+
""".trimIndent(),
96+
mapOf(
97+
"ref" to beredskapMetadata.ref,
98+
"tittel" to beredskapMetadata.tittel
99+
)
100+
)
101+
}
102+
103+
database.update {
104+
queryOf(
105+
"""update varsel set beredskap_ref=:ref
106+
|where eventId = :varselId""".trimMargin(),
107+
mapOf(
108+
"ref" to beredskapMetadata.ref,
109+
"varselId" to varselId
110+
)
111+
)
112+
}
113+
114+
}
82115
}

src/main/kotlin/no/nav/tms/statistikk/varsel/varsel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ data class AktivertVarsel(
1313
val produsent: Produsent,
1414
val eksternVarslingBestilling: EksternVarslingBestilling? = null,
1515
val opprettet: ZonedDateTime,
16-
val aktivFremTil: ZonedDateTime? = null
16+
val aktivFremTil: ZonedDateTime? = null,
1717
) {
1818
val tekstLengde get() = innhold.defaultTekst().tekst.length
1919
val harLenke get() = innhold.link.isNullOrBlank().not()
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
create table beredskapsvarsel
2+
(
3+
id serial primary key,
4+
beredskap_tittel varchar not null,
5+
varselId varchar not null references varsel (eventid)
6+
)
7+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
drop table if exists beredskapsvarsel;
2+
3+
create table beredskapsvarsel
4+
(
5+
id serial primary key,
6+
beredskap_tittel varchar not null,
7+
beredskap_ref varchar not null unique
8+
);
9+
10+
alter table varsel
11+
add column beredskap_ref varchar default null;
12+
13+
14+

src/test/kotlin/LocalPostgresDatabase.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ class LocalPostgresDatabase private constructor() : Database {
1717
}
1818

1919
fun cleanDb(): LocalPostgresDatabase {
20+
2021
instance.cleanTables(
22+
"beredskapsvarsel",
2123
"varsel",
2224
"microfrontends",
2325
"utkast",

src/test/kotlin/no/nav/tms/statistikk/varsel/VarselAktivertSinkTest.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package no.nav.tms.statistikk.varsel
22

3+
import assert
34
import io.kotest.matchers.shouldBe
45
import io.kotest.matchers.shouldNotBe
56
import kotliquery.queryOf
67
import no.nav.helse.rapids_rivers.testsupport.TestRapid
78
import no.nav.tms.statistikk.database.DateTimeHelper
89
import no.nav.tms.statistikk.varsel.VarselTestData.VarselType.beskjed
10+
import no.nav.tms.statistikk.varsel.VarselTestData.addBeredskapMetadata
911
import org.junit.jupiter.api.AfterEach
1012
import org.junit.jupiter.api.BeforeAll
1113
import org.junit.jupiter.api.Test
@@ -23,6 +25,7 @@ internal class VarselAktivertSinkTest {
2325

2426
@AfterEach
2527
fun cleanDb() {
28+
database.update { queryOf("delete from beredskapsvarsel") }
2629
database.update { queryOf("delete from varsel") }
2730
}
2831

@@ -93,13 +96,38 @@ internal class VarselAktivertSinkTest {
9396
database.getVarsel(eventId2)?.lenke shouldBe true
9497
}
9598

99+
@Test
100+
fun `lagrer beredskapmetadata`() {
101+
val eventId1 = UUID.randomUUID().toString()
102+
val eventId2 = UUID.randomUUID().toString()
103+
104+
val medBeredskapsTittel =
105+
VarselTestData.varselAktivertMessage(varselId = eventId1).addBeredskapMetadata("Something happened")
106+
val utenBeredskapsTittel = VarselTestData.varselAktivertMessage(varselId = eventId2)
107+
108+
testRapid.sendTestMessage(utenBeredskapsTittel)
109+
testRapid.sendTestMessage(medBeredskapsTittel)
110+
111+
database.getVarsel(eventId2).assert {
112+
require(this != null)
113+
beredskapstittel shouldBe null
114+
}
115+
116+
database.getVarsel(eventId1).assert {
117+
require(this != null)
118+
beredskapstittel shouldBe "Something happened"
119+
beredskapsRef shouldBe "123"
120+
}
121+
}
122+
96123
@Test
97124
fun `tolker frist riktig`() {
98125
val eventId1 = UUID.randomUUID().toString()
99126
val eventId2 = UUID.randomUUID().toString()
100127

101128
val utenFrist = VarselTestData.varselAktivertMessage(varselId = eventId1, aktivFremTil = null)
102-
val medFrist = VarselTestData.varselAktivertMessage(varselId = eventId2, aktivFremTil = DateTimeHelper.nowAtUtcZ())
129+
val medFrist =
130+
VarselTestData.varselAktivertMessage(varselId = eventId2, aktivFremTil = DateTimeHelper.nowAtUtcZ())
103131

104132
testRapid.sendTestMessage(utenFrist)
105133
testRapid.sendTestMessage(medFrist)

src/test/kotlin/no/nav/tms/statistikk/varsel/VarselInaktivertSinkTest.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import io.kotest.matchers.shouldBe
44
import kotliquery.queryOf
55
import no.nav.helse.rapids_rivers.testsupport.TestRapid
66
import no.nav.tms.statistikk.database.DateTimeHelper
7+
import no.nav.tms.statistikk.varsel.VarselTestData.addBeredskapMetadata
78
import org.junit.jupiter.api.AfterEach
89
import org.junit.jupiter.api.BeforeAll
910
import org.junit.jupiter.api.Test
@@ -24,6 +25,7 @@ internal class VarselInaktivertSinkTest {
2425

2526
@AfterEach
2627
fun cleanDb() {
28+
database.update { queryOf("delete from beredskapsvarsel") }
2729
database.update { queryOf("delete from varsel") }
2830
}
2931

@@ -33,13 +35,21 @@ internal class VarselInaktivertSinkTest {
3335
val kilde = "bruker"
3436
val inaktivertTidspunkt = DateTimeHelper.nowAtUtcZ().minusHours(1)
3537

36-
testRapid.sendTestMessage(VarselTestData.varselAktivertMessage(varselId = eventId))
37-
testRapid.sendTestMessage(VarselTestData.varselInaktivertMessage(varselId = eventId, kilde = kilde, tidspunkt = inaktivertTidspunkt))
38+
testRapid.sendTestMessage(VarselTestData.varselAktivertMessage(varselId = eventId).addBeredskapMetadata("oups"))
39+
testRapid.sendTestMessage(
40+
VarselTestData.varselInaktivertMessage(
41+
varselId = eventId,
42+
kilde = kilde,
43+
tidspunkt = inaktivertTidspunkt
44+
)
45+
)
3846

3947
val varsel = database.getVarsel(eventId)!!
4048

4149
varsel.aktiv shouldBe false
4250
varsel.inaktivertTidspunkt shouldBe inaktivertTidspunkt.toLocalDateTime()
4351
varsel.inaktivertKilde shouldBe kilde
52+
varsel.beredskapstittel shouldBe "oups"
53+
varsel.beredskapsRef shouldBe "123"
4454
}
4555
}

src/test/kotlin/no/nav/tms/statistikk/varsel/VarselTestData.kt

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ object VarselTestData {
2222
sensitivitet: Sensitivitet = Sensitivitet.Substantial,
2323
sistOppdatert: ZonedDateTime = nowAtUtcZ(),
2424
aktivFremTil: ZonedDateTime? = nowAtUtcZ().plusWeeks(2),
25-
)
26-
= """
25+
) = """
2726
{
2827
"@event_name": "opprettet",
2928
"ident": "$ident",
3029
"type": "${type.name}",
31-
${if (eksternVarsling) {
32-
""""eksternVarslingBestilling": { "prefererteKanaler": [] },"""
33-
} else {
34-
""
35-
}
36-
}
30+
${
31+
if (eksternVarsling) {
32+
""""eksternVarslingBestilling": { "prefererteKanaler": [] },"""
33+
} else {
34+
""
35+
}
36+
}
3737
"opprettet": "$opprettet",
3838
"varselId": "$varselId",
3939
"produsent": {
@@ -62,6 +62,18 @@ object VarselTestData {
6262
}
6363
"""
6464

65+
internal fun String.addBeredskapMetadata(beredskapTittel: String, beredskapRef:String = "123") =
66+
this.substring(0, lastIndexOf("}")).let {
67+
"""$it,
68+
"metadata": {
69+
"beredskap_tittel": "$beredskapTittel",
70+
"beredskap_ref": "$beredskapRef"
71+
}
72+
}
73+
""".trimMargin()
74+
}
75+
76+
6577
fun varselInaktivertMessage(
6678
type: VarselType = beskjed,
6779
varselId: String = UUID.randomUUID().toString(),
@@ -70,8 +82,7 @@ object VarselTestData {
7082
appnavn: String = "appnavn",
7183
kilde: String = "produsent",
7284
tidspunkt: ZonedDateTime = nowAtUtcZ()
73-
)
74-
= """
85+
) = """
7586
{
7687
"@event_name": "inaktivert",
7788
"varselId": "$varselId",
@@ -94,8 +105,7 @@ object VarselTestData {
94105
namespace: String = "namespace",
95106
appnavn: String = "appnavn",
96107
tidspunkt: ZonedDateTime = nowAtUtcZ()
97-
)
98-
= """
108+
) = """
99109
{
100110
"@event_name": "eksternStatusOppdatert",
101111
"status": "sendt",

0 commit comments

Comments
 (0)