Skip to content

Commit

Permalink
♻️ GenerasjonDao er query runner
Browse files Browse the repository at this point in the history
  • Loading branch information
chsko committed Oct 28, 2024
1 parent 4e55a49 commit 64ff2d5
Show file tree
Hide file tree
Showing 5 changed files with 128 additions and 210 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import no.nav.helse.db.MeldingRepository
import no.nav.helse.db.OverstyringRepository
import no.nav.helse.db.PersonRepository
import no.nav.helse.db.RisikovurderingRepository
import no.nav.helse.db.TransactionalGenerasjonDao
import no.nav.helse.db.TransactionalMeldingDao
import no.nav.helse.db.TransactionalVedtakDao
import no.nav.helse.db.TransactionalVergemålDao
Expand All @@ -30,6 +29,7 @@ import no.nav.helse.modell.stoppautomatiskbehandling.StansAutomatiskBehandlingMe
import no.nav.helse.modell.sykefraværstilfelle.Sykefraværstilfelle
import no.nav.helse.modell.utbetaling.Refusjonstype
import no.nav.helse.modell.utbetaling.Utbetaling
import no.nav.helse.modell.vedtaksperiode.GenerasjonDao
import no.nav.helse.modell.vedtaksperiode.Inntektskilde
import no.nav.helse.modell.vedtaksperiode.Periodetype
import no.nav.helse.modell.vedtaksperiode.Periodetype.FORLENGELSE
Expand Down Expand Up @@ -75,7 +75,7 @@ internal class Automatisering(
overstyringRepository = OverstyringDao(transactionalSession),
stikkprøver = stikkprøver,
meldingRepository = TransactionalMeldingDao(transactionalSession),
generasjonRepository = TransactionalGenerasjonDao(transactionalSession),
generasjonRepository = GenerasjonDao(transactionalSession),
egenAnsattRepository = EgenAnsattDao(transactionalSession),
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,34 @@
package no.nav.helse.modell.vedtaksperiode

import kotliquery.TransactionalSession
import kotliquery.queryOf
import kotliquery.sessionOf
import kotliquery.Session
import no.nav.helse.HelseDao.Companion.asSQL
import no.nav.helse.HelseDao.Companion.asSQLWithQuestionMarks
import no.nav.helse.db.AvslagDao
import no.nav.helse.db.GenerasjonRepository
import no.nav.helse.db.TransactionalGenerasjonDao
import no.nav.helse.db.MedDataSource
import no.nav.helse.db.MedSession
import no.nav.helse.db.QueryRunner
import no.nav.helse.modell.person.vedtaksperiode.VarselDto
import no.nav.helse.modell.person.vedtaksperiode.VarselStatusDto
import org.intellij.lang.annotations.Language
import java.time.LocalDate
import java.time.LocalDateTime
import java.util.UUID
import javax.sql.DataSource

class GenerasjonDao(private val dataSource: DataSource) : GenerasjonRepository {
internal fun TransactionalSession.finnGenerasjoner(vedtaksperiodeId: UUID): List<GenerasjonDto> {
@Language("PostgreSQL")
val query = """
class GenerasjonDao private constructor(private val queryRunner: QueryRunner) : GenerasjonRepository, QueryRunner by queryRunner {
constructor(dataSource: DataSource) : this(MedDataSource(dataSource))
constructor(session: Session) : this(MedSession(session))

internal fun finnGenerasjoner(vedtaksperiodeId: UUID): List<GenerasjonDto> {
return asSQL(
"""
SELECT id, unik_id, vedtaksperiode_id, utbetaling_id, spleis_behandling_id, skjæringstidspunkt, fom, tom, tilstand, tags
FROM selve_vedtaksperiode_generasjon
WHERE vedtaksperiode_id = :vedtaksperiode_id ORDER BY id;
"""
return run(
queryOf(
query,
mapOf("vedtaksperiode_id" to vedtaksperiodeId),
).map { row ->
""",
"vedtaksperiode_id" to vedtaksperiodeId,
)
.list { row ->
val generasjonRef = row.long("id")
GenerasjonDto(
id = row.uuid("unik_id"),
Expand All @@ -39,80 +41,63 @@ class GenerasjonDao(private val dataSource: DataSource) : GenerasjonRepository {
tilstand = enumValueOf(row.string("tilstand")),
tags = row.array<String>("tags").toList(),
varsler = finnVarsler(generasjonRef),
avslag = AvslagDao(this).finnAvslag(vedtaksperiodeId, generasjonRef),
avslag = AvslagDao(queryRunner).finnAvslag(vedtaksperiodeId, generasjonRef),
)
}.asList,
)
}
}

