summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt52
-rw-r--r--src/main/resources/templates/statistics.html31
2 files changed, 75 insertions, 8 deletions
diff --git a/src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt b/src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt
index 1e56c28..a418772 100644
--- a/src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt
+++ b/src/main/kotlin/dev/dnpm/etl/processor/web/StatisticsRestController.kt
@@ -21,10 +21,12 @@ package dev.dnpm.etl.processor.web
import dev.dnpm.etl.processor.monitoring.RequestRepository
import dev.dnpm.etl.processor.monitoring.RequestStatus
+import dev.dnpm.etl.processor.monitoring.RequestType
import org.springframework.http.MediaType
import org.springframework.http.codec.ServerSentEvent
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
import reactor.core.publisher.Flux
import reactor.core.publisher.Sinks
@@ -41,8 +43,14 @@ class StatisticsRestController(
) {
@GetMapping(path = ["requeststates"])
- fun requestStates(): List<NameValue> {
- return requestRepository.countStates()
+ fun requestStates(@RequestParam(required = false, defaultValue = "false") delete: Boolean): List<NameValue> {
+ val states = if (delete) {
+ requestRepository.countDeleteStates()
+ } else {
+ requestRepository.countStates()
+ }
+
+ return states
.map {
val color = when (it.status) {
RequestStatus.ERROR -> "red"
@@ -56,9 +64,21 @@ class StatisticsRestController(
}
@GetMapping(path = ["requestslastmonth"])
- fun requestsLastMonth(): List<DateNameValues> {
+ fun requestsLastMonth(
+ @RequestParam(
+ required = false,
+ defaultValue = "false"
+ ) delete: Boolean
+ ): List<DateNameValues> {
+ val requestType = if (delete) {
+ RequestType.DELETE
+ } else {
+ RequestType.MTB_FILE
+ }
+
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("Europe/Berlin"))
val data = requestRepository.findAll()
+ .filter { it.type == requestType }
.filter { it.processedAt.isAfter(Instant.now().minus(30, ChronoUnit.DAYS)) }
.groupBy { formatter.format(it.processedAt) }
.map {
@@ -91,8 +111,14 @@ class StatisticsRestController(
}
@GetMapping(path = ["requestpatientstates"])
- fun requestPatientStates(): List<NameValue> {
- return requestRepository.findPatientUniqueStates().map {
+ fun requestPatientStates(@RequestParam(required = false, defaultValue = "false") delete: Boolean): List<NameValue> {
+ val states = if (delete) {
+ requestRepository.findPatientUniqueDeleteStates()
+ } else {
+ requestRepository.findPatientUniqueStates()
+ }
+
+ return states.map {
val color = when (it.status) {
RequestStatus.ERROR -> "red"
RequestStatus.WARNING -> "darkorange"
@@ -109,13 +135,23 @@ class StatisticsRestController(
Flux.fromIterable(
listOf(
ServerSentEvent.builder<Any>()
- .event("requeststates").id("none").data(this.requestStates())
+ .event("requeststates").id("none").data(this.requestStates(false))
+ .build(),
+ ServerSentEvent.builder<Any>()
+ .event("requestslastmonth").id("none").data(this.requestsLastMonth(false))
+ .build(),
+ ServerSentEvent.builder<Any>()
+ .event("requestpatientstates").id("none").data(this.requestPatientStates(false))
+ .build(),
+
+ ServerSentEvent.builder<Any>()
+ .event("deleterequeststates").id("none").data(this.requestStates(true))
.build(),
ServerSentEvent.builder<Any>()
- .event("requestslastmonth").id("none").data(this.requestsLastMonth())
+ .event("deleterequestslastmonth").id("none").data(this.requestsLastMonth(true))
.build(),
ServerSentEvent.builder<Any>()
- .event("requestpatientstates").id("none").data(this.requestPatientStates())
+ .event("deleterequestpatientstates").id("none").data(this.requestPatientStates(true))
.build()
)
)
diff --git a/src/main/resources/templates/statistics.html b/src/main/resources/templates/statistics.html
index 752b768..c98a973 100644
--- a/src/main/resources/templates/statistics.html
+++ b/src/main/resources/templates/statistics.html
@@ -9,13 +9,30 @@
<div th:replace="~{fragments.html :: nav}"></div>
<main>
<h1>Statistiken</h1>
+ <p>
+ Hier sehen Sie eine Übersicht über eingegangene Anfragen.
+ </p>
+ <h2>MTB-File-Anfragen</h2>
+ <p>
+ Anfragen zur Aktualisierung von Patientendaten durch Übermittlung eines MTB-Files.
+ </p>
<div>
<div id="piechart1" class="chart chart-50pc"></div>
<div id="piechart2" class="chart chart-50pc"></div>
</div>
<div id="barchart" class="chart"></div>
+ <h2>Löschanfragen</h2>
+ <p>
+ Anfragen zur Löschung von Patientendaten, wenn kein Consent vorliegt.
+ </p>
+ <div>
+ <div id="piechartdel1" class="chart chart-50pc"></div>
+ <div id="piechartdel2" class="chart chart-50pc"></div>
+ </div>
+ <div id="barchartdel" class="chart"></div>
+
</main>
<script th:src="@{/echarts.min.js}"></script>
<script th:src="@{/scripts.js}"></script>
@@ -25,6 +42,10 @@
drawPieChart('statistics/requestpatientstates', 'piechart2', 'Statusverteilung nach Patient');
drawBarChart('statistics/requestslastmonth', 'barchart', 'Anfragen der letzten 30 Tage');
+ drawPieChart('statistics/requeststates?delete=true', 'piechartdel1', 'Statusverteilung aller Anfragen');
+ drawPieChart('statistics/requestpatientstates?delete=true', 'piechartdel2', 'Statusverteilung nach Patient');
+ drawBarChart('statistics/requestslastmonth?delete=true', 'barchartdel', 'Anfragen der letzten 30 Tage');
+
const eventSource = new EventSource('statistics/events');
eventSource.addEventListener('requeststates', event => {
drawPieChart('statistics/requeststates', 'piechart1', 'Statusverteilung aller Anfragen', JSON.parse(event.data));
@@ -35,6 +56,16 @@
eventSource.addEventListener('requestslastmonth', event => {
drawBarChart('statistics/requestslastmonth', 'barchart', 'Anfragen des letzten Monats', JSON.parse(event.data));
});
+
+ eventSource.addEventListener('deleterequeststates', event => {
+ drawPieChart('statistics/requeststates?delete=true', 'piechartdel1', 'Statusverteilung aller Anfragen', JSON.parse(event.data));
+ });
+ eventSource.addEventListener('deleterequestpatientstates', event => {
+ drawPieChart('statistics/requestpatientstates?delete=true', 'piechartdel2', 'Statusverteilung nach Patient', JSON.parse(event.data));
+ });
+ eventSource.addEventListener('deleterequestslastmonth', event => {
+ drawBarChart('statistics/requestslastmonth?delete=true', 'barchartdel', 'Anfragen des letzten Monats', JSON.parse(event.data));
+ });
}
</script>
</body>