Skip to content

Commit

Permalink
[NOD-781] feat: refactored code and updated missing classes
Browse files Browse the repository at this point in the history
  • Loading branch information
andrea-deri committed Mar 28, 2024
1 parent bcb9795 commit 028899c
Show file tree
Hide file tree
Showing 17 changed files with 199 additions and 237 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import it.gov.pagopa.wispconverter.controller.model.AppInfoResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
Expand All @@ -17,6 +18,7 @@

@RestController
@Validated
@Tag(name = "Home", description = "Application info APIs")
public class HomeController {

@Value("${server.servlet.context-path}")
Expand Down Expand Up @@ -52,9 +54,6 @@ public RedirectView home() {
@Operation(summary = "Return OK if application is started", security = {@SecurityRequirement(name = "ApiKey")}, tags = {"Home"})
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "OK.", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = AppInfoResponse.class))),
//@ApiResponse(responseCode = "401", description = "Wrong or missing function key.", content = @Content(schema = @Schema())),
//@ApiResponse(responseCode = "403", description = "Forbidden.", content = @Content(schema = @Schema())),
//@ApiResponse(responseCode = "500", description = "Service unavailable.", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = ProblemJson.class)))}
})
@GetMapping("/info")
public AppInfoResponse healthCheck() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import it.gov.pagopa.wispconverter.service.ConverterService;
import it.gov.pagopa.wispconverter.service.model.ConversionResultDTO;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -23,33 +25,18 @@
@RequestMapping("/redirect")
@Validated
@RequiredArgsConstructor
@Tag(name = "Redirect", description = "Conversion and redirection APIs")
public class RedirectController {

private final ConverterService converterService;

/*
public static ResponseEntity<Object> generateConversionResponse(ConversionResult conversionResult) {
ResponseEntity<Object> result;
if (conversionResult.isSuccess()) {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setLocation(conversionResult.getUri());
result = new ResponseEntity<>(httpHeaders, HttpStatus.FOUND);
} else {
result = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(conversionResult.getErrorPage());
}
return result;
}
*/

@Operation(summary = "", description = "", security = {@SecurityRequirement(name = "ApiKey")}, tags = {"Home"})
@Operation(summary = "", description = "", security = {@SecurityRequirement(name = "ApiKey")}, tags = {"Redirect"})
@ApiResponses(value = {
@ApiResponse(responseCode = "302", description = "Redirect to Checkout service.", content = @Content(schema = @Schema())),
//@ApiResponse(responseCode = "401", description = "Wrong or missing function key.", content = @Content(schema = @Schema())),
//@ApiResponse(responseCode = "403", description = "Forbidden.", content = @Content(schema = @Schema())),
//@ApiResponse(responseCode = "500", description = "Internal server error.", content = @Content(mediaType = MediaType.TEXT_HTML_VALUE))
@ApiResponse(responseCode = "302", description = "Redirect to Checkout service.", content = @Content(schema = @Schema()))
})
@GetMapping
public void redirect(@Parameter(description = "", example = "identificativoIntermediarioPA_sessionId") @RequestParam("sessionId") String sessionId,
public void redirect(@Parameter(description = "", example = "identificativoIntermediarioPA_sessionId")
@NotBlank(message = "{redirect.session-id.not-blank}") @RequestParam("sessionId") String sessionId,
HttpServletResponse response) throws IOException {
ConversionResultDTO conversionResultDTO = converterService.convert(sessionId);
response.sendRedirect(conversionResultDTO.getUri());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,127 +37,101 @@ public class ErrorHandler extends ResponseEntityExceptionHandler {

private final AppErrorUtil appErrorUtil;

@ApiResponses(
value = {
@ApiResponse(
responseCode = "500",
description = "Internal Server Error",
content = {
@Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(implementation = ApiErrorResponse.class),
examples = {
@ExampleObject(
"{\n"
+ " \"errorId\": \"68ce8c6a-6d53-486c-97fe-79430d24fb7d\",\n"
+ " \"timestamp\": \"2023-10-09T08:01:39.421224Z\",\n"
+ " \"httpStatusCode\": 500,\n"
+ " \"httpStatusDescription\": \"Internal Server Error\",\n"
+ " \"appErrorCode\": \"APP-0500\",\n"
+ " \"message\": \"An unexpected error has occurred. Please contact"
+ " support\"\n"
+ "}")
})
}),
@ApiResponse(
responseCode = "400",
description = "Bad Request",
content = {
@Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(implementation = ApiErrorResponse.class),
examples = {
@ExampleObject(
"{\n"
+ " \"timestamp\": \"2023-10-09T07:53:14.077792Z\",\n"
+ " \"httpStatusCode\": 400,\n"
+ " \"httpStatusDescription\": \"Bad Request\",\n"
+ " \"appErrorCode\": \"APP-0400\",\n"
+ " \"message\": \"Bad request\",\n"
+ " \"errors\": [\n"
+ " {\n"
+ " \"message\": \"Field error in ...\"\n"
+ " }\n"
+ " ]\n"
+ "}")
})
}),
@ApiResponse(
responseCode = "404",
description = "Not found",
content = {
@Content(
mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(implementation = ApiErrorResponse.class),
examples = {
@ExampleObject(
"{\n"
+ " \"timestamp\": \"2023-10-09T07:53:43.367312Z\",\n"
+ " \"httpStatusCode\": 404,\n"
+ " \"httpStatusDescription\": \"Not Found\",\n"
+ " \"appErrorCode\": \"APP-0404\",\n"
+ " \"message\": \"Request POST /api/v1/..... not found\"\n"
+ "}")
})
})
@ApiResponses(value = {
@ApiResponse(responseCode = "500", description = "Internal Server Error", content = {
@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = ApiErrorResponse.class), examples = {@ExampleObject(
"""
{
"errorId": "68ce8c6a-6d53-486c-97fe-79430d24fb7d",
"timestamp": "2023-10-09T08:01:39.421224Z",
"httpStatusCode": 500,
"httpStatusDescription": "Internal Server Error",
"appErrorCode": "WIC-0500",
"message": "An unexpected error has occurred. Please contact support"
}
"""
)})
}),
@ApiResponse(responseCode = "400", description = "Bad Request", content = {
@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = ApiErrorResponse.class), examples = {@ExampleObject(
"""
{
"timestamp": "2023-10-09T07:53:14.077792Z",
"httpStatusCode": 400,
"httpStatusDescription": "Bad Request",
"appErrorCode": "WIC-0400",
"message": "Bad request",
"errors": [
{
"message": "Field error in ..."
}
]
}
"""
)})
}),
@ApiResponse(responseCode = "404", description = "Not found", content = {
@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = ApiErrorResponse.class), examples = {@ExampleObject(
"""
{
"timestamp": "2023-10-09T07:53:43.367312Z",
"httpStatusCode": 404,
"httpStatusDescription": "Not Found",
"appErrorCode": "WIC-0404",
"message": "Request POST /api/v1/..... not found"
}
"""
)})
})
})
@ExceptionHandler({AppException.class, AppClientException.class})
public ResponseEntity<ApiErrorResponse> handleAppException(AppException appEx) {
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair =
appErrorUtil.buildApiErrorResponse(appEx, null, null);
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair = appErrorUtil.buildApiErrorResponse(appEx, null, null);
return ResponseEntity.status(httpStatusApiErrorResponsePair.getLeft())
.body(httpStatusApiErrorResponsePair.getRight());
}

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
List<ApiErrorResponse.ErrorMessage> errorMessages =
ex.getBindingResult().getAllErrors().stream()
.map(oe -> ApiErrorResponse.ErrorMessage.builder().message(oe.toString()).build())
.collect(Collectors.toList());
List<ApiErrorResponse.ErrorMessage> errorMessages = ex.getBindingResult().getAllErrors().stream()
.map(oe -> ApiErrorResponse.ErrorMessage.builder().message(oe.toString()).build())
.collect(Collectors.toList());
AppException appEx = new AppException(ex, AppErrorCodeMessageEnum.BAD_REQUEST);
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair =
appErrorUtil.buildApiErrorResponse(appEx, null, errorMessages);
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair = appErrorUtil.buildApiErrorResponse(appEx, null, errorMessages);
return ResponseEntity.status(httpStatusApiErrorResponsePair.getLeft())
.body(httpStatusApiErrorResponsePair.getRight());
}

