Skip to content

Commit 8df06f1

Browse files
committed
MeldekortV2 meldegrupper
1 parent 848fa78 commit 8df06f1

File tree

7 files changed

+204
-15
lines changed

7 files changed

+204
-15
lines changed

src/main/kotlin/no/nav/meldeplikt/meldekortservice/api/MeldekortV2.kt

+27
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import io.ktor.server.application.*
55
import io.ktor.server.locations.*
66
import io.ktor.server.routing.*
77
import no.nav.meldeplikt.meldekortservice.model.feil.NoContentException
8+
import no.nav.meldeplikt.meldekortservice.model.meldegruppe.MeldegruppeResponse
89
import no.nav.meldeplikt.meldekortservice.model.meldekort.Person
910
import no.nav.meldeplikt.meldekortservice.model.meldekortdetaljer.Meldekortdetaljer
1011
import no.nav.meldeplikt.meldekortservice.service.ArenaOrdsService
1112
import no.nav.meldeplikt.meldekortservice.utils.*
1213
import no.nav.meldeplikt.meldekortservice.utils.swagger.*
14+
import java.time.LocalDate
1315

1416
/**
1517
* REST-controller som henter FNR fra ident-header og tilbyr operasjoner for å hente:
@@ -27,6 +29,7 @@ fun Routing.meldekortApiV2(arenaOrdsService: ArenaOrdsService) {
2729
hentHistoriskeMeldekort(arenaOrdsService)
2830
hentMeldekortdetaljer(arenaOrdsService)
2931
hentKorrigertMeldekort(arenaOrdsService)
32+
hentMeldegrupper(arenaOrdsService)
3033
}
3134

3235
private const val group = "Meldekort v2"
@@ -146,6 +149,30 @@ fun Routing.hentKorrigertMeldekort(arenaOrdsService: ArenaOrdsService) =
146149
}
147150
}
148151

152+
@Group(group)
153+
@Location("$API_PATH/v2/meldegrupper")
154+
@KtorExperimentalLocationsAPI
155+
class HentMeldegrupperInput
156+
157+
@KtorExperimentalLocationsAPI
158+
fun Routing.hentMeldegrupper(arenaOrdsService: ArenaOrdsService) = get<HentMeldegrupperInput>(
159+
"Hent meldegrupper".securityAndResponse(
160+
BearerTokenSecurity(),
161+
ok<MeldegruppeResponse>(),
162+
badRequest<ErrorMessage>(),
163+
serviceUnavailable<ErrorMessage>(),
164+
unAuthorized<Error>()
165+
).header<Headers>()
166+
) {
167+
respondOrError {
168+
val ident = getIdent(call)
169+
170+
val result = arenaOrdsService.hentMeldegrupper(ident, LocalDate.now())
171+
println(defaultObjectMapper.writeValueAsString(result))
172+
result
173+
}
174+
}
175+
149176
private fun getIdent(call: ApplicationCall): String {
150177
val ident = call.request.headers["ident"]
151178
if (ident.isNullOrBlank() || ident.length != 11) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package no.nav.meldeplikt.meldekortservice.model.meldegruppe
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
4+
import com.fasterxml.jackson.annotation.JsonInclude
5+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
6+
import com.fasterxml.jackson.databind.annotation.JsonSerialize
7+
import no.nav.meldeplikt.meldekortservice.utils.LocalDateDeserializer
8+
import no.nav.meldeplikt.meldekortservice.utils.LocalDateSerializer
9+
import java.time.LocalDate
10+
11+
@JsonInclude(JsonInclude.Include.NON_NULL)
12+
@JsonIgnoreProperties(ignoreUnknown = true)
13+
data class Meldegruppe(
14+
val fodselsnr: String,
15+
val meldegruppeKode: String,
16+
@JsonSerialize(using = LocalDateSerializer::class)
17+
@JsonDeserialize(using = LocalDateDeserializer::class)
18+
val datoFra: LocalDate,
19+
@JsonSerialize(using = LocalDateSerializer::class)
20+
@JsonDeserialize(using = LocalDateDeserializer::class)
21+
val datoTil: LocalDate? = null,
22+
@JsonSerialize(using = LocalDateSerializer::class)
23+
@JsonDeserialize(using = LocalDateDeserializer::class)
24+
val hendelsesdato: LocalDate,
25+
val statusAktiv: String,
26+
val begrunnelse: String,
27+
val styrendeVedtakId: Long? = null
28+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package no.nav.meldeplikt.meldekortservice.model.meldegruppe
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties
4+
import com.fasterxml.jackson.annotation.JsonInclude
5+
6+
@JsonInclude(JsonInclude.Include.NON_NULL)
7+
@JsonIgnoreProperties(ignoreUnknown = true)
8+
data class MeldegruppeResponse(
9+
val meldegruppeListe: List<Meldegruppe>
10+
)

src/main/kotlin/no/nav/meldeplikt/meldekortservice/service/ArenaOrdsService.kt

+22-1
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@ import no.nav.meldeplikt.meldekortservice.model.AccessToken
1616
import no.nav.meldeplikt.meldekortservice.model.ArenaOrdsSkrivemodus
1717
import no.nav.meldeplikt.meldekortservice.model.feil.OrdsException
1818
import no.nav.meldeplikt.meldekortservice.model.korriger.KopierMeldekortResponse
19+
import no.nav.meldeplikt.meldekortservice.model.meldegruppe.MeldegruppeResponse
1920
import no.nav.meldeplikt.meldekortservice.model.meldekort.Person
2021
import no.nav.meldeplikt.meldekortservice.model.meldekortdetaljer.Meldekortdetaljer
2122
import no.nav.meldeplikt.meldekortservice.model.meldekortdetaljer.arena.Meldekort
2223
import no.nav.meldeplikt.meldekortservice.model.response.OrdsStringResponse
2324
import no.nav.meldeplikt.meldekortservice.utils.*
2425
import java.net.URI
26+
import java.time.LocalDate
2527
import java.time.LocalDateTime
28+
import java.time.format.DateTimeFormatter
2629
import java.util.*
2730

2831
class ArenaOrdsService(
@@ -91,6 +94,16 @@ class ArenaOrdsService(
9194
return 0
9295
}
9396

97+
suspend fun hentMeldegrupper(ident: String, fraDato: LocalDate): MeldegruppeResponse {
98+
val response = getResponseWithRetry(
99+
"${env.ordsUrl}$ARENA_ORDS_HENT_MELDEGRUPPER",
100+
HttpMethod.Get,
101+
setupHeaders(ident = ident, fraDato = fraDato)
102+
)
103+
104+
return defaultObjectMapper.readValue(response.body<String>(), MeldegruppeResponse::class.java)
105+
}
106+
94107
suspend fun hentSkrivemodus(): ArenaOrdsSkrivemodus {
95108
val execResult: Result<HttpResponse> = runCatching {
96109
getResponseWithRetry("${env.ordsUrl}$ARENA_ORDS_HENT_SKRIVEMODUS", HttpMethod.Get, setupHeaders())
@@ -108,7 +121,11 @@ class ArenaOrdsService(
108121
return ArenaOrdsSkrivemodus(content.skrivemodus)
109122
}
110123

111-
private fun setupHeaders(meldekortId: Long? = null, ident: String? = null): StringValuesBuilder {
124+
private fun setupHeaders(
125+
meldekortId: Long? = null,
126+
ident: String? = null,
127+
fraDato: LocalDate? = null
128+
): StringValuesBuilder {
112129
val headers = HeadersBuilder()
113130
headers.append("Accept", "application/xml; charset=UTF-8")
114131
headers.append("Authorization", "Bearer ${hentToken().accessToken}")
@@ -118,6 +135,10 @@ class ArenaOrdsService(
118135
if (ident != null) {
119136
headers.append("fnr", ident)
120137
}
138+
if (ident != null && fraDato != null) {
139+
headers.append("person_id", ident)
140+
headers.append("fraDato", fraDato.format(DateTimeFormatter.ISO_LOCAL_DATE))
141+
}
121142

122143
return headers
123144
}

src/main/kotlin/no/nav/meldeplikt/meldekortservice/utils/Utils.kt

+2
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,14 @@ internal const val SKRIVEMODUS_PATH = "$API_PATH/skrivemodus"
4747
internal const val ARENA_ORDS_API_V1_APP = "/api/v1/app"
4848
internal const val ARENA_ORDS_HENT_SKRIVEMODUS = "$ARENA_ORDS_API_V1_APP/skrivemodus"
4949
internal const val ARENA_ORDS_API_V2_MELDEPLIKT = "/api/v2/meldeplikt"
50+
internal const val ARENA_ORDS_API_V3_MELDEPLIKT = "/api/v3/meldeplikt"
5051
internal const val ARENA_ORDS_TOKEN_PATH = "/api/oauth/token"
5152
internal const val ARENA_ORDS_HENT_MELDEKORT = "$ARENA_ORDS_API_V2_MELDEPLIKT/meldekort"
5253
internal const val ARENA_ORDS_HENT_HISTORISKE_MELDEKORT = "$ARENA_ORDS_API_V2_MELDEPLIKT/meldekort/historiske?"
5354
internal const val ARENA_ORDS_MELDEPERIODER_PARAM = "antMeldeperioder="
5455
internal const val ARENA_ORDS_HENT_MELDEKORTDETALJER = "$ARENA_ORDS_API_V2_MELDEPLIKT/meldekort/detaljer?meldekortId="
5556
internal const val ARENA_ORDS_KOPIER_MELDEKORT = "$ARENA_ORDS_API_V2_MELDEPLIKT/meldekort/kopi"
57+
internal const val ARENA_ORDS_HENT_MELDEGRUPPER = "$ARENA_ORDS_API_V3_MELDEPLIKT/kontroll/meldegruppe"
5658

5759
internal const val DB_ORACLE_USERNAME = "oracleDbUser.username"
5860
internal const val DB_ORACLE_PASSWORD = "oracleDbUser.password"

src/test/kotlin/no/nav/meldeplikt/meldekortservice/api/MeldekortV2KtTest.kt

+68-14
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import io.ktor.server.locations.*
88
import io.mockk.coEvery
99
import no.nav.meldeplikt.meldekortservice.config.DUMMY_FNR
1010
import no.nav.meldeplikt.meldekortservice.model.enum.KortType
11+
import no.nav.meldeplikt.meldekortservice.model.meldegruppe.Meldegruppe
12+
import no.nav.meldeplikt.meldekortservice.model.meldegruppe.MeldegruppeResponse
1113
import no.nav.meldeplikt.meldekortservice.model.meldekort.Meldekort
1214
import no.nav.meldeplikt.meldekortservice.model.meldekort.Person
1315
import no.nav.meldeplikt.meldekortservice.model.meldekortdetaljer.Meldekortdetaljer
@@ -17,15 +19,15 @@ import no.nav.meldeplikt.meldekortservice.utils.defaultXmlMapper
1719
import org.junit.jupiter.api.Test
1820
import java.time.LocalDate
1921
import kotlin.test.assertEquals
20-
import kotlin.test.assertNotNull
2122

2223
@KtorExperimentalLocationsAPI
2324
class MeldekortV2KtTest : TestBase() {
2425

2526
private val hentMeldekortUrl = "/meldekortservice/api/v2/meldekort"
2627
private val hentHistoriskeMeldekortUrl = "/meldekortservice/api/v2/historiskemeldekort?antallMeldeperioder=1"
27-
private val hentMeldekortdetaljer = "/meldekortservice/api/v2/meldekortdetaljer?meldekortId=123456789"
28-
private val hentKorrigertMeldekort = "/meldekortservice/api/v2/korrigertMeldekort?meldekortId=123456789"
28+
private val hentMeldekortdetaljerUrl = "/meldekortservice/api/v2/meldekortdetaljer?meldekortId=123456789"
29+
private val hentKorrigertMeldekortUrl = "/meldekortservice/api/v2/korrigertMeldekort?meldekortId=123456789"
30+
private val hentMeldegrupperUrl = "/meldekortservice/api/v2/meldegrupper"
2931

3032
@Test
3133
fun `hentMeldekort returns Unauthorized status when no token in headers`() = setUpTestApplication {
@@ -93,7 +95,6 @@ class MeldekortV2KtTest : TestBase() {
9395
}
9496

9597
assertEquals(HttpStatusCode.OK, response.status)
96-
assertNotNull(response.bodyAsText())
9798
val responseObject = defaultObjectMapper.readValue<Person>(response.bodyAsText())
9899
assertEquals(person.personId, responseObject.personId)
99100
assertEquals(2, responseObject.meldekortListe?.size)
@@ -142,22 +143,21 @@ class MeldekortV2KtTest : TestBase() {
142143
}
143144

144145
assertEquals(HttpStatusCode.OK, response.status)
145-
assertNotNull(response.bodyAsText())
146146
val responseObject = defaultObjectMapper.readValue<Person>(response.bodyAsText())
147147
assertEquals(person.personId, responseObject.personId)
148148
}
149149

150150
@Test
151151
fun `hentMeldekortdetaljer returns Unauthorized status when no token in headers`() = setUpTestApplication {
152-
val response = client.get(hentMeldekortdetaljer) {
152+
val response = client.get(hentMeldekortdetaljerUrl) {
153153
}
154154

155155
assertEquals(HttpStatusCode.Unauthorized, response.status)
156156
}
157157

158158
@Test
159159
fun `hentMeldekortdetaljer returns BadRequest status when no ident in Headers`() = setUpTestApplication {
160-
val response = client.get(hentMeldekortdetaljer) {
160+
val response = client.get(hentMeldekortdetaljerUrl) {
161161
header(HttpHeaders.Authorization, "Bearer ${issueTokenWithPid()}")
162162
}
163163

@@ -175,28 +175,27 @@ class MeldekortV2KtTest : TestBase() {
175175
coEvery { arenaOrdsService.hentMeldekortdetaljer(any()) } returns (meldekortdetaljer)
176176

177177

178-
val response = client.get(hentMeldekortdetaljer) {
178+
val response = client.get(hentMeldekortdetaljerUrl) {
179179
header(HttpHeaders.Authorization, "Bearer ${issueTokenWithSub()}")
180180
header("ident", DUMMY_FNR)
181181
}
182182

183183
assertEquals(HttpStatusCode.OK, response.status)
184-
assertNotNull(response.bodyAsText())
185184
val responseObject = defaultObjectMapper.readValue<Meldekortdetaljer>(response.bodyAsText())
186185
assertEquals(meldekortdetaljer.id, responseObject.id)
187186
}
188187

189188
@Test
190189
fun `hentKorrigertMeldekort returns Unauthorized status when no token in headers`() = setUpTestApplication {
191-
val response = client.get(hentKorrigertMeldekort) {
190+
val response = client.get(hentKorrigertMeldekortUrl) {
192191
}
193192

194193
assertEquals(HttpStatusCode.Unauthorized, response.status)
195194
}
196195

197196
@Test
198197
fun `hentKorrigertMeldekort returns BadRequest status when no ident in Headers`() = setUpTestApplication {
199-
val response = client.get(hentKorrigertMeldekort) {
198+
val response = client.get(hentKorrigertMeldekortUrl) {
200199
header(HttpHeaders.Authorization, "Bearer ${issueTokenWithPid()}")
201200
}
202201

@@ -213,7 +212,7 @@ class MeldekortV2KtTest : TestBase() {
213212

214213
coEvery { arenaOrdsService.hentMeldekortdetaljer(any()) } returns (meldekortdetaljer)
215214

216-
val response = client.get(hentKorrigertMeldekort) {
215+
val response = client.get(hentKorrigertMeldekortUrl) {
217216
header(HttpHeaders.Authorization, "Bearer ${issueTokenWithPid()}")
218217
header("ident", "21020312345")
219218
}
@@ -233,14 +232,69 @@ class MeldekortV2KtTest : TestBase() {
233232
coEvery { arenaOrdsService.hentMeldekortdetaljer(any()) } returns (meldekortdetaljer)
234233
coEvery { arenaOrdsService.kopierMeldekort(any()) } returns (nyId)
235234

236-
val response = client.get(hentKorrigertMeldekort) {
235+
val response = client.get(hentKorrigertMeldekortUrl) {
237236
header(HttpHeaders.Authorization, "Bearer ${issueTokenWithPid()}")
238237
header("ident", DUMMY_FNR)
239238
}
240239

241240
assertEquals(HttpStatusCode.OK, response.status)
242-
assertNotNull(response.bodyAsText())
243241
val responseObject = defaultObjectMapper.readValue<Long>(response.bodyAsText())
244242
assertEquals(nyId, responseObject)
245243
}
244+
245+
@Test
246+
fun `hentMeldegrupper returns Unauthorized status when no token in headers`() = setUpTestApplication {
247+
val response = client.get(hentMeldegrupperUrl) {
248+
}
249+
250+
assertEquals(HttpStatusCode.Unauthorized, response.status)
251+
}
252+
253+
@Test
254+
fun `hentMeldegrupper returns BadRequest status when no ident in Headers`() = setUpTestApplication {
255+
val response = client.get(hentMeldegrupperUrl) {
256+
header(HttpHeaders.Authorization, "Bearer ${issueTokenWithPid()}")
257+
}
258+
259+
assertEquals(HttpStatusCode.BadRequest, response.status)
260+
}
261+
262+
@Test
263+
fun `hentMeldegrupper returns data when valid token and ident in headers`() = setUpTestApplication {
264+
val meldegruppeResponse = MeldegruppeResponse(
265+
listOf(
266+
Meldegruppe(
267+
DUMMY_FNR,
268+
"ARBS",
269+
LocalDate.now(),
270+
null,
271+
LocalDate.now(),
272+
"J",
273+
"Aktivert med ingen ytelser",
274+
null
275+
),
276+
Meldegruppe(
277+
DUMMY_FNR,
278+
"DAGP",
279+
LocalDate.now(),
280+
LocalDate.now(),
281+
LocalDate.now(),
282+
"J",
283+
"Iverksatt vedtak",
284+
1L
285+
)
286+
)
287+
)
288+
289+
coEvery { arenaOrdsService.hentMeldegrupper(any(), any()) } returns (meldegruppeResponse)
290+
291+
val response = client.get(hentMeldegrupperUrl) {
292+
header(HttpHeaders.Authorization, "Bearer ${issueTokenWithPid()}")
293+
header("ident", DUMMY_FNR)
294+
}
295+
296+
assertEquals(HttpStatusCode.OK, response.status)
297+
val responseObject = defaultObjectMapper.readValue<MeldegruppeResponse>(response.bodyAsText())
298+
assertEquals(meldegruppeResponse, responseObject)
299+
}
246300
}

0 commit comments

Comments
 (0)