Skip to content

Commit

Permalink
Lagt på støtte for optimistisk låsing.
Browse files Browse the repository at this point in the history
  • Loading branch information
frodeli committed Oct 9, 2024
1 parent 9da69b3 commit a93ba04
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 35 deletions.
2 changes: 2 additions & 0 deletions api-kontrakt/src/main/kotlin/no/nav/aap/oppgave/OppgaveDto.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ data class OppgaveDto(
val opprettetTidspunkt: LocalDateTime,
val endretAv: String? = null,
val endretTidspunkt: LocalDateTime? = null,
val versjon: Long = 0
) {
init {
if (journalpostId == null) {
Expand All @@ -37,4 +38,5 @@ data class OppgaveDto(
this.avklaringsbehovKode
)
}

}
6 changes: 6 additions & 0 deletions api-kontrakt/src/main/kotlin/no/nav/aap/oppgave/OppgaveId.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package no.nav.aap.oppgave

data class OppgaveId(
val id: Long,
val versjon: Long
)
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ import no.nav.aap.oppgave.AvklaringsbehovReferanseDto

data class NesteOppgaveDto(
val oppgaveId: Long,
val oppgaveVersjon: Long,
val avklaringsbehovReferanse: AvklaringsbehovReferanseDto,
)
4 changes: 0 additions & 4 deletions app/src/main/kotlin/no/nav/aap/oppgave/OppgaveId.kt

This file was deleted.

52 changes: 35 additions & 17 deletions app/src/main/kotlin/no/nav/aap/oppgave/OppgaveRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class OppgaveRepository(private val connection: DBConnection) {
setLocalDateTime(9, oppgaveDto.opprettetTidspunkt)
}
}
return OppgaveId(id)
return OppgaveId(id, 0L)
}

fun hentOppgave(avklaringsbehovReferanse: AvklaringsbehovReferanseDto): OppgaveDto? {
Expand Down Expand Up @@ -109,25 +109,28 @@ class OppgaveRepository(private val connection: DBConnection) {
}
}



fun gjenåpneOppgave(oppgaveId: OppgaveId, ident: String) {
val query = """
UPDATE
OPPGAVE
SET
STATUS = 'OPPRETTET',
ENDRET_AV = ?,
ENDRET_TIDSPUNKT = CURRENT_TIMESTAMP
ENDRET_TIDSPUNKT = CURRENT_TIMESTAMP,
VERSJON = VERSJON + 1
WHERE
ID = ? AND
STATUS != 'OPPRETTET'
STATUS != 'OPPRETTET' AND
VERSJON = ?
""".trimIndent()
connection.execute(query) {
setParams {
setString(1, ident)
setLong(2, oppgaveId.id)
setLong(3, oppgaveId.versjon)
}
setResultValidator { require(it == 1) }
}
}

Expand All @@ -140,17 +143,20 @@ class OppgaveRepository(private val connection: DBConnection) {
ENDRET_AV = ?,
ENDRET_TIDSPUNKT = CURRENT_TIMESTAMP,
RESERVERT_AV = NULL,
RESERVERT_TIDSPUNKT = NULL
RESERVERT_TIDSPUNKT = NULL,
VERSJON = VERSJON + 1
WHERE
ID = ? AND
STATUS != 'AVSLUTTET'
STATUS != 'AVSLUTTET' AND
VERSJON = ?
""".trimIndent()
connection.execute(query) {
setParams {
setString(1, ident)
setLong(2, oppgaveId.id)
setLong(3, oppgaveId.versjon)
}
setResultValidator { require(it == 1) }
}
}

Expand All @@ -162,23 +168,27 @@ class OppgaveRepository(private val connection: DBConnection) {
RESERVERT_AV = NULL,
RESERVERT_TIDSPUNKT = NULL,
ENDRET_AV = ?,
ENDRET_TIDSPUNKT = CURRENT_TIMESTAMP
ENDRET_TIDSPUNKT = CURRENT_TIMESTAMP,
VERSJON = VERSJON + 1
WHERE
ID = ? AND
STATUS != 'AVSLUTTET'
STATUS != 'AVSLUTTET' AND
VERSJON = ?
""".trimIndent()
connection.execute(query) {
setParams {
setString(1, ident)
setLong(2, oppgaveId.id)
setLong(3, oppgaveId.versjon)
}
setResultValidator { require(it == 1) }
}
}

