/* * 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 . */ 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 { 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 { 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 { 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 { logger.error("Error while processing MtbFile", e) requestProcessor.processMtbFile(Mtb.builder().build()) return ResponseEntity.badRequest().build() } }