Skip to content

Commit

Permalink
♻️ Godkjenningsbehov kan kjøres transaksjonelt
Browse files Browse the repository at this point in the history
  • Loading branch information
trinelinderud authored and oydisrefsum committed Oct 23, 2024
1 parent 2b5842a commit b921d76
Show file tree
Hide file tree
Showing 33 changed files with 586 additions and 536 deletions.
26 changes: 26 additions & 0 deletions spesialist-felles/src/main/kotlin/no/nav/helse/HelseDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,39 @@ package no.nav.helse

import kotliquery.Query
import kotliquery.Row
import kotliquery.Session
import kotliquery.TransactionalSession
import kotliquery.queryOf
import kotliquery.sessionOf
import org.intellij.lang.annotations.Language
import javax.sql.DataSource

abstract class HelseDao(private val dataSource: DataSource) {
companion object {
fun asSQL(
@Language("SQL") sql: String,
vararg params: Pair<String, Any?>,
) = queryOf(sql, params.toMap())

// Plis bare bruk denne til ting det ikke går an å gjøre med navngitte parametere - eks. ".. AND orgnummer = ANY(?)"
fun asSQLForQuestionMarks(
@Language("SQL") sql: String,
vararg params: Any?,
) = queryOf(sql, *params)

fun <T> Query.single(
session: Session,
mapping: (Row) -> T?,
) = session.run(map(mapping).asSingle)

fun <T> Query.list(
session: Session,
mapping: (Row) -> T?,
) = session.run(map(mapping).asList)

fun Query.update(session: Session) = session.run(asUpdate)
}

fun asSQL(
@Language("SQL") sql: String,
argMap: Map<String, Any?> = emptyMap(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
package no.nav.helse.db

import com.fasterxml.jackson.module.kotlin.readValue
import kotliquery.TransactionalSession
import kotliquery.queryOf
import kotliquery.sessionOf
import no.nav.helse.HelseDao
import no.nav.helse.modell.vilkårsprøving.AvviksvurderingDto
import no.nav.helse.modell.vilkårsprøving.BeregningsgrunnlagDto
import no.nav.helse.modell.vilkårsprøving.SammenligningsgrunnlagDto
import no.nav.helse.objectMapper
import no.nav.helse.spesialist.api.avviksvurdering.Beregningsgrunnlag
import no.nav.helse.spesialist.api.avviksvurdering.Sammenligningsgrunnlag
Expand All @@ -17,7 +14,7 @@ import java.util.UUID
import javax.sql.DataSource
import no.nav.helse.spesialist.api.avviksvurdering.Avviksvurdering as ApiAvviksvurdering

class AvviksvurderingDao(private val dataSource: DataSource) : HelseDao(dataSource), AvviksvurderingRepository {
class AvviksvurderingDao(private val dataSource: DataSource) : HelseDao(dataSource) {
internal fun lagre(avviksvurdering: AvviksvurderingDto) {
sessionOf(dataSource, returnGeneratedKey = true).use { session ->
@Language("PostgreSQL")
Expand Down Expand Up @@ -84,55 +81,11 @@ class AvviksvurderingDao(private val dataSource: DataSource) : HelseDao(dataSour
}
}

internal fun finnAvviksvurderinger(fødselsnummer: String): List<AvviksvurderingDto> =
asSQL(
"""
SELECT av.unik_id, vpa.vilkårsgrunnlag_id, av.fødselsnummer, av.skjæringstidspunkt, av.opprettet, avviksprosent, beregningsgrunnlag, sg.sammenligningsgrunnlag FROM avviksvurdering av
INNER JOIN sammenligningsgrunnlag sg ON av.sammenligningsgrunnlag_ref = sg.id
INNER JOIN vilkarsgrunnlag_per_avviksvurdering vpa ON vpa.avviksvurdering_ref = av.unik_id
WHERE av.fødselsnummer = :fodselsnummer
AND av.slettet IS NULL;
""".trimIndent(),
mapOf(
"fodselsnummer" to fødselsnummer,
),
).list {
AvviksvurderingDto(
unikId = it.uuid("unik_id"),
vilkårsgrunnlagId = it.uuid("vilkårsgrunnlag_id"),
fødselsnummer = it.string("fødselsnummer"),
skjæringstidspunkt = it.localDate("skjæringstidspunkt"),
opprettet = it.localDateTime("opprettet"),
avviksprosent = it.double("avviksprosent"),
sammenligningsgrunnlag = objectMapper.readValue<SammenligningsgrunnlagDto>(it.string("sammenligningsgrunnlag")),
beregningsgrunnlag = objectMapper.readValue<BeregningsgrunnlagDto>(it.string("beregningsgrunnlag")),
)
}

internal fun TransactionalSession.finnAvviksvurderinger(fødselsnummer: String): List<AvviksvurderingDto> =
asSQL(
"""
SELECT av.unik_id, vpa.vilkårsgrunnlag_id, av.fødselsnummer, av.skjæringstidspunkt, av.opprettet, avviksprosent, beregningsgrunnlag, sg.sammenligningsgrunnlag FROM avviksvurdering av
INNER JOIN sammenligningsgrunnlag sg ON av.sammenligningsgrunnlag_ref = sg.id
INNER JOIN vilkarsgrunnlag_per_avviksvurdering vpa ON vpa.avviksvurdering_ref = av.unik_id
WHERE av.fødselsnummer = :fodselsnummer
AND av.slettet IS NULL;
""".trimIndent(),
mapOf(
"fodselsnummer" to fødselsnummer,
),
).list(this) {
AvviksvurderingDto(
unikId = it.uuid("unik_id"),
vilkårsgrunnlagId = it.uuid("vilkårsgrunnlag_id"),
fødselsnummer = it.string("fødselsnummer"),
skjæringstidspunkt = it.localDate("skjæringstidspunkt"),
opprettet = it.localDateTime("opprettet"),
avviksprosent = it.double("avviksprosent"),
sammenligningsgrunnlag = objectMapper.readValue<SammenligningsgrunnlagDto>(it.string("sammenligningsgrunnlag")),
beregningsgrunnlag = objectMapper.readValue<BeregningsgrunnlagDto>(it.string("beregningsgrunnlag")),
)
fun finnAvviksvurderinger(fødselsnummer: String): List<AvviksvurderingDto> {
sessionOf(dataSource).use { session ->
return TransactionalAvviksvurderingDao(session).finnAvviksvurderinger(fødselsnummer)
}
}

internal fun finnAvviksvurdering(vilkårsgrunnlagId: UUID): ApiAvviksvurdering? =
asSQL(
Expand Down Expand Up @@ -161,21 +114,14 @@ class AvviksvurderingDao(private val dataSource: DataSource) : HelseDao(dataSour
)
}

override fun opprettKobling(
fun opprettKobling(
avviksvurderingId: UUID,
vilkårsgrunnlagId: UUID,
) {
try {
asSQL(
"""
INSERT INTO vilkarsgrunnlag_per_avviksvurdering(avviksvurdering_ref, vilkårsgrunnlag_id)
VALUES (:unik_id, :vilkarsgrunnlag_id) ON CONFLICT DO NOTHING;
""".trimIndent(),
mapOf(
"unik_id" to avviksvurderingId,
"vilkarsgrunnlag_id" to vilkårsgrunnlagId,
),
).update()
sessionOf(dataSource).use { session ->
TransactionalAvviksvurderingDao(session).opprettKobling(avviksvurderingId, vilkårsgrunnlagId)
}
} catch (e: Exception) {
logg.error("Lagrer IKKE kobling mellom avviksvurdering ($avviksvurderingId) og vilkårsgrunnlag ($vilkårsgrunnlagId)", e)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package no.nav.helse.db

import no.nav.helse.modell.vilkårsprøving.AvviksvurderingDto
import java.util.UUID

interface AvviksvurderingRepository {
fun opprettKobling(
avviksvurderingId: UUID,
vilkårsgrunnlagId: UUID,
)

fun finnAvviksvurderinger(fødselsnummer: String): List<AvviksvurderingDto>
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package no.nav.helse.db

import kotliquery.Session
import kotliquery.queryOf
import no.nav.helse.modell.KomplettArbeidsforholdDto
import org.intellij.lang.annotations.Language

internal class TransactionalArbeidsforholdDao(
private val session: Session,
) : ArbeidsforholdRepository {
override fun findArbeidsforhold(
dselsnummer: String,
organisasjonsnummer: String,
): List<KomplettArbeidsforholdDto> {
@Language("PostgreSQL")
val query = """
SELECT startdato, sluttdato, stillingstittel, stillingsprosent
FROM arbeidsforhold
WHERE person_ref = (SELECT id FROM person WHERE fodselsnummer = :fodselsnummer)
AND arbeidsgiver_ref = (SELECT id FROM arbeidsgiver WHERE orgnummer = :organisasjonsnummer);
"""
return session.run(
queryOf(
query,
mapOf(
"fodselsnummer" to fødselsnummer.toLong(),
"organisasjonsnummer" to organisasjonsnummer.toLong(),
),
).map { row ->
KomplettArbeidsforholdDto(
fødselsnummer = fødselsnummer,
organisasjonsnummer = organisasjonsnummer,
startdato = row.localDate("startdato"),
sluttdato = row.localDateOrNull("sluttdato"),
stillingsprosent = row.int("stillingsprosent"),
stillingstittel = row.string("stillingstittel"),
)
}.asList,
)
}

override fun upsertArbeidsforhold(
dselsnummer: String,
organisasjonsnummer: String,
arbeidsforhold: List<KomplettArbeidsforholdDto>,
) {
slettArbeidsforhold(fødselsnummer, organisasjonsnummer)
arbeidsforhold.forEach { komplettArbeidsforhold ->
TransactionalArbeidsforholdDao(session).insertArbeidsforhold(komplettArbeidsforhold)
}
}

internal fun insertArbeidsforhold(arbeidsforholdDto: KomplettArbeidsforholdDto) {
@Language("PostgreSQL")
val query = """
INSERT INTO arbeidsforhold(person_ref, arbeidsgiver_ref, startdato, sluttdato, stillingstittel, stillingsprosent)
VALUES(
(SELECT id FROM person WHERE fodselsnummer = :fodselsnummer),
(SELECT id FROM arbeidsgiver WHERE orgnummer = :organisasjonsnummer),
:startdato, :sluttdato, :stillingstittel, :stillingsprosent
);
"""
session.run(
queryOf(
query,
mapOf(
"fodselsnummer" to arbeidsforholdDto.fødselsnummer.toLong(),
"organisasjonsnummer" to arbeidsforholdDto.organisasjonsnummer.toLong(),
"startdato" to arbeidsforholdDto.startdato,
"sluttdato" to arbeidsforholdDto.sluttdato,
"stillingstittel" to arbeidsforholdDto.stillingstittel,
"stillingsprosent" to arbeidsforholdDto.stillingsprosent,
),
).asUpdate,
)
}

internal fun slettArbeidsforhold(
dselsnummer: String,
organisasjonsnummer: String,
) {
@Language("PostgreSQL")
val deleteQuery = """
DELETE FROM arbeidsforhold
WHERE person_ref = (SELECT id FROM person WHERE fodselsnummer = :fodselsnummer)
AND arbeidsgiver_ref = (SELECT id FROM arbeidsgiver WHERE orgnummer = :organisasjonsnummer);
"""
session.run(
queryOf(
deleteQuery,
mapOf(
"fodselsnummer" to fødselsnummer.toLong(),
"organisasjonsnummer" to organisasjonsnummer.toLong(),
),
).asUpdate,
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package no.nav.helse.db

import com.fasterxml.jackson.module.kotlin.readValue
import kotliquery.Session
import kotliquery.queryOf
import no.nav.helse.HelseDao.Companion.asSQL
import no.nav.helse.HelseDao.Companion.list
import no.nav.helse.modell.vilkårsprøving.AvviksvurderingDto
import no.nav.helse.modell.vilkårsprøving.BeregningsgrunnlagDto
import no.nav.helse.modell.vilkårsprøving.SammenligningsgrunnlagDto
import no.nav.helse.objectMapper
import org.intellij.lang.annotations.Language
import java.util.UUID

internal class TransactionalAvviksvurderingDao(private val session: Session) : AvviksvurderingRepository {
override fun opprettKobling(
avviksvurderingId: UUID,
vilkårsgrunnlagId: UUID,
) {
@Language("PostgreSQL")
val statement =
"""
INSERT INTO vilkarsgrunnlag_per_avviksvurdering(avviksvurdering_ref, vilkårsgrunnlag_id)
VALUES (:unik_id, :vilkarsgrunnlag_id) ON CONFLICT DO NOTHING;
""".trimIndent()
session.run(
queryOf(statement, mapOf("unik_id" to avviksvurderingId, "vilkarsgrunnlag_id" to vilkårsgrunnlagId)).asUpdate,
)
}

override fun finnAvviksvurderinger(fødselsnummer: String): List<AvviksvurderingDto> =
asSQL(
"""
SELECT av.unik_id, vpa.vilkårsgrunnlag_id, av.fødselsnummer, av.skjæringstidspunkt, av.opprettet, avviksprosent, beregningsgrunnlag, sg.sammenligningsgrunnlag FROM avviksvurdering av
INNER JOIN sammenligningsgrunnlag sg ON av.sammenligningsgrunnlag_ref = sg.id
INNER JOIN vilkarsgrunnlag_per_avviksvurdering vpa ON vpa.avviksvurdering_ref = av.unik_id
WHERE av.fødselsnummer = :fodselsnummer
AND av.slettet IS NULL;
""".trimIndent(),
"fodselsnummer" to fødselsnummer,
).list(session) {
AvviksvurderingDto(
unikId = it.uuid("unik_id"),
vilkårsgrunnlagId = it.uuid("vilkårsgrunnlag_id"),
fødselsnummer = it.string("fødselsnummer"),
skjæringstidspunkt = it.localDate("skjæringstidspunkt"),
opprettet = it.localDateTime("opprettet"),
avviksprosent = it.double("avviksprosent"),
sammenligningsgrunnlag = objectMapper.readValue<SammenligningsgrunnlagDto>(it.string("sammenligningsgrunnlag")),
beregningsgrunnlag = objectMapper.readValue<BeregningsgrunnlagDto>(it.string("beregningsgrunnlag")),
)
}
}
Loading

0 comments on commit b921d76

Please sign in to comment.