fun finnNesteOppgave(filterDto: FilterDto): NesteOppgaveDto? {
val hentNesteOppgaveQuery = """
SELECT
ID, SAKSNUMMER, BEHANDLING_REF, JOURNALPOST_ID, AVKLARINGSBEHOV_TYPE
ID, VERSJON, SAKSNUMMER, BEHANDLING_REF, JOURNALPOST_ID, AVKLARINGSBEHOV_TYPE
FROM
OPPGAVE
WHERE
Expand All @@ -193,6 +203,7 @@ class OppgaveRepository(private val connection: DBConnection) {
setRowMapper {
NesteOppgaveDto(
oppgaveId = it.getLong("ID"),
oppgaveVersjon = it.getLong("VERSJON"),
AvklaringsbehovReferanseDto(
saksnummer = it.getStringOrNull("SAKSNUMMER"),
referanse = it.getUUIDOrNull("BEHANDLING_REF"),
Expand All @@ -213,16 +224,21 @@ class OppgaveRepository(private val connection: DBConnection) {
RESERVERT_AV = ?,
RESERVERT_TIDSPUNKT = CURRENT_TIMESTAMP,
ENDRET_AV = ?,
ENDRET_TIDSPUNKT = CURRENT_TIMESTAMP
WHERE ID = ?
ENDRET_TIDSPUNKT = CURRENT_TIMESTAMP,
VERSJON = VERSJON + 1
WHERE
ID = ? AND
VERSJON = ?
""".trimIndent()

connection.execute(updaterOppgaveReservasjonQuery) {
setParams {
setString(1, reservertAvIdent)
setString(2, ident)
setLong(3, oppgaveId.id)
setLong(4, oppgaveId.versjon)
}
setResultValidator { require(it == 1) }
}
}

