Adds backend endpoints and frontend edit page so pending orders can be updated or soft-cancelled without admin intervention. Co-authored-by: Cursor <cursoragent@cursor.com>
86 lines
3.5 KiB
Java
86 lines
3.5 KiB
Java
package se.bilhalsning.exception;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.http.HttpStatus;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.web.bind.MethodArgumentNotValidException;
|
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
|
import se.bilhalsning.dto.ErrorResponse;
|
|
|
|
@RestControllerAdvice
|
|
public class GlobalExceptionHandler {
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
|
|
|
|
@ExceptionHandler(InvalidCredentialsException.class)
|
|
public ResponseEntity<ErrorResponse> handleInvalidCredentials(InvalidCredentialsException ex) {
|
|
return ResponseEntity
|
|
.status(HttpStatus.UNAUTHORIZED)
|
|
.body(new ErrorResponse(ex.getMessage()));
|
|
}
|
|
|
|
@ExceptionHandler(PasswordResetTokenInvalidException.class)
|
|
public ResponseEntity<ErrorResponse> handlePasswordResetTokenInvalid(
|
|
PasswordResetTokenInvalidException ex) {
|
|
return ResponseEntity
|
|
.badRequest()
|
|
.body(new ErrorResponse(ex.getMessage()));
|
|
}
|
|
|
|
@ExceptionHandler(EmailAlreadyExistsException.class)
|
|
public ResponseEntity<ErrorResponse> handleEmailAlreadyExists(EmailAlreadyExistsException ex) {
|
|
return ResponseEntity
|
|
.status(HttpStatus.CONFLICT)
|
|
.body(new ErrorResponse("E-postadressen är redan registrerad"));
|
|
}
|
|
|
|
@ExceptionHandler(InvalidOrderStateException.class)
|
|
public ResponseEntity<ErrorResponse> handleInvalidOrderState(InvalidOrderStateException ex) {
|
|
return ResponseEntity
|
|
.status(HttpStatus.CONFLICT)
|
|
.body(new ErrorResponse(ex.getMessage()));
|
|
}
|
|
|
|
@ExceptionHandler(OrderNotFoundException.class)
|
|
public ResponseEntity<ErrorResponse> handleOrderNotFound(OrderNotFoundException ex) {
|
|
return ResponseEntity
|
|
.status(HttpStatus.NOT_FOUND)
|
|
.body(new ErrorResponse(ex.getMessage()));
|
|
}
|
|
|
|
@ExceptionHandler(VehicleNotFoundException.class)
|
|
public ResponseEntity<ErrorResponse> handleVehicleNotFound(VehicleNotFoundException ex) {
|
|
return ResponseEntity
|
|
.status(HttpStatus.NOT_FOUND)
|
|
.body(new ErrorResponse("Inget fordon hittades"));
|
|
}
|
|
|
|
@ExceptionHandler(VehicleLookupException.class)
|
|
public ResponseEntity<ErrorResponse> handleVehicleLookup(VehicleLookupException ex) {
|
|
log.error("Vehicle lookup failed", ex);
|
|
return ResponseEntity
|
|
.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
|
.body(new ErrorResponse("Ett internt fel uppstod"));
|
|
}
|
|
|
|
@ExceptionHandler(MethodArgumentNotValidException.class)
|
|
public ResponseEntity<ErrorResponse> handleValidation(MethodArgumentNotValidException ex) {
|
|
String message = ex.getBindingResult().getFieldErrors().stream()
|
|
.map(e -> e.getField() + ": " + e.getDefaultMessage())
|
|
.reduce((a, b) -> a + ", " + b)
|
|
.orElse("Ogiltig indata");
|
|
return ResponseEntity
|
|
.badRequest()
|
|
.body(new ErrorResponse(message));
|
|
}
|
|
|
|
@ExceptionHandler(Exception.class)
|
|
public ResponseEntity<ErrorResponse> handleGeneral(Exception ex) {
|
|
log.error("Unhandled exception", ex);
|
|
return ResponseEntity
|
|
.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
|
.body(new ErrorResponse("Ett internt fel uppstod"));
|
|
}
|
|
}
|