From ff919d0c7dd0fbe8ed13e4b90fa8761880c6b6d9 Mon Sep 17 00:00:00 2001 From: andrii <25188+unorsk@users.noreply.github.com> Date: Thu, 14 Sep 2023 13:36:55 +0200 Subject: [PATCH] Retter opp feilen der vi ikke kunne oppdatere opplysninger (#27) * Retter opp feilen der vi ikke kunne oppdatere opplysninger * Retter opp feilen der vi ikke kunne oppdatere opplysninger --- .../database/datamodell/Opplysninger.kt | 6 ++- .../repository/OpplysningerRepository.kt | 4 +- .../dto/opplysninger/OpplysningerDto.kt | 1 - .../behandling/service/OpplysningerService.kt | 27 ++++--------- .../behandling/transformers/DtoExtensions.kt | 2 +- .../V1.0.27__opplysninger_timestamp.sql | 5 +++ .../controller/OpplysningerControllerTest.kt | 29 ++++++++++++-- .../service/OpplysningerServiceTest.kt | 40 +++++++++++++++++++ 8 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 src/main/resources/db/migration/V1.0.27__opplysninger_timestamp.sql diff --git a/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Opplysninger.kt b/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Opplysninger.kt index 02facc692..fd9b14f2f 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Opplysninger.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Opplysninger.kt @@ -1,5 +1,6 @@ package no.nav.bidrag.behandling.database.datamodell +import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.EnumType import jakarta.persistence.Enumerated @@ -18,8 +19,6 @@ class Opplysninger( @JoinColumn(name = "behandling_id", nullable = false) val behandling: Behandling, - var aktiv: Boolean, - @Enumerated(EnumType.STRING) val opplysningerType: OpplysningerType, @@ -27,6 +26,9 @@ class Opplysninger( val hentetDato: Date, + @Column(insertable = false, updatable = false) + val ts: Date? = null, + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, diff --git a/src/main/kotlin/no/nav/bidrag/behandling/database/repository/OpplysningerRepository.kt b/src/main/kotlin/no/nav/bidrag/behandling/database/repository/OpplysningerRepository.kt index ddf51edcd..b09977c53 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/database/repository/OpplysningerRepository.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/database/repository/OpplysningerRepository.kt @@ -2,11 +2,9 @@ package no.nav.bidrag.behandling.database.repository import no.nav.bidrag.behandling.database.datamodell.Opplysninger import no.nav.bidrag.behandling.database.datamodell.OpplysningerType -import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.CrudRepository import java.util.Optional interface OpplysningerRepository : CrudRepository { - @Query("select o from opplysninger o where o.behandling.id = :behandlingId and o.opplysningerType = :opplysningerType and o.aktiv = true") - fun findActiveByBehandlingIdAndType(behandlingId: Long, opplysningerType: OpplysningerType): Optional + fun findTopByBehandlingIdAndOpplysningerTypeOrderByTsDescIdDesc(behandlingId: Long, opplysningerType: OpplysningerType): Optional } diff --git a/src/main/kotlin/no/nav/bidrag/behandling/dto/opplysninger/OpplysningerDto.kt b/src/main/kotlin/no/nav/bidrag/behandling/dto/opplysninger/OpplysningerDto.kt index c29cf78f5..44d644905 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/dto/opplysninger/OpplysningerDto.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/dto/opplysninger/OpplysningerDto.kt @@ -8,7 +8,6 @@ import java.time.LocalDate data class OpplysningerDto( val id: Long, val behandlingId: Long, - val aktiv: Boolean, val opplysningerType: OpplysningerType, val data: String, diff --git a/src/main/kotlin/no/nav/bidrag/behandling/service/OpplysningerService.kt b/src/main/kotlin/no/nav/bidrag/behandling/service/OpplysningerService.kt index 9e67e1048..b6f54db33 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/service/OpplysningerService.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/service/OpplysningerService.kt @@ -6,6 +6,7 @@ import no.nav.bidrag.behandling.database.datamodell.OpplysningerType import no.nav.bidrag.behandling.database.repository.BehandlingRepository import no.nav.bidrag.behandling.database.repository.OpplysningerRepository import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional import java.util.Date import java.util.Optional @@ -15,27 +16,15 @@ class OpplysningerService( private val behandlingRepository: BehandlingRepository, ) { + @Transactional fun opprett(behandlingId: Long, opplysningerType: OpplysningerType, data: String, hentetDato: Date): Opplysninger { - // oppdater eksisterende opplysninger - opplysningerRepository.findActiveByBehandlingIdAndType(behandlingId, opplysningerType).ifPresent { - // update aktiv to false - updateAktivOpplysninger(it, false) - } - - val behandling = behandlingRepository.findBehandlingById(behandlingId).orElseThrow { `404`(behandlingId) } - return opplysningerRepository.save(Opplysninger(behandling, true, opplysningerType, data, hentetDato)) + behandlingRepository + .findBehandlingById(behandlingId).orElseThrow { `404`(behandlingId) } + .let { + return opplysningerRepository.save(Opplysninger(it, opplysningerType, data, hentetDato)) + } } - fun updateAktivOpplysninger(opplysninger: Opplysninger, aktiv: Boolean) = - opplysningerRepository.save( - opplysningerRepository.findById(opplysninger.id!!) - .orElseThrow { `404`(opplysninger.id) } - .let { - it.aktiv = aktiv - it - }, - ) - fun hentSistAktiv(behandlingId: Long, opplysningerType: OpplysningerType): Optional = - opplysningerRepository.findActiveByBehandlingIdAndType(behandlingId, opplysningerType) + opplysningerRepository.findTopByBehandlingIdAndOpplysningerTypeOrderByTsDescIdDesc(behandlingId, opplysningerType) } diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/DtoExtensions.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/DtoExtensions.kt index 406fd8d26..f724f0bf4 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/DtoExtensions.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/DtoExtensions.kt @@ -95,7 +95,7 @@ fun Set.toInntektDto() = this.map { }.toSet() fun Opplysninger.toDto(): OpplysningerDto { - return OpplysningerDto(this.id!!, this.behandling.id!!, this.aktiv, this.opplysningerType, this.data, this.hentetDato.toLocalDate()) + return OpplysningerDto(this.id!!, this.behandling.id!!, this.opplysningerType, this.data, this.hentetDato.toLocalDate()) } fun Behandling.tilForsendelseRolleDto() = roller.map { diff --git a/src/main/resources/db/migration/V1.0.27__opplysninger_timestamp.sql b/src/main/resources/db/migration/V1.0.27__opplysninger_timestamp.sql new file mode 100644 index 000000000..a558d5287 --- /dev/null +++ b/src/main/resources/db/migration/V1.0.27__opplysninger_timestamp.sql @@ -0,0 +1,5 @@ +ALTER TABLE OPPLYSNINGER + ADD COLUMN IF NOT EXISTS ts timestamp DEFAULT now() NOT NULL; + +ALTER TABLE OPPLYSNINGER + DROP COLUMN AKTIV; \ No newline at end of file diff --git a/src/test/kotlin/no/nav/bidrag/behandling/controller/OpplysningerControllerTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/controller/OpplysningerControllerTest.kt index 50fe4b90a..2d6dcb385 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/controller/OpplysningerControllerTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/controller/OpplysningerControllerTest.kt @@ -45,7 +45,31 @@ class OpplysningerControllerTest : KontrollerTestRunner() { Assertions.assertEquals(HttpStatus.OK, oppAktivResult1.statusCode) Assertions.assertEquals(behandlingId, oppAktivResult1.body!!.behandlingId) Assertions.assertEquals("opp1", oppAktivResult1.body!!.data) - Assertions.assertTrue(oppAktivResult1.body!!.aktiv) + } + + @Test + fun `skal ikke være mulig å opprette flere aktive opplysninger`() { + val roller = setOf( + CreateRolleDtoTest(CreateRolleRolleType.BARN, "123", Date(1)), + CreateRolleDtoTest(CreateRolleRolleType.BIDRAGS_MOTTAKER, "123", Date(1)), + ) + val testBehandlingMedNull = BehandlingControllerTest.createBehandlingRequestTest("sak123", "en12", roller) + + // 1. Create new behandling + val behandling = httpHeaderTestRestTemplate.exchange("${rootUri()}/behandling", HttpMethod.POST, HttpEntity(testBehandlingMedNull), CreateBehandlingResponse::class.java) + Assertions.assertEquals(HttpStatus.OK, behandling.statusCode) + + val behandlingId = behandling.body!!.id + + // 2. Create new opplysninger opp and opp1 + skalOppretteOpplysninger(behandlingId, "opp", true, OpplysningerType.BOFORHOLD) + skalOppretteOpplysninger(behandlingId, "opp1", true, OpplysningerType.BOFORHOLD) + + // 3. Assert that opp1 is active + val oppAktivResult1 = httpHeaderTestRestTemplate.exchange("${rootUri()}/behandling/$behandlingId/opplysninger/BOFORHOLD/aktiv", HttpMethod.GET, HttpEntity.EMPTY, OpplysningerDto::class.java) + Assertions.assertEquals(HttpStatus.OK, oppAktivResult1.statusCode) + Assertions.assertEquals(behandlingId, oppAktivResult1.body!!.behandlingId) + Assertions.assertEquals("opp1", oppAktivResult1.body!!.data) } @Test @@ -103,14 +127,12 @@ class OpplysningerControllerTest : KontrollerTestRunner() { Assertions.assertEquals(HttpStatus.OK, oppAktivResult1.statusCode) Assertions.assertEquals(behandlingId, oppAktivResult1.body!!.behandlingId) Assertions.assertEquals("opp1", oppAktivResult1.body!!.data) - Assertions.assertTrue(oppAktivResult1.body!!.aktiv) // 4. Assert that inn1 is active val oppAktivResult2 = httpHeaderTestRestTemplate.exchange("${rootUri()}/behandling/$behandlingId/opplysninger/${OpplysningerType.INNTEKTSOPPLYSNINGER.name}/aktiv", HttpMethod.GET, HttpEntity.EMPTY, OpplysningerDto::class.java) Assertions.assertEquals(HttpStatus.OK, oppAktivResult2.statusCode) Assertions.assertEquals(behandlingId, oppAktivResult2.body!!.behandlingId) Assertions.assertEquals("inn1", oppAktivResult2.body!!.data) - Assertions.assertTrue(oppAktivResult2.body!!.aktiv) } private fun skalOppretteOpplysninger( @@ -131,7 +153,6 @@ class OpplysningerControllerTest : KontrollerTestRunner() { Assertions.assertEquals(HttpStatus.OK, opp.statusCode) val body = opp.body!! Assertions.assertEquals(behandlingId, body.behandlingId) - Assertions.assertEquals(true, body.aktiv) return body } diff --git a/src/test/kotlin/no/nav/bidrag/behandling/service/OpplysningerServiceTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/service/OpplysningerServiceTest.kt index 4f072966c..a3ee86d76 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/service/OpplysningerServiceTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/service/OpplysningerServiceTest.kt @@ -1,18 +1,58 @@ package no.nav.bidrag.behandling.service import no.nav.bidrag.behandling.TestContainerRunner +import no.nav.bidrag.behandling.database.datamodell.Behandling +import no.nav.bidrag.behandling.database.datamodell.BehandlingType import no.nav.bidrag.behandling.database.datamodell.OpplysningerType +import no.nav.bidrag.behandling.database.datamodell.SoknadFraType +import no.nav.bidrag.behandling.database.datamodell.SoknadType +import no.nav.bidrag.domain.enums.EngangsbelopType import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired +import java.util.Date +import kotlin.test.assertEquals +import kotlin.test.assertTrue class OpplysningerServiceTest : TestContainerRunner() { @Autowired lateinit var opplysningerService: OpplysningerService + @Autowired + lateinit var behandlingService: BehandlingService + @Test fun `hente opplysninger`() { val res = opplysningerService.hentSistAktiv(1, OpplysningerType.BOFORHOLD) assertFalse(res.isPresent) } + + @Test + fun `skal være bare en rad med aktive opplysninger`() { + val b = behandlingService.createBehandling( + Behandling( + BehandlingType.FORSKUDD, + SoknadType.FASTSETTELSE, + Date(1), + Date(2), + Date(2), + "123", + 123L, + null, + "ENH1", + SoknadFraType.VERGE, + engangsbelopType = EngangsbelopType.ETTERGIVELSE, + stonadType = null, + ), + ) + val opp1 = opplysningerService.opprett(b.id!!, OpplysningerType.BOFORHOLD, "data", Date(1)) + val opp2 = opplysningerService.opprett(b.id!!, OpplysningerType.BOFORHOLD, "data", Date(1)) + val opp4 = opplysningerService.opprett(b.id!!, OpplysningerType.BOFORHOLD, "data", Date(1)) + val opp3 = opplysningerService.opprett(b.id!!, OpplysningerType.INNTEKTSOPPLYSNINGER, "data", Date(1)) + + val option = opplysningerService.hentSistAktiv(b.id!!, OpplysningerType.BOFORHOLD) + + assertTrue(option.isPresent) + assertEquals(opp4.id, option.get().id) + } }