diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalAutomatiseringDao.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalAutomatiseringDao.kt deleted file mode 100644 index c27c50f8c..000000000 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalAutomatiseringDao.kt +++ /dev/null @@ -1,207 +0,0 @@ -package no.nav.helse.db - -import kotliquery.Row -import kotliquery.Session -import kotliquery.queryOf -import no.nav.helse.modell.automatisering.AutomatiseringDto -import org.intellij.lang.annotations.Language -import java.util.UUID - -class TransactionalAutomatiseringDao(private val session: Session) : - AutomatiseringRepository { - override fun settAutomatiseringInaktiv( - vedtaksperiodeId: UUID, - hendelseId: UUID, - ) { - @Language("PostgreSQL") - val query = - """ - UPDATE automatisering - SET inaktiv_fra = now() - WHERE vedtaksperiode_ref = (SELECT id FROM vedtak WHERE vedtak.vedtaksperiode_id = :vedtaksperiode_id LIMIT 1) - AND hendelse_ref = :hendelse_ref - """.trimIndent() - session.run( - queryOf( - query, - mapOf( - "vedtaksperiode_id" to vedtaksperiodeId, - "hendelse_ref" to hendelseId, - ), - ).asUpdate, - ) - } - - override fun settAutomatiseringProblemInaktiv( - vedtaksperiodeId: UUID, - hendelseId: UUID, - ) { - @Language("PostgreSQL") - val query = - """ - UPDATE automatisering_problem - SET inaktiv_fra = now() - WHERE vedtaksperiode_ref = (SELECT id FROM vedtak WHERE vedtak.vedtaksperiode_id = :vedtaksperiode_id LIMIT 1) - AND hendelse_ref = :hendelse_ref - """.trimIndent() - session.run( - queryOf( - query, - mapOf( - "vedtaksperiode_id" to vedtaksperiodeId, - "hendelse_ref" to hendelseId, - ), - ).asUpdate, - ) - } - - override fun plukketUtTilStikkprøve( - vedtaksperiodeId: UUID, - hendelseId: UUID, - ): Boolean { - @Language("PostgreSQL") - val query = - """ - SELECT a.stikkprøve FROM automatisering a - WHERE vedtaksperiode_ref = ( SELECT id FROM vedtak WHERE vedtak.vedtaksperiode_id = ? LIMIT 1) - AND hendelse_ref = ? - AND (inaktiv_fra IS NULL OR inaktiv_fra > now()) - """.trimIndent() - return session.run( - queryOf(query, vedtaksperiodeId, hendelseId) - .map { it.boolean(1) }.asSingle, - ) ?: false - } - - override fun automatisert( - vedtaksperiodeId: UUID, - hendelseId: UUID, - utbetalingId: UUID, - ) = lagre(automatisert = true, stikkprøve = false, vedtaksperiodeId, hendelseId, utbetalingId = utbetalingId) - - override fun manuellSaksbehandling( - problems: List, - vedtaksperiodeId: UUID, - hendelseId: UUID, - utbetalingId: UUID, - ) = lagre(automatisert = false, stikkprøve = false, vedtaksperiodeId, hendelseId, problems, utbetalingId) - - override fun stikkprøve( - vedtaksperiodeId: UUID, - hendelseId: UUID, - utbetalingId: UUID, - ) = lagre(automatisert = false, stikkprøve = true, vedtaksperiodeId, hendelseId, utbetalingId = utbetalingId) - - override fun hentAktivAutomatisering( - vedtaksperiodeId: UUID, - hendelseId: UUID, - ): AutomatiseringDto? { - @Language("PostgreSQL") - val statement = - """ - SELECT a.automatisert, v.vedtaksperiode_id, h.id hendelse_id, a.utbetaling_id - FROM automatisering a - JOIN vedtak v ON a.vedtaksperiode_ref = v.id - JOIN hendelse h ON h.id = a.hendelse_ref - WHERE vedtaksperiode_ref = ? - AND hendelse_ref = ? - AND (inaktiv_fra IS NULL) - """.trimIndent() - val vedtaksperiodeRef = finnVedtaksperiode(vedtaksperiodeId) ?: return null - val problemer = finnAktiveProblemer(vedtaksperiodeRef, hendelseId) - return session.run( - queryOf(statement, vedtaksperiodeRef, hendelseId) - .map { tilAutomatiseringDto(problemer, it) } - .asSingle, - ) - } - - private fun lagre( - automatisert: Boolean, - stikkprøve: Boolean, - vedtaksperiodeId: UUID, - hendelseId: UUID, - problems: List = emptyList(), - utbetalingId: UUID, - ) { - hentAktivAutomatisering(vedtaksperiodeId, hendelseId)?.also { - throw Exception( - "Det kan bare finnes 1 aktiv automatisering. Klarer ikke opprette ny automatisering for vedtaksperiodeId $vedtaksperiodeId og hendelseId $hendelseId.", - ) - } - - @Language("PostgreSQL") - val insertAutomatiseringStatement = - """ - INSERT INTO automatisering (vedtaksperiode_ref, hendelse_ref, automatisert, stikkprøve, utbetaling_id) - VALUES ((SELECT id FROM vedtak WHERE vedtaksperiode_id = ?), ?, ?, ?, ?) - """.trimIndent() - session.run( - queryOf( - insertAutomatiseringStatement, - vedtaksperiodeId, - hendelseId, - automatisert, - stikkprøve, - utbetalingId, - ).asUpdate, - ) - - @Language("PostgreSQL") - val insertProblemStatement = - """ - INSERT INTO automatisering_problem(vedtaksperiode_ref, hendelse_ref, problem) - VALUES ((SELECT id FROM vedtak WHERE vedtaksperiode_id = ?), ?, ?) - """.trimIndent() - problems.forEach { problem -> - session.run( - queryOf( - insertProblemStatement, - vedtaksperiodeId, - hendelseId, - problem, - ).asUpdate, - ) - } - } - - override fun finnAktiveProblemer( - vedtaksperiodeRef: Long, - hendelseId: UUID, - ): List { - @Language("PostgreSQL") - val statement = - """ - SELECT * FROM automatisering_problem - WHERE hendelse_ref = ? - AND vedtaksperiode_ref = ? - AND (inaktiv_fra IS NULL OR inaktiv_fra > now()) - """.trimIndent() - return session.run( - queryOf(statement, hendelseId, vedtaksperiodeRef) - .map { it.string("problem") } - .asList, - ) - } - - override fun finnVedtaksperiode(vedtaksperiodeId: UUID): Long? { - @Language("PostgreSQL") - val statement = "SELECT id FROM vedtak WHERE vedtaksperiode_id = ?" - return session.run( - queryOf(statement, vedtaksperiodeId) - .map { it.long(1) } - .asSingle, - ) - } - - private fun tilAutomatiseringDto( - problemer: List, - row: Row, - ) = AutomatiseringDto( - automatisert = row.boolean("automatisert"), - vedtaksperiodeId = row.uuid("vedtaksperiode_id"), - hendelseId = row.uuid("hendelse_id"), - problemer = problemer, - utbetalingId = row.stringOrNull("utbetaling_id")?.let(UUID::fromString), - ) -} diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/Automatisering.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/Automatisering.kt index f84dfd271..3bde373dc 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/Automatisering.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/Automatisering.kt @@ -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.TransactionalAutomatiseringDao import no.nav.helse.db.TransactionalEgenAnsattDao import no.nav.helse.db.TransactionalGenerasjonDao import no.nav.helse.db.TransactionalMeldingDao @@ -68,7 +67,7 @@ internal class Automatisering( transactionalSession, subsumsjonsmelderProvider, ), - automatiseringRepository = TransactionalAutomatiseringDao(transactionalSession), + automatiseringRepository = AutomatiseringDao(transactionalSession), åpneGosysOppgaverRepository = TransactionalÅpneGosysOppgaverDao(transactionalSession), vergemålRepository = TransactionalVergemålDao(transactionalSession), personRepository = PersonDao(transactionalSession), diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/AutomatiseringDao.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/AutomatiseringDao.kt index aba8c1410..fbebbe991 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/AutomatiseringDao.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/AutomatiseringDao.kt @@ -1,80 +1,175 @@ package no.nav.helse.modell.automatisering -import kotliquery.sessionOf +import kotliquery.Row +import kotliquery.Session +import no.nav.helse.HelseDao.Companion.asSQL +import no.nav.helse.HelseDao.Companion.list +import no.nav.helse.HelseDao.Companion.single +import no.nav.helse.HelseDao.Companion.update import no.nav.helse.db.AutomatiseringRepository -import no.nav.helse.db.TransactionalAutomatiseringDao import java.util.UUID -import javax.sql.DataSource -internal class AutomatiseringDao(val dataSource: DataSource) : AutomatiseringRepository { - override fun manuellSaksbehandling( - problems: List, +internal class AutomatiseringDao(val session: Session) : AutomatiseringRepository { + override fun settAutomatiseringInaktiv( vedtaksperiodeId: UUID, hendelseId: UUID, - utbetalingId: UUID, - ) = sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).manuellSaksbehandling(problems, vedtaksperiodeId, hendelseId, utbetalingId) + ) { + asSQL( + """ + UPDATE automatisering + SET inaktiv_fra = now() + WHERE vedtaksperiode_ref = ( + SELECT id FROM vedtak WHERE vedtak.vedtaksperiode_id = :vedtaksperiodeId LIMIT 1 + ) + AND hendelse_ref = :hendelseRef + """.trimIndent(), + "vedtaksperiodeId" to vedtaksperiodeId, + "hendelseRef" to hendelseId, + ).update(session) } - override fun automatisert( + override fun settAutomatiseringProblemInaktiv( vedtaksperiodeId: UUID, hendelseId: UUID, - utbetalingId: UUID, - ) = sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).automatisert(vedtaksperiodeId, hendelseId, utbetalingId) + ) { + asSQL( + """ + UPDATE automatisering_problem + SET inaktiv_fra = now() + WHERE vedtaksperiode_ref = ( + SELECT id FROM vedtak WHERE vedtak.vedtaksperiode_id = :vedtaksperiodeId LIMIT 1 + ) + AND hendelse_ref = :hendelseRef + """.trimIndent(), + "vedtaksperiodeId" to vedtaksperiodeId, + "hendelseRef" to hendelseId, + ).update(session) } - override fun stikkprøve( + override fun plukketUtTilStikkprøve( + vedtaksperiodeId: UUID, + hendelseId: UUID, + ) = asSQL( + """ + SELECT a.stikkprøve FROM automatisering a + WHERE vedtaksperiode_ref = ( + SELECT id FROM vedtak WHERE vedtak.vedtaksperiode_id = :vedtaksperiodeId LIMIT 1 + ) + AND hendelse_ref = :hendelseId + AND (inaktiv_fra IS NULL OR inaktiv_fra > now()) + """.trimIndent(), + "vedtaksperiodeId" to vedtaksperiodeId, "hendelseId" to hendelseId, + ).single(session) { it.boolean(1) } ?: false + + override fun automatisert( vedtaksperiodeId: UUID, hendelseId: UUID, utbetalingId: UUID, - ) = sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).stikkprøve(vedtaksperiodeId, hendelseId, utbetalingId) - } + ) = lagre(automatisert = true, stikkprøve = false, vedtaksperiodeId, hendelseId, utbetalingId = utbetalingId) - override fun settAutomatiseringInaktiv( + override fun manuellSaksbehandling( + problems: List, vedtaksperiodeId: UUID, hendelseId: UUID, - ) { - sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).settAutomatiseringInaktiv(vedtaksperiodeId, hendelseId) - } - } + utbetalingId: UUID, + ) = lagre(automatisert = false, stikkprøve = false, vedtaksperiodeId, hendelseId, problems, utbetalingId) - override fun settAutomatiseringProblemInaktiv( + override fun stikkprøve( vedtaksperiodeId: UUID, hendelseId: UUID, - ) { - sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).settAutomatiseringProblemInaktiv(vedtaksperiodeId, hendelseId) - } - } + utbetalingId: UUID, + ) = lagre(automatisert = false, stikkprøve = true, vedtaksperiodeId, hendelseId, utbetalingId = utbetalingId) - override fun plukketUtTilStikkprøve( + override fun hentAktivAutomatisering( vedtaksperiodeId: UUID, hendelseId: UUID, - ) = sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).plukketUtTilStikkprøve(vedtaksperiodeId, hendelseId) + ): AutomatiseringDto? { + val vedtaksperiodeRef = finnVedtaksperiode(vedtaksperiodeId) ?: return null + val problemer = finnAktiveProblemer(vedtaksperiodeRef, hendelseId) + return asSQL( + """ + SELECT a.automatisert, v.vedtaksperiode_id, h.id hendelse_id, a.utbetaling_id + FROM automatisering a + JOIN vedtak v ON a.vedtaksperiode_ref = v.id + JOIN hendelse h ON h.id = a.hendelse_ref + WHERE vedtaksperiode_ref = :vedtaksperiodeRef + AND hendelse_ref = :hendelseId + AND (inaktiv_fra IS NULL) + """.trimIndent(), + "vedtaksperiodeRef" to vedtaksperiodeRef, + "hendelseId" to hendelseId, + ).single(session) { tilAutomatiseringDto(problemer, it) } } - override fun hentAktivAutomatisering( + private fun lagre( + automatisert: Boolean, + stikkprøve: Boolean, vedtaksperiodeId: UUID, hendelseId: UUID, - ) = sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).hentAktivAutomatisering(vedtaksperiodeId, hendelseId) + problems: List = emptyList(), + utbetalingId: UUID, + ) { + hentAktivAutomatisering(vedtaksperiodeId, hendelseId)?.also { + throw Exception( + "Det kan bare finnes 1 aktiv automatisering. Klarer ikke opprette ny automatisering for vedtaksperiodeId $vedtaksperiodeId og hendelseId $hendelseId.", + ) + } + + asSQL( + """ + INSERT INTO automatisering (vedtaksperiode_ref, hendelse_ref, automatisert, stikkprøve, utbetaling_id) + VALUES ((SELECT id FROM vedtak WHERE vedtaksperiode_id = :vedtaksperiodeId), :hendelseId, :automatisert, :stikkproeve, :utbetalingId) + """.trimIndent(), + "vedtaksperiodeId" to vedtaksperiodeId, + "hendelseId" to hendelseId, + "automatisert" to automatisert, + "stikkproeve" to stikkprøve, + "utbetalingId" to utbetalingId, + ).update(session) + + problems.forEach { problem -> + asSQL( + """ + INSERT INTO automatisering_problem(vedtaksperiode_ref, hendelse_ref, problem) + VALUES ((SELECT id FROM vedtak WHERE vedtaksperiode_id = :vedtaksperiodeId), :hendelseId, :problem) + """.trimIndent(), + "vedtaksperiodeId" to vedtaksperiodeId, + "hendelseId" to hendelseId, + "problem" to problem, + ).update(session) + } } override fun finnAktiveProblemer( vedtaksperiodeRef: Long, hendelseId: UUID, - ) = sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).finnAktiveProblemer(vedtaksperiodeRef, hendelseId) - } + ) = asSQL( + """ + SELECT * FROM automatisering_problem + WHERE hendelse_ref = :hendelseId + AND vedtaksperiode_ref = :vedtaksperiodeRef + AND (inaktiv_fra IS NULL OR inaktiv_fra > now()) + """.trimIndent(), + "hendelseId" to hendelseId, + "vedtaksperiodeRef" to vedtaksperiodeRef, + ).list(session) { it.string("problem") } - override fun finnVedtaksperiode(vedtaksperiodeId: UUID): Long? = - sessionOf(dataSource).use { session -> - TransactionalAutomatiseringDao(session).finnVedtaksperiode(vedtaksperiodeId) - } + override fun finnVedtaksperiode(vedtaksperiodeId: UUID) = + asSQL( + "SELECT id FROM vedtak WHERE vedtaksperiode_id = :vedtaksperiodeId", + "vedtaksperiodeId" to vedtaksperiodeId, + ).single(session) { it.long(1) } + + private fun tilAutomatiseringDto( + problemer: List, + row: Row, + ) = AutomatiseringDto( + automatisert = row.boolean("automatisert"), + vedtaksperiodeId = row.uuid("vedtaksperiode_id"), + hendelseId = row.uuid("hendelse_id"), + problemer = problemer, + utbetalingId = row.stringOrNull("utbetaling_id")?.let(UUID::fromString), + ) } data class AutomatiseringDto( diff --git a/spesialist-selve/src/test/kotlin/DatabaseIntegrationTest.kt b/spesialist-selve/src/test/kotlin/DatabaseIntegrationTest.kt index 4478777b7..9d5ecdd96 100644 --- a/spesialist-selve/src/test/kotlin/DatabaseIntegrationTest.kt +++ b/spesialist-selve/src/test/kotlin/DatabaseIntegrationTest.kt @@ -157,7 +157,7 @@ abstract class DatabaseIntegrationTest : AbstractDatabaseTest() { internal val meldingDao = MeldingDao(dataSource) internal val meldingDuplikatkontrollDao = MeldingDuplikatkontrollDao(dataSource) internal val risikovurderingDao = RisikovurderingDao(dataSource) - internal val automatiseringDao = AutomatiseringDao(dataSource) + internal val automatiseringDao = AutomatiseringDao(session) internal val åpneGosysOppgaverDao = ÅpneGosysOppgaverDao(dataSource) internal val egenAnsattDao = EgenAnsattDao(dataSource) internal val abonnementDao = AbonnementDao(dataSource)