summaryrefslogtreecommitdiff
path: root/src/main/kotlin/dev/dnpm/etl/processor/input/MtbFileRestController.kt
blob: 47f0766da8aa8270596d659417510d1e49ede859 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
 * This file is part of ETL-Processor
 *
 * Copyright (c) 2023       Comprehensive Cancer Center Mainfranken
 * Copyright (c) 2025-2026  Paul-Christian Volkmer, Datenintegrationszentrum Philipps-Universität Marburg and Contributors
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package dev.dnpm.etl.processor.input

import dev.dnpm.etl.processor.CustomMediaType
import dev.dnpm.etl.processor.PatientId
import dev.dnpm.etl.processor.consent.ConsentEvaluator
import dev.dnpm.etl.processor.consent.TtpConsentStatus
import dev.dnpm.etl.processor.services.RequestProcessor
import dev.pcvolkmer.mv64e.mtb.Mtb
import org.slf4j.LoggerFactory
import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity
import org.springframework.http.converter.HttpMessageNotReadableException
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping(path = ["mtbfile", "mtb", "api/mtbfile", "api/mtb"])
class MtbFileRestController(
    private val requestProcessor: RequestProcessor
) {
    private val logger = LoggerFactory.getLogger(MtbFileRestController::class.java)

    @GetMapping
    fun info(): ResponseEntity<String> {
        return ResponseEntity.ok("Test")
    }

    @PostMapping(
        path = ["", "etl/patient-record"],
        consumes =
            [
                MediaType.APPLICATION_JSON_VALUE,
                CustomMediaType.APPLICATION_VND_DNPM_V2_MTB_JSON_VALUE,
            ],
    )
    fun mtbFile(@RequestBody mtbFile: Mtb): ResponseEntity<Unit> {
        logger.debug("Accepted MTB File (DNPM V2) for processing")
        if (requestProcessor.processMtbFile(mtbFile)) {
            return ResponseEntity.accepted().build()
        }
        return ResponseEntity.badRequest().build()
    }

    @DeleteMapping(
        path = ["{patientId}", "etl/patient-record/{patientId}", "etl/patient/{patientId}"]
    )
    fun deleteData(@PathVariable patientId: String): ResponseEntity<Unit> {
        logger.debug("Accepted patient ID to process deletion")
        requestProcessor.processDeletion(PatientId(patientId), TtpConsentStatus.UNKNOWN_CHECK_FILE)
        return ResponseEntity.accepted().build()
    }
}

@RestControllerAdvice(assignableTypes = [MtbFileRestController::class])
class MtbFileRestControllerAdvice(
    private val requestProcessor: RequestProcessor
) {

    private val logger = LoggerFactory.getLogger(MtbFileRestControllerAdvice::class.java)

    @ExceptionHandler(HttpMessageNotReadableException::class)
    fun handleMessageNotReadableException(e: Exception): ResponseEntity<Unit> {
        logger.error("Error while processing MtbFile", e)
        requestProcessor.processMtbFile(Mtb.builder().build())
        return ResponseEntity.badRequest().build()
    }

}