Skip to content

Commit

Permalink
🧑‍💻 Teknikk for å kunne la DAO-er ta inn enten DataSource eller Session
Browse files Browse the repository at this point in the history
  • Loading branch information
havstein committed Oct 26, 2024
1 parent 7a68691 commit 619921a
Show file tree
Hide file tree
Showing 14 changed files with 100 additions and 155 deletions.
35 changes: 35 additions & 0 deletions spesialist-felles/src/main/kotlin/no/nav/helse/db/QueryRunner.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package no.nav.helse.db

import io.ktor.utils.io.core.use
import kotliquery.Query
import kotliquery.Row
import kotliquery.Session
import kotliquery.action.QueryAction
import kotliquery.sessionOf
import javax.sql.DataSource

interface QueryRunner {
fun <T> Query.single(mapping: (Row) -> T?): T?

fun <T> Query.list(mapping: (Row) -> T?): List<T>

fun Query.update(): Int
}

class MedSession(private val session: Session) : QueryRunner {
override fun <T> Query.single(mapping: (Row) -> T?) = session.run(map(mapping).asSingle)

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

override fun Query.update() = session.run(asUpdate)
}

class MedDataSource(private val dataSource: DataSource) : QueryRunner {
private fun <T> QueryAction<T>.runInSession() = sessionOf(dataSource).use(::runWithSession)

override fun <T> Query.single(mapping: (Row) -> T?) = map(mapping).asSingle.runInSession()

override fun <T> Query.list(mapping: (Row) -> T?) = map(mapping).asList.runInSession()

override fun Query.update() = asUpdate.runInSession()
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,12 +94,12 @@ internal class SpesialistApp(
private val reservasjonDao = ReservasjonDao(dataSource)
private val arbeidsgiverApiDao = ArbeidsgiverApiDao(dataSource)
private val egenAnsattApiDao = EgenAnsattApiDao(dataSource)
private val opptegnelseDao = OpptegnelseDao.NonTransactional(dataSource)
private val opptegnelseDao = OpptegnelseDao(dataSource)
private val behandlingsstatistikkDao = BehandlingsstatistikkDao(dataSource)
private val notatApiDao = NotatApiDao(dataSource)
private val notatDao = NotatDao(dataSource)
private val totrinnsvurderingApiDao = TotrinnsvurderingApiDao(dataSource)
private val totrinnsvurderingDao = TotrinnsvurderingDao.NonTransactional(dataSource)
private val totrinnsvurderingDao = TotrinnsvurderingDao(dataSource)
private val snapshotApiDao = SnapshotApiDao(dataSource)
private val apiVarselRepository = ApiVarselRepository(dataSource)
private val dokumentDao = DokumentDao.NonTransactional(dataSource)
Expand Down
28 changes: 5 additions & 23 deletions spesialist-selve/src/main/kotlin/no/nav/helse/db/OpptegnelseDao.kt
Original file line number Diff line number Diff line change
@@ -1,35 +1,17 @@
package no.nav.helse.db

import kotliquery.Session
import kotliquery.sessionOf
import no.nav.helse.HelseDao.Companion.asSQL
import no.nav.helse.HelseDao.Companion.list
import no.nav.helse.HelseDao.Companion.update
import no.nav.helse.spesialist.api.abonnement.OpptegnelsePayload
import no.nav.helse.spesialist.api.abonnement.OpptegnelseType
import no.nav.helse.spesialist.api.graphql.schema.Opptegnelse
import no.nav.helse.spesialist.api.graphql.schema.Opptegnelsetype
import java.util.UUID
import javax.sql.DataSource

class OpptegnelseDao(private val session: Session) : OpptegnelseRepository {
object NonTransactional {
operator fun invoke(dataSource: DataSource): OpptegnelseRepository {
fun <T> inSession(block: (Session) -> T) = sessionOf(dataSource).use { block(it) }

return object : OpptegnelseRepository {
override fun opprettOpptegnelse(
dselsnummer: String,
payload: OpptegnelsePayload,
type: OpptegnelseType,
) = inSession { OpptegnelseDao(it).opprettOpptegnelse(fødselsnummer, payload, type) }

override fun finnOpptegnelser(saksbehandlerIdent: UUID): List<Opptegnelse> {
return inSession { OpptegnelseDao(it).finnOpptegnelser(saksbehandlerIdent) }
}
}
}
}
class OpptegnelseDao(private val queryRunner: QueryRunner) : OpptegnelseRepository, QueryRunner by queryRunner {
constructor(session: Session) : this(MedSession(session))
constructor(dataSource: DataSource) : this(MedDataSource(dataSource))

override fun opprettOpptegnelse(
dselsnummer: String,
Expand All @@ -46,7 +28,7 @@ class OpptegnelseDao(private val session: Session) : OpptegnelseRepository {
"fodselsnummer" to fødselsnummer.toLong(),
"payload" to payload.toJson(),
"type" to "$type",
).update(session)
).update()
}

override fun finnOpptegnelser(saksbehandlerIdent: UUID) =
Expand All @@ -61,7 +43,7 @@ class OpptegnelseDao(private val session: Session) : OpptegnelseRepository {
AND o.SEKVENSNUMMER > sos.siste_sekvensnummer
""".trimIndent(),
"saksbehandlerIdent" to saksbehandlerIdent,
).list(session) { row ->
).list { row ->
Opptegnelse(
payload = row.string("payload"),
aktorId = row.long("aktor_id").toString(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,58 +2,17 @@ package no.nav.helse.db

import kotliquery.Query
import kotliquery.Session
import kotliquery.queryOf
import kotliquery.sessionOf
import no.nav.helse.HelseDao.Companion.asSQL
import no.nav.helse.modell.totrinnsvurdering.TotrinnsvurderingOld
import org.intellij.lang.annotations.Language
import java.util.UUID
import javax.sql.DataSource

internal class TotrinnsvurderingDao(
private val session: Session,
) : TotrinnsvurderingDaoInterface {
internal object NonTransactional {
operator fun invoke(dataSource: DataSource): TotrinnsvurderingDaoInterface {
fun <T> inSession(block: (Session) -> T) = sessionOf(dataSource).use { block(it) }

return object : TotrinnsvurderingDaoInterface {
override fun hentAktivTotrinnsvurdering(oppgaveId: Long): TotrinnsvurderingFraDatabase? {
return inSession { TotrinnsvurderingDao(it).hentAktivTotrinnsvurdering(oppgaveId) }
}

override fun oppdater(totrinnsvurderingFraDatabase: TotrinnsvurderingFraDatabase) {
inSession { TotrinnsvurderingDao(it).oppdater(totrinnsvurderingFraDatabase) }
}

override fun settBeslutter(
oppgaveId: Long,
saksbehandlerOid: UUID,
) {
inSession { TotrinnsvurderingDao(it).settBeslutter(oppgaveId, saksbehandlerOid) }
}

override fun settErRetur(vedtaksperiodeId: UUID) {
inSession { TotrinnsvurderingDao(it).settErRetur(vedtaksperiodeId) }
}

override fun opprett(vedtaksperiodeId: UUID): TotrinnsvurderingOld {
return inSession { TotrinnsvurderingDao(it).opprett(vedtaksperiodeId) }
}

override fun hentAktiv(oppgaveId: Long): TotrinnsvurderingOld? {
return inSession { TotrinnsvurderingDao(it).hentAktiv(oppgaveId) }
}

override fun hentAktiv(vedtaksperiodeId: UUID): TotrinnsvurderingOld? {
return inSession { TotrinnsvurderingDao(it).hentAktiv(vedtaksperiodeId) }
}

override fun ferdigstill(vedtaksperiodeId: UUID) {
inSession { TotrinnsvurderingDao(it).ferdigstill(vedtaksperiodeId) }
}
}
}
}
queryRunner: QueryRunner,
) : TotrinnsvurderingDaoInterface, QueryRunner by queryRunner {
constructor(session: Session) : this(MedSession(session))
constructor(dataSource: DataSource) : this(MedDataSource(dataSource))

override fun hentAktivTotrinnsvurdering(oppgaveId: Long): TotrinnsvurderingFraDatabase? {
@Language("PostgreSQL")
Expand All @@ -74,19 +33,17 @@ internal class TotrinnsvurderingDao(
AND utbetaling_id_ref IS NULL
""".trimIndent()

return session.run(
queryOf(query, mapOf("oppgaveId" to oppgaveId)).map { row ->
TotrinnsvurderingFraDatabase(
vedtaksperiodeId = row.uuid("vedtaksperiode_id"),
erRetur = row.boolean("er_retur"),
saksbehandler = row.uuidOrNull("saksbehandler"),
beslutter = row.uuidOrNull("beslutter"),
utbetalingId = row.uuidOrNull("utbetaling_id"),
opprettet = row.localDateTime("opprettet"),
oppdatert = row.localDateTimeOrNull("oppdatert"),
)
}.asSingle,
)
return asSQL(query, "oppgaveId" to oppgaveId).single { row ->
TotrinnsvurderingFraDatabase(
vedtaksperiodeId = row.uuid("vedtaksperiode_id"),
erRetur = row.boolean("er_retur"),
saksbehandler = row.uuidOrNull("saksbehandler"),
beslutter = row.uuidOrNull("beslutter"),
utbetalingId = row.uuidOrNull("utbetaling_id"),
opprettet = row.localDateTime("opprettet"),
oppdatert = row.localDateTimeOrNull("oppdatert"),
)
}
}

override fun oppdater(totrinnsvurderingFraDatabase: TotrinnsvurderingFraDatabase) {
Expand All @@ -103,19 +60,15 @@ internal class TotrinnsvurderingDao(
AND utbetaling_id_ref IS NULL
""".trimIndent()

session.run(
queryOf(
query,
mapOf(
"saksbehandler" to totrinnsvurderingFraDatabase.saksbehandler,
"beslutter" to totrinnsvurderingFraDatabase.beslutter,
"er_retur" to totrinnsvurderingFraDatabase.erRetur,
"oppdatert" to totrinnsvurderingFraDatabase.oppdatert,
"utbetaling_id" to totrinnsvurderingFraDatabase.utbetalingId,
"vedtaksperiode_id" to totrinnsvurderingFraDatabase.vedtaksperiodeId,
),
).asUpdate,
)
asSQL(
query,
"saksbehandler" to totrinnsvurderingFraDatabase.saksbehandler,
"beslutter" to totrinnsvurderingFraDatabase.beslutter,
"er_retur" to totrinnsvurderingFraDatabase.erRetur,
"oppdatert" to totrinnsvurderingFraDatabase.oppdatert,
"utbetaling_id" to totrinnsvurderingFraDatabase.utbetalingId,
"vedtaksperiode_id" to totrinnsvurderingFraDatabase.vedtaksperiodeId,
).update()
}

override fun settBeslutter(
Expand All @@ -137,12 +90,11 @@ internal class TotrinnsvurderingDao(
AND utbetaling_id_ref IS null
""".trimIndent()

session.run(
queryOf(
query,
mapOf("oppgaveId" to oppgaveId, "saksbehandlerOid" to saksbehandlerOid),
).asExecute,
)
asSQL(
query,
"oppgaveId" to oppgaveId,
"saksbehandlerOid" to saksbehandlerOid,
).update()
}

override fun settErRetur(vedtaksperiodeId: UUID) {
Expand All @@ -154,12 +106,10 @@ internal class TotrinnsvurderingDao(
AND utbetaling_id_ref IS null
""".trimIndent()

session.run(
queryOf(
query,
mapOf("vedtaksperiodeId" to vedtaksperiodeId),
).asExecute,
)
asSQL(
query,
"vedtaksperiodeId" to vedtaksperiodeId,
).update()
}

override fun opprett(vedtaksperiodeId: UUID): TotrinnsvurderingOld {
Expand All @@ -173,14 +123,14 @@ internal class TotrinnsvurderingDao(
INSERT INTO totrinnsvurdering (vedtaksperiode_id)
VALUES (:vedtaksperiodeId)
""".trimIndent()
session.run(queryOf(query, mapOf("vedtaksperiodeId" to vedtaksperiodeId)).asUpdate)
asSQL(query, "vedtaksperiodeId" to vedtaksperiodeId).update()
@Language("PostgreSQL")
val selectQuery =
"""
SELECT * FROM totrinnsvurdering
WHERE vedtaksperiode_id = :vedtaksperiodeId
""".trimIndent()
val totrinnsvurdering = session.run(queryOf(selectQuery, mapOf("vedtaksperiodeId" to vedtaksperiodeId)).tilTotrinnsvurdering())
val totrinnsvurdering = asSQL(selectQuery, "vedtaksperiodeId" to vedtaksperiodeId).tilTotrinnsvurdering()

return requireNotNull(totrinnsvurdering)
}
Expand All @@ -196,7 +146,7 @@ internal class TotrinnsvurderingDao(
AND utbetaling_id_ref IS NULL
""".trimIndent()

return session.run(queryOf(query, mapOf("oppgaveId" to oppgaveId)).tilTotrinnsvurdering())
return asSQL(query, "oppgaveId" to oppgaveId).tilTotrinnsvurdering()
}

override fun hentAktiv(vedtaksperiodeId: UUID): TotrinnsvurderingOld? {
Expand All @@ -208,7 +158,7 @@ internal class TotrinnsvurderingDao(
AND utbetaling_id_ref IS NULL
""".trimIndent()

return session.run(queryOf(query, mapOf("vedtaksperiodeId" to vedtaksperiodeId)).tilTotrinnsvurdering())
return asSQL(query, "vedtaksperiodeId" to vedtaksperiodeId).tilTotrinnsvurdering()
}

override fun ferdigstill(vedtaksperiodeId: UUID) {
Expand All @@ -226,16 +176,14 @@ internal class TotrinnsvurderingDao(
AND utbetaling_id_ref IS null
""".trimIndent()

session.run(
queryOf(
query,
mapOf("vedtaksperiodeId" to vedtaksperiodeId),
).asExecute,
)
asSQL(
query,
"vedtaksperiodeId" to vedtaksperiodeId,
).update()
}

private fun Query.tilTotrinnsvurdering() =
map { row ->
single { row ->
TotrinnsvurderingOld(
vedtaksperiodeId = row.uuid("vedtaksperiode_id"),
erRetur = row.boolean("er_retur"),
Expand All @@ -245,5 +193,5 @@ internal class TotrinnsvurderingDao(
opprettet = row.localDateTime("opprettet"),
oppdatert = row.localDateTimeOrNull("oppdatert"),
)
}.asSingle
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ internal class GodkjenningService(
private val saksbehandlerRepository: SaksbehandlerRepository,
private val totrinnsvurderingService: TotrinnsvurderingService =
TotrinnsvurderingService(
TotrinnsvurderingDao.NonTransactional(dataSource),
TotrinnsvurderingDao(dataSource),
oppgaveDao,
pgHistorikkinnslagRepository,
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ internal class SaksbehandlerMediator(
private val generasjonRepository = ApiGenerasjonRepository(dataSource)
private val varselRepository = ApiVarselRepository(dataSource)
private val oppgaveApiDao = OppgaveApiDao(dataSource)
private val opptegnelseDao = OpptegnelseDao.NonTransactional(dataSource)
private val opptegnelseDao = OpptegnelseDao(dataSource)
private val abonnementDao = AbonnementDao(dataSource)
private val reservasjonDao = ReservasjonDao(dataSource)
private val overstyringDao = OverstyringDao(dataSource)
Expand Down
4 changes: 2 additions & 2 deletions spesialist-selve/src/test/kotlin/AbstractIntegrationTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,15 @@ internal abstract class AbstractIntegrationTest : AbstractE2ETest() {
protected val oppgaveDao = OppgaveDao(dataSource)
private val reservasjonDao = ReservasjonDao(dataSource)
private val pgHistorikkinnslagRepository = PgHistorikkinnslagRepository(dataSource)
private val totrinnsvurderingDao = TotrinnsvurderingDao.NonTransactional(dataSource)
private val totrinnsvurderingDao = TotrinnsvurderingDao(dataSource)
private val saksbehandlerDao = SaksbehandlerDao(dataSource)

private val oppgaveService =
OppgaveService(
oppgaveRepository = OppgaveDao(dataSource),
tildelingRepository = TildelingDao(dataSource),
reservasjonRepository = reservasjonDao,
opptegnelseRepository = OpptegnelseDao.NonTransactional(dataSource),
opptegnelseRepository = OpptegnelseDao(dataSource),
totrinnsvurderingDaoInterface = totrinnsvurderingDao,
saksbehandlerRepository = SaksbehandlerDao(dataSource),
rapidsConnection = testRapid,
Expand Down
Loading

0 comments on commit 619921a

Please sign in to comment.