From a9ec7510779cc425201220e49181126bce98f8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Andreas=20S=C3=B8rs=C3=A6ther?= Date: Thu, 12 Sep 2024 11:34:36 +0200 Subject: [PATCH] =?UTF-8?q?MVP=20migrering=20av=20timestamps=20til=20?= =?UTF-8?q?=C3=A5=20ha=20tidssone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For å redusere forvirring med tidspunkter når vi gjør databaseuttrekk så ønsker vi å konvertere en del "timestamp without time zone" til timestamps med tidssone. Dette gjøres på litt forskjellige måter avhengig av hvordan jpa-entitene behandler feltene. * for instants: bruk "at time zone 'UTC'" * for localdatetime: bruk "at time zone 'Europe/Oslo'" Instants som lagres i en timestamp er lagret i UTC, men ser ut som en "localdatetime" når man gjør uttrekk. LocalDateTimes som lagres i en timestamp ser riktige ut, og det er strengt tatt ikke nødvendig å migrere disse bortsett fra at tidspunktet blir mer nøyaktig og at vi fjerner all tvil om når tidspunktet gjelder for. --- .../tiltakrefusjon/hendelseslogg/Hendelseslogg.kt | 10 +++++++--- .../tiltakrefusjon/hendelseslogg/HendelsesloggDTO.kt | 3 ++- .../migration/V59__tidssone_for_utbetalt_tidspunkt.sql | 4 ++++ .../V60__tidssone_for_hendelselogg_tidspunkt.sql | 5 +++++ 4 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/db/migration/V59__tidssone_for_utbetalt_tidspunkt.sql create mode 100644 src/main/resources/db/migration/V60__tidssone_for_hendelselogg_tidspunkt.sql diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/hendelseslogg/Hendelseslogg.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/hendelseslogg/Hendelseslogg.kt index 514c6404..ec862387 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/hendelseslogg/Hendelseslogg.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/hendelseslogg/Hendelseslogg.kt @@ -1,12 +1,16 @@ package no.nav.arbeidsgiver.tiltakrefusjon.hendelseslogg -import jakarta.persistence.* +import jakarta.persistence.Convert +import jakarta.persistence.Entity +import jakarta.persistence.EnumType +import jakarta.persistence.Enumerated +import jakarta.persistence.Id import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.BrukerRolle import no.nav.arbeidsgiver.tiltakrefusjon.utils.Now import no.nav.arbeidsgiver.tiltakrefusjon.utils.ulid import org.hibernate.annotations.JdbcTypeCode import org.hibernate.type.SqlTypes -import java.time.LocalDateTime +import java.time.Instant @Entity data class Hendelseslogg( @@ -23,5 +27,5 @@ data class Hendelseslogg( ) { @Id val id: String = ulid() - val tidspunkt: LocalDateTime = Now.localDateTime() + val tidspunkt: Instant = Now.instant() } diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/hendelseslogg/HendelsesloggDTO.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/hendelseslogg/HendelsesloggDTO.kt index bc4bb20a..18fac519 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/hendelseslogg/HendelsesloggDTO.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/hendelseslogg/HendelsesloggDTO.kt @@ -3,6 +3,7 @@ package no.nav.arbeidsgiver.tiltakrefusjon.hendelseslogg import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.BrukerRolle import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.erGyldigFnr import java.time.LocalDateTime +import java.time.ZoneId data class HendelsesloggDTO( val refusjonId: String, @@ -18,7 +19,7 @@ data class HendelsesloggDTO( utførtAv = utførtAv(hendelseslogg), event = hendelseslogg.event, metadata = hendelseslogg.metadata, - tidspunkt = hendelseslogg.tidspunkt, + tidspunkt = LocalDateTime.ofInstant(hendelseslogg.tidspunkt, ZoneId.of("Europe/Oslo")), ) } diff --git a/src/main/resources/db/migration/V59__tidssone_for_utbetalt_tidspunkt.sql b/src/main/resources/db/migration/V59__tidssone_for_utbetalt_tidspunkt.sql new file mode 100644 index 00000000..715edd06 --- /dev/null +++ b/src/main/resources/db/migration/V59__tidssone_for_utbetalt_tidspunkt.sql @@ -0,0 +1,4 @@ +-- godkjent_av_arbeidsgiver-feltet har ikke tidssone i databasen, men er en instant i jpa-entiteten. +-- Instants er tidspunkter med tidssoner, så kolonnen burde også ha tidssone. +alter table refusjon alter column utbetalt_tidspunkt type timestamp with time zone + using utbetalt_tidspunkt at time zone 'UTC'; diff --git a/src/main/resources/db/migration/V60__tidssone_for_hendelselogg_tidspunkt.sql b/src/main/resources/db/migration/V60__tidssone_for_hendelselogg_tidspunkt.sql new file mode 100644 index 00000000..638c189c --- /dev/null +++ b/src/main/resources/db/migration/V60__tidssone_for_hendelselogg_tidspunkt.sql @@ -0,0 +1,5 @@ +-- tidspunkt-feltet har ikke tidssone i databasen, og er en "localdatetime" i jpa-entiteten. +-- For å få tidspunktene til å bli riktige MED tidssone må vi derfor bruke "at time zone" med +-- europe/oslo i stedet for utc, slik vi gjorde med feltene hvor jpa-entiteten bruker instant. +alter table hendelseslogg alter column tidspunkt type timestamp with time zone + using tidspunkt at time zone 'Europe/Oslo';