/* * Copyright (C) 2008-2023, Juick * * 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 <http://www.gnu.org/licenses/>. */ package com.juick.www.api; import io.swagger.v3.oas.annotations.Hidden; import jakarta.validation.ConstraintViolationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.HttpMediaTypeNotAcceptableException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import java.io.IOException; import java.net.URI; /** * Created by vitalyster on 25.07.2016. */ @ControllerAdvice @RestController public class Index { private static final Logger logger = LoggerFactory.getLogger("API"); @Hidden @RequestMapping(value = { "/api/", "/ws/" }, method = RequestMethod.GET) public ResponseEntity<Void> description() { URI redirectUri = ServletUriComponentsBuilder.fromCurrentRequestUri().replacePath("/api/swagger-ui/index.html").build().toUri(); return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY).location(redirectUri).build(); } @ExceptionHandler(HttpMediaTypeNotAcceptableException.class) public ResponseEntity<String> invalidMediaType(final HttpMediaTypeNotAcceptableException exception, final NativeWebRequest request) { logger.info("Media type not resolved ({}) for url: {}", request.getHeaderValues("Accept"), ServletUriComponentsBuilder.fromCurrentRequestUri().build().toUriString()); return ResponseEntity.badRequest().body("Invalid media type"); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity<String> badRequest(final ConstraintViolationException exception) { return ResponseEntity.badRequest().body(exception.getMessage()); } @ExceptionHandler(IOException.class) public ResponseEntity<String> handleAbortedConnection(final IOException ex) { // avoids compile/runtime dependency by using class name if (ex.getClass().getName().equals("org.apache.catalina.connector.ClientAbortException")) { return null; } // log and return error page for any other IOExceptions if (logger.isWarnEnabled()) { logger.warn("IO Error", ex); } return ResponseEntity.badRequest().body(ex.getMessage()); } }