Expand Down Expand Up @@ -270,7 +286,7 @@ class OppgaveRepository(private val connection: DBConnection) {
val journalpostIdClause = if (avklaringsbehovReferanse.journalpostId != null) "JOURNALPOST_ID = ?" else "JOURNALPOST_ID IS NULL"
val oppgaverForReferanseQuery = """
SELECT
ID
ID, VERSJON
FROM
OPPGAVE
WHERE
Expand All @@ -290,7 +306,7 @@ class OppgaveRepository(private val connection: DBConnection) {
setString(index++, avklaringsbehovReferanse.avklaringsbehovKode)
}
setRowMapper { row ->
OppgaveId(row.getLong("ID"))
OppgaveId(row.getLong("ID"), row.getLong("VERSJON"))
}
}
if (oppgaver.size > 1) {
Expand Down Expand Up @@ -325,7 +341,8 @@ class OppgaveRepository(private val connection: DBConnection) {
opprettetAv = row.getString("OPPRETTET_AV"),
opprettetTidspunkt = row.getLocalDateTime("OPPRETTET_TIDSPUNKT"),
endretAv = row.getStringOrNull("ENDRET_AV"),
endretTidspunkt = row.getLocalDateTimeOrNull("ENDRET_TIDSPUNKT")
endretTidspunkt = row.getLocalDateTimeOrNull("ENDRET_TIDSPUNKT"),
versjon = row.getLong("VERSJON"),
)
}

Expand All @@ -344,7 +361,8 @@ class OppgaveRepository(private val connection: DBConnection) {
OPPRETTET_AV,
OPPRETTET_TIDSPUNKT,
ENDRET_AV,
ENDRET_TIDSPUNKT
ENDRET_TIDSPUNKT,
VERSJON
""".trimIndent()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,14 @@ class OppdaterOppgaveService(private val connection: DBConnection) {
) {
val eksisterendeOppgave = oppgaveMap[avklaringsbehov.avklaringsbehovKode]
if (eksisterendeOppgave != null && eksisterendeOppgave.status == no.nav.aap.oppgave.verdityper.Status.AVSLUTTET) {
oppgaveRepo.gjenåpneOppgave(OppgaveId(eksisterendeOppgave.id!!), "Kelvin")
oppgaveRepo.gjenåpneOppgave(eksisterendeOppgave.oppgaveId(), "Kelvin")
if (avklaringsbehov.status in setOf(
AvklaringsbehovStatus.SENDT_TILBAKE_FRA_KVALITETSSIKRER,
AvklaringsbehovStatus.SENDT_TILBAKE_FRA_BESLUTTER)
) {
val sistEndretAv = avklaringsbehov.sistEndretAv()
if (sistEndretAv != null && sistEndretAv != "Kelvin") {
oppgaveRepo.reserverOppgave(OppgaveId(eksisterendeOppgave.id!!), "Kelvin", sistEndretAv)
oppgaveRepo.reserverOppgave(eksisterendeOppgave.oppgaveId(), "Kelvin", sistEndretAv)
}
}
}
Expand Down Expand Up @@ -138,7 +138,7 @@ class OppdaterOppgaveService(private val connection: DBConnection) {
private fun avslutteOppgaver(oppgaver: List<OppgaveDto>, oppgaveRepo: OppgaveRepository) {
oppgaver
.filter { it.status != no.nav.aap.oppgave.verdityper.Status.AVSLUTTET }
.forEach { oppgaveRepo.avsluttOppgave(OppgaveId(it.id!!), "Kelvin") }
.forEach { oppgaveRepo.avsluttOppgave(it.oppgaveId(), "Kelvin") }
}

private fun OppgaveOppdatering.hvemLøsteForrigeAvklaringsbehov(): Pair<AvklaringsbehovKode, String>? {
Expand Down Expand Up @@ -179,7 +179,9 @@ class OppdaterOppgaveService(private val connection: DBConnection) {
avklaringsbehovKode = avklaringsbehovKode.kode,
behandlingstype = behandlingstype,
opprettetAv = ident,
opprettetTidspunkt = LocalDateTime.now()
opprettetTidspunkt = LocalDateTime.now(),
)
}

private fun OppgaveDto.oppgaveId() = OppgaveId(this.id!!, this.versjon)
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class PlukkOppgaveService(val connection: DBConnection) {
)

if (harTilgang) {
oppgaveRepo.reserverOppgave(OppgaveId(nesteOppgave.oppgaveId), ident, ident)
oppgaveRepo.reserverOppgave(OppgaveId(nesteOppgave.oppgaveId, nesteOppgave.oppgaveVersjon), ident, ident)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,22 @@ class ReserverOppgaveService(val connection: DBConnection) {
if (harTilgang) {
val oppgaveRepo = OppgaveRepository(connection)
oppgaverSomSkalReserveres.forEach {
oppgaveRepo.reserverOppgave(OppgaveId(it.id), ident, ident)
oppgaveRepo.reserverOppgave(it, ident, ident)
}
return oppgaverSomSkalReserveres
}
return listOf()
}

fun reserverOppgaveUtenTilgangskontroll(
avklaringsbehovReferanse: AvklaringsbehovReferanseDto,
ident: String
): List<OppgaveId> {
/**
* Reserver oppgave uten kall mot tilgangkontroll - brukes når oppgave skal reserveres av behandlingsprosess uten
* uten noen innloggingskontekst.
*/
fun reserverOppgaveUtenTilgangskontroll(avklaringsbehovReferanse: AvklaringsbehovReferanseDto, ident: String): List<OppgaveId> {
val oppgaveRepo = OppgaveRepository(connection)
val oppgaverSomSkalReserveres = oppgaveRepo.hentÅpneOppgaver(avklaringsbehovReferanse)
oppgaverSomSkalReserveres.forEach {
oppgaveRepo.reserverOppgave(OppgaveId(it.id), ident, ident)
oppgaveRepo.reserverOppgave(it, ident, ident)
}
return oppgaverSomSkalReserveres
}
Expand Down
11 changes: 8 additions & 3 deletions app/src/test/kotlin/no/nav/aap/oppgave/OppgaveRepositoryTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,16 @@ class OppgaveRepositoryTest {
reserverOppgave(oppgaveId2, "bruker2")
reserverOppgave(oppgaveId3, "bruker1")
reserverOppgave(oppgaveId4, "bruker1")
avsluttOppgave(oppgaveId4)

val mineOppgaverFørAvslutt = mineOppgave("bruker1")
assertThat(mineOppgaverFørAvslutt).hasSize(3)

val oppgaveSomSkalAvsluttes = mineOppgaverFørAvslutt.first { it.id == oppgaveId4.id }
avsluttOppgave(OppgaveId(oppgaveSomSkalAvsluttes.id!!, oppgaveSomSkalAvsluttes.versjon))

InitTestDatabase.dataSource.transaction { connection ->
val oppgaver = OppgaveRepository(connection).hentMineOppgaver("bruker1")
assertThat(oppgaver.size).isEqualTo(2)
assertThat(oppgaver).hasSize(2)
}
}

Expand All @@ -107,7 +112,7 @@ class OppgaveRepositoryTest {
var mineOppgaver = mineOppgave("saksbehandler1")
assertThat(mineOppgaver).hasSize(1)

avreserverOppgave(oppgaveId, "saksbehandler1")
avreserverOppgave(OppgaveId(mineOppgaver.first().id!!, mineOppgaver.first().versjon), "saksbehandler1")
mineOppgaver = mineOppgave("saksbehandler1")
assertThat(mineOppgaver).hasSize(0)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TABLE OPPGAVE ADD COLUMN VERSJON BIGINT DEFAULT 0 NOT NULL;

0 comments on commit a93ba04

Please sign in to comment.