@ExceptionHandler(Exception.class)
public ResponseEntity<ApiErrorResponse> handleExceptiond(Exception ex, WebRequest request) {
log.error(String.format("ExceptionHandler: %s", ex.getMessage()), ex);
public ResponseEntity<ApiErrorResponse> handleGenericException(Exception ex, WebRequest request) {
String errorId = UUID.randomUUID().toString();
log.error(String.format("ExceptionHandler: ErrorId=[%s] %s", errorId, ex.getMessage()), ex);

AppException appEx = new AppException(ex, AppErrorCodeMessageEnum.ERROR);
// errorId viene usato solo per i casi di eccezioni non gestite
String errorId = UUID.randomUUID().toString();
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair =
appErrorUtil.buildApiErrorResponse(appEx, errorId, null);
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair = appErrorUtil.buildApiErrorResponse(appEx, errorId, null);
return ResponseEntity.status(httpStatusApiErrorResponsePair.getLeft())
.body(httpStatusApiErrorResponsePair.getRight());
}

@ExceptionHandler(ConstraintViolationException.class)
public final ResponseEntity<ApiErrorResponse> handleConstraintViolation(
ConstraintViolationException ex, WebRequest request) {
List<ApiErrorResponse.ErrorMessage> errorMessages =
ex.getConstraintViolations().stream()
.map(oe -> ApiErrorResponse.ErrorMessage.builder().message(oe.getMessage()).build())
.collect(Collectors.toList());
public final ResponseEntity<ApiErrorResponse> handleConstraintViolation(ConstraintViolationException ex, WebRequest request) {
List<ApiErrorResponse.ErrorMessage> errorMessages = ex.getConstraintViolations().stream()
.map(oe -> ApiErrorResponse.ErrorMessage.builder().message(oe.getMessage()).build())
.collect(Collectors.toList());
AppException appEx = new AppException(ex, AppErrorCodeMessageEnum.BAD_REQUEST);
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair =
appErrorUtil.buildApiErrorResponse(appEx, null, errorMessages);
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair = appErrorUtil.buildApiErrorResponse(appEx, null, errorMessages);
return ResponseEntity.status(httpStatusApiErrorResponsePair.getLeft())
.body(httpStatusApiErrorResponsePair.getRight());
}

@Override
protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
List<ApiErrorResponse.ErrorMessage> errorMessages =
Stream.of(ex.getCause().getMessage())
.map(oe -> ApiErrorResponse.ErrorMessage.builder().message(oe).build())
.collect(Collectors.toList());
List<ApiErrorResponse.ErrorMessage> errorMessages = Stream.of(ex.getCause().getMessage())
.map(oe -> ApiErrorResponse.ErrorMessage.builder().message(oe).build())
.collect(Collectors.toList());
AppException appEx = new AppException(ex, AppErrorCodeMessageEnum.BAD_REQUEST);
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair =
appErrorUtil.buildApiErrorResponse(appEx, null, errorMessages);
Pair<HttpStatus, ApiErrorResponse> httpStatusApiErrorResponsePair = appErrorUtil.buildApiErrorResponse(appEx, null, errorMessages);
return ResponseEntity.status(httpStatusApiErrorResponsePair.getLeft())
.body(httpStatusApiErrorResponsePair.getRight());
}
Expand Down
Loading

0 comments on commit 028899c

Please sign in to comment.