Skip to content

Commit

Permalink
Merge pull request #1804 from navikt/dev
Browse files Browse the repository at this point in the history
Synce master med dev
  • Loading branch information
slovrid authored Dec 3, 2024
2 parents 128fabe + b758348 commit d4e3cd2
Show file tree
Hide file tree
Showing 7 changed files with 514 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -402,4 +402,20 @@ private TILTAKSHENDELSE() { /* no-op*/ }
public static final String AVSENDER = "AVSENDER";
public static final String SIST_ENDRET = "SIST_ENDRET";
}

public static final class HENDELSE {
private HENDELSE() { /* no-op */ }

public static final String TABLE_NAME = "FILTERHENDELSER";
public static final String ID = "ID";
public static final String PERSON_IDENT = "PERSON_IDENT";
public static final String HENDELSE_NAVN = "HENDELSE_NAVN";
public static final String HENDELSE_DATO = "HENDELSE_DATO";
public static final String HENDELSE_LENKE = "HENDELSE_LENKE";
public static final String HENDELSE_DETALJER = "HENDELSE_DETALJER";
public static final String KATEGORI = "KATEGORI";
public static final String AVSENDER = "AVSENDER";
public static final String OPPRETTET = "OPPRETTET";
public static final String SIST_ENDRET = "SIST_ENDRET";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import no.nav.common.types.identer.NorskIdent
import java.net.URL
import java.time.ZonedDateTime
import java.util.*

enum class Kategori {
UTGATT_VARSEL
}

enum class Operasjon {
START,
STOPP,
OPPDATER
}

data class Hendelse(
val id: UUID,
val personIdent: NorskIdent,
val avsender: String,
val kategori: Kategori,
val hendelse: HendelseInnhold
) {
data class HendelseInnhold(
val beskrivelse: String,
val dato: ZonedDateTime,
val lenke: URL,
val detaljer: String?
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
package no.nav.pto.veilarbportefolje.hendelsesfilter

import Hendelse
import Kategori
import no.nav.common.types.identer.NorskIdent
import no.nav.pto.veilarbportefolje.database.PostgresTable.HENDELSE
import no.nav.pto.veilarbportefolje.util.DateUtils.toTimestamp
import no.nav.pto.veilarbportefolje.util.DateUtils.toZonedDateTime
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.dao.EmptyResultDataAccessException
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Repository
import java.net.URI
import java.sql.ResultSet
import java.time.ZonedDateTime
import java.util.*

@Repository
class HendelseRepository(
@Autowired private val jdbcTemplate: JdbcTemplate
) {

/**
* Henter en hendelse:
*
* * dersom en hendelse med ID [id] eksisterer returneres denne
* * dersom ingen hendelse med ID [id] eksisterer kastes en [IngenHendelseMedIdException]
*/
fun get(id: UUID): Hendelse {
// language=postgresql
val sql = "SELECT * FROM ${HENDELSE.TABLE_NAME} WHERE ${HENDELSE.ID} = ?"
val resultat = try {
jdbcTemplate.queryForObject(sql, ::toHendelse, id)
} catch (ex: EmptyResultDataAccessException) {
throw IngenHendelseMedIdException(id = id.toString(), cause = ex)
}

return resultat
?: throw RuntimeException("Ukjent feil ved henting av hendelse med ID $id. Forventet å få en instans av ${Hendelse::class.simpleName} men fikk null.")
}

/**
* Henter den eldste hendelsen:
*
* * dersom minst en hendelse eksisterer for [personIdent] returneres den eldste av disse
* * dersom ingen hendelser eksisterer for [personIdent] kastes en [IngenHendelseForPersonException]
*/
fun getEldste(personIdent: NorskIdent): Hendelse {
// language=postgresql
val sql = """
SELECT * FROM ${HENDELSE.TABLE_NAME} WHERE ${HENDELSE.PERSON_IDENT} = ?
ORDER BY ${HENDELSE.HENDELSE_DATO} LIMIT 1
""".trimIndent()

val resultat = try {
jdbcTemplate.queryForObject(sql, ::toHendelse, personIdent.get())
} catch (ex: EmptyResultDataAccessException) {
throw IngenHendelseForPersonException(cause = ex)
}

return resultat
?: throw RuntimeException("Ukjent feil ved henting av hendelse for person. Forventet å få en instans av ${Hendelse::class.simpleName} men fikk null.")
}

/**
* Lagre en hendelse:
*
* * dersom ingen hendelse med samme [Hendelse.id] eksisterer fra før lagres hendelsen
* * dersom en hendelse med samme [Hendelse.id] eksisterer fra før kastes [HendelseIdEksistererAlleredeException].
*/
fun insert(hendelse: Hendelse) {
val (id, personIdent, avsender, kategori, hendelseInnhold) = hendelse
val (navn, dato, lenke, detaljer) = hendelseInnhold

// language=postgresql
val sql = """
INSERT INTO ${HENDELSE.TABLE_NAME} (
${HENDELSE.ID},
${HENDELSE.PERSON_IDENT},
${HENDELSE.HENDELSE_NAVN},
${HENDELSE.HENDELSE_DATO},
${HENDELSE.HENDELSE_LENKE},
${HENDELSE.HENDELSE_DETALJER},
${HENDELSE.KATEGORI},
${HENDELSE.AVSENDER},
${HENDELSE.OPPRETTET},
${HENDELSE.SIST_ENDRET}
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (${HENDELSE.ID}) DO NOTHING
"""

val timestampAkkuratNaa = toTimestamp(ZonedDateTime.now())
val affectedRows = jdbcTemplate.update(
sql,
id,
personIdent.get(),
navn,
toTimestamp(dato),
lenke.toString(),
detaljer,
kategori.name,
avsender,
timestampAkkuratNaa,
timestampAkkuratNaa,
)

if (affectedRows == 0) {
throw HendelseIdEksistererAlleredeException("Hendelse med id $id eksisterer allerede.")
}
}

/**
* Oppdater en hendelse:
*
* * dersom en hendelse med samme [Hendelse.id] eksisterer fra før oppdateres denne med data fra [hendelse]
* * dersom ingen hendelse med samme [Hendelse.id] eksisterer fra før kastes [IngenHendelseMedIdException]
*/
fun update(hendelse: Hendelse) {
val (id, personIdent, avsender, kategori, hendelseInnhold) = hendelse
val (navn, dato, lenke, detaljer) = hendelseInnhold

// language=postgresql
val sql = """
UPDATE ${HENDELSE.TABLE_NAME} SET (
${HENDELSE.PERSON_IDENT},
${HENDELSE.HENDELSE_NAVN},
${HENDELSE.HENDELSE_DATO},
${HENDELSE.HENDELSE_LENKE},
${HENDELSE.HENDELSE_DETALJER},
${HENDELSE.KATEGORI},
${HENDELSE.AVSENDER},
${HENDELSE.SIST_ENDRET}
) = (?, ?, ?, ?, ?, ?, ?, ?)
WHERE ${HENDELSE.ID} = ?
"""

val affectedRows = jdbcTemplate.update(
sql,
personIdent.get(),
navn,
toTimestamp(dato),
lenke.toString(),
detaljer,
kategori.name,
avsender,
toTimestamp(ZonedDateTime.now()),
id
)

if (affectedRows == 0) {
throw IngenHendelseMedIdException(id.toString())
}
}

/**
* Slett en hendelse:
*
* * dersom en hendelse eksisterer med ID lik [id] slettes hendelsen
* * dersom ingen hendelse eksisterer med ID lik [id] kastes [IngenHendelseMedIdException]
*/
fun delete(id: UUID) {
val sql = "DELETE FROM ${HENDELSE.TABLE_NAME} WHERE ${HENDELSE.ID} = ?"
val affectedRows = jdbcTemplate.update(sql, id)

if (affectedRows == 0) {
throw IngenHendelseMedIdException(id.toString())
}
}

}

private fun toHendelse(resultSet: ResultSet, affectedRows: Int): Hendelse {
return Hendelse(
id = UUID.fromString(resultSet.getString(HENDELSE.ID)),
personIdent = NorskIdent(resultSet.getString(HENDELSE.PERSON_IDENT)),
avsender = resultSet.getString(HENDELSE.AVSENDER),
kategori = Kategori.valueOf(resultSet.getString(HENDELSE.KATEGORI)),
hendelse = Hendelse.HendelseInnhold(
beskrivelse = resultSet.getString(HENDELSE.HENDELSE_NAVN),
dato = toZonedDateTime(resultSet.getTimestamp(HENDELSE.HENDELSE_DATO)),
lenke = URI.create(resultSet.getString(HENDELSE.HENDELSE_LENKE)).toURL(),
detaljer = resultSet.getString(HENDELSE.HENDELSE_DETALJER),
)
)
}

data class HendelseIdEksistererAlleredeException(override val message: String) : RuntimeException(message)
data class IngenHendelseMedIdException(
val id: String,
override val message: String = "Fant ingen hendelse med id $id.",
override val cause: Throwable? = null
) : RuntimeException(message, cause)

data class IngenHendelseForPersonException(
override val message: String = "Fant ingen hendelse for personen.",
override val cause: Throwable
) : RuntimeException(message)
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import no.nav.pto.veilarbportefolje.ensligforsorger.EnsligeForsorgereService;
import no.nav.pto.veilarbportefolje.fargekategori.FargekategoriRepository;
import no.nav.pto.veilarbportefolje.fargekategori.FargekategoriService;
import no.nav.pto.veilarbportefolje.hendelsesfilter.HendelseRepository;
import no.nav.pto.veilarbportefolje.huskelapp.HuskelappRepository;
import no.nav.pto.veilarbportefolje.huskelapp.HuskelappService;
import no.nav.pto.veilarbportefolje.kodeverk.KodeverkClient;
Expand Down Expand Up @@ -173,7 +174,8 @@
ProfileringRepository.class,
ArbeidssoekerDataRepository.class,
TiltakshendelseRepository.class,
TiltakshendelseService.class
TiltakshendelseService.class,
HendelseRepository.class,
})
public class ApplicationConfigTest {

Expand Down
Loading

0 comments on commit d4e3cd2

Please sign in to comment.