From 1a0011765fa2d34f7d0075f463beb9e614ec8812 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Tue, 10 Mar 2026 09:01:58 +0100 Subject: feat: request update audit (#258) This adds the date and username when a request gets updated. If the request gets updated by an async Kafka response, "SYSTEM" will be used as username.--- .../dnpm/etl/processor/web/HomeControllerTest.kt | 2 +- .../dnpm/etl/processor/config/AppConfiguration.kt | 5 +++-- .../dnpm/etl/processor/config/AuditConfiguration.kt | 21 +++++++++++++++++++++ .../dev/dnpm/etl/processor/monitoring/Request.kt | 7 ++++++- .../db/migration/mariadb/V0_15_0_2__UpdatedAtBy.sql | 2 ++ .../migration/postgresql/V0_15_0_2__UpdatedAtBy.sql | 2 ++ src/main/resources/templates/index.html | 5 +++++ src/main/resources/templates/report.html | 5 +++++ 8 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/dev/dnpm/etl/processor/config/AuditConfiguration.kt create mode 100644 src/main/resources/db/migration/mariadb/V0_15_0_2__UpdatedAtBy.sql create mode 100644 src/main/resources/db/migration/postgresql/V0_15_0_2__UpdatedAtBy.sql (limited to 'src') diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/web/HomeControllerTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/web/HomeControllerTest.kt index 2a8ce81..fdc2066 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/web/HomeControllerTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/web/HomeControllerTest.kt @@ -166,7 +166,7 @@ class HomeControllerTest { RequestStatus.SUCCESS, Tan.empty(), Instant.now(), - Report("Test"), + report = Report("Test"), ) ) ) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt index cb04db3..2d520d3 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt @@ -32,8 +32,6 @@ import dev.dnpm.etl.processor.security.TokenService import dev.dnpm.etl.processor.services.ConsentProcessor import dev.dnpm.etl.processor.services.Transformation import dev.dnpm.etl.processor.services.TransformationService -import kotlin.time.Duration.Companion.seconds -import kotlin.time.toJavaDuration import org.apache.cxf.jaxws.JaxWsProxyFactoryBean import org.slf4j.LoggerFactory import org.springframework.boot.autoconfigure.condition.AnyNestedCondition @@ -46,6 +44,7 @@ import org.springframework.context.annotation.Conditional import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.ConfigurationCondition import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration +import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing import org.springframework.http.converter.StringHttpMessageConverter import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter import org.springframework.retry.RetryCallback @@ -60,6 +59,8 @@ import org.springframework.security.provisioning.InMemoryUserDetailsManager import org.springframework.web.client.HttpClientErrorException import org.springframework.web.client.RestTemplate import reactor.core.publisher.Sinks +import kotlin.time.Duration.Companion.seconds +import kotlin.time.toJavaDuration @Configuration @EnableConfigurationProperties( diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AuditConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AuditConfiguration.kt new file mode 100644 index 0000000..45763ee --- /dev/null +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AuditConfiguration.kt @@ -0,0 +1,21 @@ +package dev.dnpm.etl.processor.config + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.data.domain.AuditorAware +import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing +import org.springframework.security.core.context.SecurityContextHolder +import java.util.* + +@Configuration +@EnableJdbcAuditing +class AuditConfiguration { + + @Bean + fun audit(): AuditorAware { + return AuditorAware { + Optional.of(SecurityContextHolder.getContext().authentication?.name ?: "SYSTEM") + } + } + +} diff --git a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt index 4ed071d..5dbba2b 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/monitoring/Request.kt @@ -20,10 +20,13 @@ package dev.dnpm.etl.processor.monitoring import dev.dnpm.etl.processor.* +import org.springframework.data.annotation.CreatedDate import java.time.Instant import java.time.temporal.ChronoUnit import java.util.* import org.springframework.data.annotation.Id +import org.springframework.data.annotation.LastModifiedBy +import org.springframework.data.annotation.LastModifiedDate import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.data.jdbc.repository.query.Query @@ -44,7 +47,9 @@ data class Request( @Column("submission_type") val submissionType: SubmissionType, var status: RequestStatus, @Column("tan") val tan: Tan = Tan.empty(), - var processedAt: Instant = Instant.now(), + @CreatedDate var processedAt: Instant = Instant.now(), + @LastModifiedDate var updatedAt: Instant? = null, + @LastModifiedBy var updatedBy: String? = null, @Embedded.Nullable var report: Report? = null, @Column("submission_accepted") var submissionAccepted: Boolean = false, ) { diff --git a/src/main/resources/db/migration/mariadb/V0_15_0_2__UpdatedAtBy.sql b/src/main/resources/db/migration/mariadb/V0_15_0_2__UpdatedAtBy.sql new file mode 100644 index 0000000..2005c4f --- /dev/null +++ b/src/main/resources/db/migration/mariadb/V0_15_0_2__UpdatedAtBy.sql @@ -0,0 +1,2 @@ +ALTER TABLE request ADD COLUMN updated_at datetime; +ALTER TABLE request ADD COLUMN updated_by varchar(255); \ No newline at end of file diff --git a/src/main/resources/db/migration/postgresql/V0_15_0_2__UpdatedAtBy.sql b/src/main/resources/db/migration/postgresql/V0_15_0_2__UpdatedAtBy.sql new file mode 100644 index 0000000..ed5c807 --- /dev/null +++ b/src/main/resources/db/migration/postgresql/V0_15_0_2__UpdatedAtBy.sql @@ -0,0 +1,2 @@ +ALTER TABLE request ADD COLUMN updated_at timestamp with time zone; +ALTER TABLE request ADD COLUMN updated_by varchar(255); \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index cea3f73..da85025 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -75,6 +75,11 @@ ([[ ${request.submissionType} ]]) +
Letzte Aktualisierung
+
+ + durch [[ ${request.updatedBy} ]] +
Patienten-Pseudonym
[[ ${request.patientPseudonym} ]] diff --git a/src/main/resources/templates/report.html b/src/main/resources/templates/report.html index 1e2d97c..cd26672 100644 --- a/src/main/resources/templates/report.html +++ b/src/main/resources/templates/report.html @@ -41,6 +41,11 @@ ([[ ${request.submissionType} ]])
+
Letzte Aktualisierung
+
+ + durch [[ ${request.updatedBy} ]] +
Patienten-Pseudonym
[[ ${request.patientPseudonym} ]] -- cgit v1.2.3