internal fun TransactionalSession.lagreGenerasjon(generasjonDto: GenerasjonDto) {
this.lagre(generasjonDto)
this.slettVarsler(generasjonDto.id, generasjonDto.varsler.map { it.id })
internal fun lagreGenerasjon(generasjonDto: GenerasjonDto) {
lagre(generasjonDto)
slettVarsler(generasjonDto.id, generasjonDto.varsler.map { it.id })
generasjonDto.varsler.forEach { varselDto ->
this.lagre(varselDto, generasjonDto.vedtaksperiodeId, generasjonDto.id)
lagre(varselDto, generasjonDto.vedtaksperiodeId, generasjonDto.id)
}
}

private fun TransactionalSession.lagre(generasjonDto: GenerasjonDto) {
@Language("PostgreSQL")
val query =
private fun lagre(generasjonDto: GenerasjonDto) {
asSQL(
"""
INSERT INTO selve_vedtaksperiode_generasjon (unik_id, vedtaksperiode_id, utbetaling_id, spleis_behandling_id, opprettet_tidspunkt, opprettet_av_hendelse, tilstand_endret_tidspunkt, tilstand_endret_av_hendelse, fom, tom, skjæringstidspunkt, tilstand, tags)
VALUES (:unik_id, :vedtaksperiode_id, :utbetaling_id, :spleis_behandling_id, now(), gen_random_uuid(), now(), gen_random_uuid(), :fom, :tom, :skjaeringstidspunkt, :tilstand::generasjon_tilstand, :tags::varchar[])
ON CONFLICT (unik_id) DO UPDATE SET utbetaling_id = excluded.utbetaling_id, spleis_behandling_id = excluded.spleis_behandling_id, fom = excluded.fom, tom = excluded.tom, skjæringstidspunkt = excluded.skjæringstidspunkt, tilstand = excluded.tilstand, tags = excluded.tags
""".trimIndent()
this.run(
queryOf(
query,
mapOf(
"unik_id" to generasjonDto.id,
"vedtaksperiode_id" to generasjonDto.vedtaksperiodeId,
"utbetaling_id" to generasjonDto.utbetalingId,
"spleis_behandling_id" to generasjonDto.spleisBehandlingId,
"fom" to generasjonDto.fom,
"tom" to generasjonDto.tom,
"skjaeringstidspunkt" to generasjonDto.skjæringstidspunkt,
"tilstand" to generasjonDto.tilstand.name,
"tags" to generasjonDto.tags.joinToString(prefix = "{", postfix = "}"),
),
).asUpdate,
)
""",
"unik_id" to generasjonDto.id,
"vedtaksperiode_id" to generasjonDto.vedtaksperiodeId,
"utbetaling_id" to generasjonDto.utbetalingId,
"spleis_behandling_id" to generasjonDto.spleisBehandlingId,
"fom" to generasjonDto.fom,
"tom" to generasjonDto.tom,
"skjaeringstidspunkt" to generasjonDto.skjæringstidspunkt,
"tilstand" to generasjonDto.tilstand.name,
"tags" to generasjonDto.tags.joinToString(prefix = "{", postfix = "}"),
).update()
}

private fun TransactionalSession.lagre(
private fun lagre(
varselDto: VarselDto,
vedtaksperiodeId: UUID,
generasjonId: UUID,
) {
@Language("PostgreSQL")
val query =
asSQL(
"""
INSERT INTO selve_varsel (unik_id, kode, vedtaksperiode_id, generasjon_ref, definisjon_ref, opprettet, status_endret_ident, status_endret_tidspunkt, status)
VALUES (:unik_id, :kode, :vedtaksperiode_id, (SELECT id FROM selve_vedtaksperiode_generasjon WHERE unik_id = :generasjon_id), null, :opprettet, null, null, :status)
ON CONFLICT (generasjon_ref, kode) DO UPDATE SET status = excluded.status, generasjon_ref = excluded.generasjon_ref
""".trimIndent()

this.run(
queryOf(
query,
mapOf(
"unik_id" to varselDto.id,
"kode" to varselDto.varselkode,
"vedtaksperiode_id" to vedtaksperiodeId,
"generasjon_id" to generasjonId,
"opprettet" to varselDto.opprettet,
"status" to varselDto.status.name,
),
).asUpdate,
)
""",
"unik_id" to varselDto.id,
"kode" to varselDto.varselkode,
"vedtaksperiode_id" to vedtaksperiodeId,
"generasjon_id" to generasjonId,
"opprettet" to varselDto.opprettet,
"status" to varselDto.status.name,
).update()
}

private fun TransactionalSession.slettVarsler(
private fun slettVarsler(
generasjonId: UUID,
varselIder: List<UUID>,
) {
@Language("PostgreSQL")
val query =
asSQLWithQuestionMarks(
if (varselIder.isEmpty()) {
"""
DELETE FROM selve_varsel WHERE generasjon_ref = (SELECT id FROM selve_vedtaksperiode_generasjon svg WHERE svg.unik_id = ? LIMIT 1)
Expand All @@ -123,14 +108,14 @@ class GenerasjonDao(private val dataSource: DataSource) : GenerasjonRepository {
WHERE generasjon_ref = (SELECT id FROM selve_vedtaksperiode_generasjon svg WHERE svg.unik_id = ? LIMIT 1)
AND selve_varsel.unik_id NOT IN (${varselIder.joinToString { "?" }})
""".trimIndent()
}

this.run(queryOf(query, generasjonId, *varselIder.toTypedArray()).asExecute)
},
generasjonId,
*varselIder.toTypedArray(),
).update()
}

private fun TransactionalSession.finnVarsler(generasjonRef: Long): List<VarselDto> {
@Language("PostgreSQL")
val query =
private fun finnVarsler(generasjonRef: Long): List<VarselDto> {
return asSQL(
"""
SELECT
unik_id,
Expand All @@ -139,65 +124,68 @@ class GenerasjonDao(private val dataSource: DataSource) : GenerasjonRepository {
opprettet,
status
FROM selve_varsel sv WHERE generasjon_ref = :generasjon_ref
""".trimIndent()
return this.run(
queryOf(
query,
mapOf("generasjon_ref" to generasjonRef),
).map { row ->
VarselDto(
row.uuid("unik_id"),
row.string("kode"),
row.localDateTime("opprettet"),
row.uuid("vedtaksperiode_id"),
when (val status = row.string("status")) {
"AKTIV" -> VarselStatusDto.AKTIV
"INAKTIV" -> VarselStatusDto.INAKTIV
"GODKJENT" -> VarselStatusDto.GODKJENT
"VURDERT" -> VarselStatusDto.VURDERT
"AVVIST" -> VarselStatusDto.AVVIST
"AVVIKLET" -> VarselStatusDto.AVVIKLET
else -> throw IllegalArgumentException("$status er ikke en gyldig varselstatus")
},
)
}.asList,
)
""",
"generasjon_ref" to generasjonRef,
).list { row ->
VarselDto(
row.uuid("unik_id"),
row.string("kode"),
row.localDateTime("opprettet"),
row.uuid("vedtaksperiode_id"),
when (val status = row.string("status")) {
"AKTIV" -> VarselStatusDto.AKTIV
"INAKTIV" -> VarselStatusDto.INAKTIV
"GODKJENT" -> VarselStatusDto.GODKJENT
"VURDERT" -> VarselStatusDto.VURDERT
"AVVIST" -> VarselStatusDto.AVVIST
"AVVIKLET" -> VarselStatusDto.AVVIKLET
else -> throw IllegalArgumentException("$status er ikke en gyldig varselstatus")
},
)
}
}

internal fun TransactionalSession.finnVedtaksperiodeIderFor(fødselsnummer: String): Set<UUID> {
@Language("PostgreSQL")
val query = """
internal fun finnVedtaksperiodeIderFor(fødselsnummer: String): Set<UUID> {
return asSQL(
"""
SELECT svg.vedtaksperiode_id FROM selve_vedtaksperiode_generasjon svg
INNER JOIN vedtak v on svg.vedtaksperiode_id = v.vedtaksperiode_id
INNER JOIN person p on p.id = v.person_ref
WHERE fodselsnummer = ?
"""

return run(queryOf(query, fødselsnummer.toLong()).map { it.uuid("vedtaksperiode_id") }.asList).toSet()
WHERE fodselsnummer = :fodselsnummer
""",
"fodselsnummer" to fødselsnummer.toLong(),
).list {
it.uuid("vedtaksperiode_id")
}.toSet()
}

override fun førsteGenerasjonVedtakFattetTidspunkt(vedtaksperiodeId: UUID): LocalDateTime? =
sessionOf(dataSource).use { session ->
TransactionalGenerasjonDao(session).førsteGenerasjonVedtakFattetTidspunkt(vedtaksperiodeId)
override fun førsteGenerasjonVedtakFattetTidspunkt(vedtaksperiodeId: UUID): LocalDateTime? {
return asSQL(
"""
SELECT tilstand_endret_tidspunkt
FROM selve_vedtaksperiode_generasjon
WHERE vedtaksperiode_id = :vedtaksperiodeId AND tilstand = 'VedtakFattet'
ORDER BY tilstand_endret_tidspunkt
LIMIT 1
""",
"vedtaksperiodeId" to vedtaksperiodeId,
).singleOrNull {
it.localDateTimeOrNull("tilstand_endret_tidspunkt")
}
}

internal fun førsteKjenteDag(fødselsnummer: String): LocalDate {
@Language("PostgreSQL")
val query =
return asSQL(
"""
select min(svg.fom) as foersteFom
from selve_vedtaksperiode_generasjon svg
join vedtak v on svg.vedtaksperiode_id = v.vedtaksperiode_id
join person p on p.id = v.person_ref
where p.fodselsnummer = :fodselsnummer
""".trimIndent()
return sessionOf(dataSource).use { session ->
session.run(
queryOf(
query,
mapOf("fodselsnummer" to fødselsnummer.toLong()),
).map { it.localDate("foersteFom") }.asSingle,
) ?: throw IllegalStateException("Forventet å kunne slå opp første kjente dag")
""",
"fodselsnummer" to fødselsnummer.toLong(),
).single {
it.localDate("foersteFom")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ internal class GenerasjonService(dataSource: DataSource) {
private val sikkerLogger = LoggerFactory.getLogger("tjenestekall")

internal fun TransactionalSession.finnVedtaksperioder(fødselsnummer: String): List<VedtaksperiodeDto> {
return with(generasjonDao) {
finnVedtaksperiodeIderFor(fødselsnummer).map { finnVedtaksperiode(it) }
}
return GenerasjonDao(this).finnVedtaksperiodeIderFor(fødselsnummer).map { finnVedtaksperiode(it) }
}

internal fun TransactionalSession.lagreVedtaksperioder(
Expand All @@ -36,9 +34,7 @@ internal class GenerasjonService(dataSource: DataSource) {
}

private fun TransactionalSession.finnGenerasjoner(vedtaksperiodeId: UUID): List<GenerasjonDto> {
return with(generasjonDao) {
finnGenerasjoner(vedtaksperiodeId).also { hentedeGenerasjoner[vedtaksperiodeId] = it }
}
return GenerasjonDao(this).finnGenerasjoner(vedtaksperiodeId).also { hentedeGenerasjoner[vedtaksperiodeId] = it }
}

private fun TransactionalSession.lagreVedtaksperiode(
Expand All @@ -48,12 +44,10 @@ internal class GenerasjonService(dataSource: DataSource) {
with(vedtakDao) {
lagreVedtaksperiode(fødselsnummer, vedtaksperiode)
}
with(generasjonDao) {
loggDiffMellomHentetOgSkalLagres(vedtaksperiode)
hentedeGenerasjoner.remove(vedtaksperiode.vedtaksperiodeId)
vedtaksperiode.generasjoner.forEach { generasjonDto ->
lagreGenerasjon(generasjonDto)
}
loggDiffMellomHentetOgSkalLagres(vedtaksperiode)
hentedeGenerasjoner.remove(vedtaksperiode.vedtaksperiodeId)
vedtaksperiode.generasjoner.forEach { generasjonDto ->
GenerasjonDao(this).lagreGenerasjon(generasjonDto)
}
with(vedtakDao) {
lagreOpprinneligSøknadsdato(vedtaksperiode.vedtaksperiodeId)
Expand Down
Loading

0 comments on commit 64ff2d5

Please sign in to comment.