Skip to content

Commit

Permalink
Merge pull request #339 from navikt/unique_mottak
Browse files Browse the repository at this point in the history
Unique oversendelse
  • Loading branch information
flexable777 authored Jul 1, 2021
2 parents 20f3355 + 32611a9 commit 70d022d
Show file tree
Hide file tree
Showing 10 changed files with 133 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import java.time.LocalDate
import java.util.*

@Profile("dev-gcp")
@RestController
Expand Down Expand Up @@ -60,7 +61,7 @@ class MockDataController(
fagsystem = KildeFagsystem.AO01
)
},
kildeReferanse = "REF_$fnr",
kildeReferanse = UUID.randomUUID().toString(),
innsynUrl = "https://nav.no",
hjemler = listOf(
listOf(
Expand Down Expand Up @@ -106,7 +107,7 @@ class MockDataController(
fagsystem = KildeFagsystem.AO01
)
},
kildeReferanse = "REF_$fnr",
kildeReferanse = UUID.randomUUID().toString(),
innsynUrl = "https://nav.no",
hjemler = listOf(
listOf(
Expand Down Expand Up @@ -152,7 +153,7 @@ class MockDataController(
fagsystem = KildeFagsystem.AO01
)
},
kildeReferanse = "REF_$fnr",
kildeReferanse = UUID.randomUUID().toString(),
innsynUrl = "https://nav.no",
hjemler = listOf(
listOf(
Expand Down Expand Up @@ -202,7 +203,7 @@ class MockDataController(
fagsystem = KildeFagsystem.AO01
)
},
kildeReferanse = "REF_$fnr",
kildeReferanse = UUID.randomUUID().toString(),
innsynUrl = "https://nav.no",
hjemler = listOf(
listOf(
Expand Down
10 changes: 5 additions & 5 deletions src/main/kotlin/no/nav/klage/oppgave/api/view/OversendtKlage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ data class OversendtKlage(
)
val fagsak: OversendtSak? = null,
@ApiModelProperty(
notes = "Id som er intern for kildesystemet så vedtak fra oss knyttes riktig i kilde",
notes = "Id som er intern for kildesystemet (f.eks. K9) så vedtak fra oss knyttes riktig i kilde",
required = true
)
val kildeReferanse: String,
Expand All @@ -52,19 +52,19 @@ data class OversendtKlage(
required = false,
example = "https://k9-sak.adeo.no/behandling/12345678"
)
val innsynUrl: String?,
val innsynUrl: String? = null,
@ApiModelProperty(
notes = "Hjemler knyttet til klagen",
required = false
)
val hjemler: List<HjemmelFraFoersteInstans>?,
val hjemler: List<HjemmelFraFoersteInstans>? = emptyList(),
val avsenderSaksbehandlerIdent: String,
val avsenderEnhet: String,
@ApiModelProperty(
notes = "Liste med relevante journalposter til klagen. Liste kan være tom.",
required = true
)
val tilknyttedeJournalposter: List<OversendtDokumentReferanse>,
val tilknyttedeJournalposter: List<OversendtDokumentReferanse> = emptyList(),
@field:PastOrPresent(message = "Dato for mottatt førsteinstans må være i fortiden eller i dag")
@field:DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
val mottattFoersteinstans: LocalDate,
Expand Down Expand Up @@ -114,7 +114,7 @@ data class OversendtKlage(
)
}

private fun KildeFagsystem.mapFagsystem(): Fagsystem =
fun KildeFagsystem.mapFagsystem(): Fagsystem =
when (this) {
KildeFagsystem.AO01 -> Fagsystem.AO01
KildeFagsystem.FS36 -> Fagsystem.FS36
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ import io.micrometer.core.instrument.MeterRegistry
import io.micrometer.core.instrument.config.MeterFilter
import io.micrometer.influx.InfluxMeterRegistry
import io.micrometer.prometheus.PrometheusMeterRegistry
import no.nav.klage.oppgave.domain.kodeverk.Fagsystem
import no.nav.klage.oppgave.domain.kodeverk.Tema
import no.nav.klage.oppgave.util.getLogger
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer
import org.springframework.context.annotation.Bean
Expand Down Expand Up @@ -40,6 +38,6 @@ class MetricsConfiguration {
}
}

fun MeterRegistry.incrementMottattKlage(kildesystem: Fagsystem, tema: Tema) {
counter(MetricsConfiguration.MOTTATT_KLAGE, "kildesystem", kildesystem.navn, "tema", tema.navn).increment()
fun MeterRegistry.incrementMottattKlage(kildesystem: String, tema: String) {
counter(MetricsConfiguration.MOTTATT_KLAGE, "kildesystem", kildesystem, "tema", tema).increment()
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ interface OurOwnExceptionAdviceTrait : AdviceTrait {
): ResponseEntity<Problem> =
create(ex, createProblem(ex), request)

@ExceptionHandler
fun handleDuplicateOversendelse(ex: DuplicateOversendelseException, request: NativeWebRequest): ResponseEntity<Problem> =
create(Status.CONFLICT, ex, request)

private fun createProblem(ex: WebClientResponseException): ThrowableProblem {
return Problem.builder()
.withStatus(mapStatus(ex.statusCode))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package no.nav.klage.oppgave.exceptions

class DuplicateOversendelseException(msg: String) : RuntimeException(msg)

class OppgaveNotFoundException(msg: String) : RuntimeException(msg)

class JournalpostNotFoundException(msg: String) : ValidationException(msg)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package no.nav.klage.oppgave.repositories

import no.nav.klage.oppgave.domain.klage.Mottak
import no.nav.klage.oppgave.domain.kodeverk.Fagsystem
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
import java.util.*

@Repository
interface MottakRepository : JpaRepository<Mottak, UUID>
interface MottakRepository : JpaRepository<Mottak, UUID> {

fun existsByKildesystemAndKildeReferanse(kildesystem: Fagsystem, kildeReferanse: String): Boolean

}
21 changes: 20 additions & 1 deletion src/main/kotlin/no/nav/klage/oppgave/service/MottakService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ import no.nav.klage.oppgave.domain.klage.Klager
import no.nav.klage.oppgave.domain.klage.Mottak
import no.nav.klage.oppgave.domain.klage.PartId
import no.nav.klage.oppgave.domain.kodeverk.*
import no.nav.klage.oppgave.exceptions.DuplicateOversendelseException
import no.nav.klage.oppgave.exceptions.JournalpostNotFoundException
import no.nav.klage.oppgave.exceptions.OversendtKlageNotValidException
import no.nav.klage.oppgave.repositories.EnhetRepository
import no.nav.klage.oppgave.repositories.MottakRepository
import no.nav.klage.oppgave.util.getLogger
import no.nav.klage.oppgave.util.getSecureLogger
import no.nav.klage.oppgave.util.isValidFnrOrDnr
import org.springframework.context.ApplicationEventPublisher
import org.springframework.core.env.Environment
Expand All @@ -40,15 +42,22 @@ class MottakService(
companion object {
@Suppress("JAVA_CLASS_ON_COMPANION")
private val logger = getLogger(javaClass.enclosingClass)
private val secureLogger = getSecureLogger()
}

@Transactional
fun createMottakForKlage(oversendtKlage: OversendtKlage) {
oversendtKlage.validate()

val mottak = mottakRepository.save(oversendtKlage.toMottak())

secureLogger.debug("Har lagret mottak basert på oversendtKlage {}", oversendtKlage)
logger.debug("Har lagret mottak {}, publiserer nå event", mottak.id)

applicationEventPublisher.publishEvent(MottakLagretEvent(mottak))
meterRegistry.incrementMottattKlage(mottak.kildesystem, mottak.tema)

//TODO: Move to outside of transaction to make sure it went well
meterRegistry.incrementMottattKlage(oversendtKlage.kilde.name, oversendtKlage.tema.navn)
}

fun createMottakFromKvalitetsvurdering(kvalitetsvurdering: KvalitetsvurderingManuellInput): UUID {
Expand All @@ -74,6 +83,7 @@ class MottakService(
}

fun OversendtKlage.validate() {
validateDuplicate(kilde, kildeReferanse)
tilknyttedeJournalposter.forEach { validateJournalpost(it.journalpostId) }
validatePartId(klager.id)
sakenGjelder?.run { validatePartId(sakenGjelder.id) }
Expand All @@ -83,6 +93,15 @@ class MottakService(
validateSaksbehandler(avsenderSaksbehandlerIdent, avsenderEnhet)
}

private fun validateDuplicate(kildeFagsystem: KildeFagsystem, kildeReferanse: String) {
if (mottakRepository.existsByKildesystemAndKildeReferanse(kildeFagsystem.mapFagsystem(), kildeReferanse)) {
val message =
"Kunne ikke lagre oversendelse grunnet duplikat: kilde ${kildeFagsystem.name} og kildereferanse: $kildeReferanse"
logger.warn(message)
throw DuplicateOversendelseException(message)
}
}

private fun validateType(type: Type) {
if (!lovligeTyperIKabal.contains(type)) {
throw OversendtKlageNotValidException("Kabal kan ikke motta klager med type $type ennå")
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/db/migration/V6__unique_mottak.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE klage.mottak
ADD CONSTRAINT unique_mottak UNIQUE (kildesystem, kilde_referanse);
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package no.nav.klage.oppgave.service

import com.ninjasquad.springmockk.MockkBean
import io.micrometer.core.instrument.MeterRegistry
import io.mockk.every
import no.nav.klage.oppgave.api.view.*
import no.nav.klage.oppgave.clients.norg2.Norg2Client
import no.nav.klage.oppgave.db.TestPostgresqlContainer
import no.nav.klage.oppgave.domain.kodeverk.Tema
import no.nav.klage.oppgave.domain.kodeverk.Type
import no.nav.klage.oppgave.exceptions.DuplicateOversendelseException
import no.nav.klage.oppgave.repositories.EnhetRepository
import org.junit.jupiter.api.MethodOrderer
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestMethodOrder
import org.junit.jupiter.api.assertThrows
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.autoconfigure.domain.EntityScan
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase
import org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureDataJpa
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.data.jpa.repository.config.EnableJpaRepositories
import org.springframework.test.context.ActiveProfiles
import org.testcontainers.junit.jupiter.Container
import org.testcontainers.junit.jupiter.Testcontainers
import java.time.LocalDate


@ActiveProfiles("local")
@SpringBootTest(classes = [MottakService::class])
@EnableJpaRepositories(basePackages = ["no.nav.klage.oppgave.repositories"])
@EntityScan("no.nav.klage.oppgave.domain")
@AutoConfigureDataJpa
@Testcontainers
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@TestMethodOrder(MethodOrderer.OrderAnnotation::class)
internal class DuplicateOversendelseTest {

companion object {
@Container
@JvmField
val postgreSQLContainer: TestPostgresqlContainer = TestPostgresqlContainer.instance
}

@MockkBean(relaxed = true)
lateinit var dokumentService: DokumentService

@MockkBean(relaxed = true)
lateinit var norg2Client: Norg2Client

@MockkBean(relaxed = true)
lateinit var enhetRepository: EnhetRepository

@MockkBean(relaxed = true)
lateinit var meterReqistry: MeterRegistry

@Autowired
lateinit var mottakService: MottakService

@Test
fun `duplicate oversendelse throws exception`() {
val saksbehandler = "Z123456"
every { enhetRepository.getAnsatteIEnhet(any()) } returns listOf(saksbehandler)

val oversendtKlage = OversendtKlage(
avsenderEnhet = "4455",
avsenderSaksbehandlerIdent = saksbehandler,
innsendtTilNav = LocalDate.now(),
mottattFoersteinstans = LocalDate.now(),
tema = Tema.OMS,
type = Type.KLAGE,
klager = OversendtKlager(
id = OversendtPartId(
type = OversendtPartIdType.PERSON,
verdi = "01043137677"
)
),
kilde = KildeFagsystem.K9,
kildeReferanse = "abc"
)

mottakService.createMottakForKlage(oversendtKlage)

assertThrows<DuplicateOversendelseException> { mottakService.createMottakForKlage(oversendtKlage) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ internal class KlagebehandlingDistribusjonServiceTest {
tema = Tema.OMS,
type = Type.KLAGE,
kildesystem = Fagsystem.K9,
kildeReferanse = "1234234",
kildeReferanse = UUID.randomUUID().toString(),
klager = Klager(partId = PartId(type = PartIdType.PERSON, value = fnr)),
oversendtKaDato = LocalDateTime.now()
)
Expand Down

0 comments on commit 70d022d

Please sign in to comment.