diff --git a/src/main/java/com/ysoft/geecon/error/ExceptionMappers.java b/src/main/java/com/ysoft/geecon/error/ExceptionMappers.java new file mode 100644 index 0000000..91e6b68 --- /dev/null +++ b/src/main/java/com/ysoft/geecon/error/ExceptionMappers.java @@ -0,0 +1,27 @@ +package com.ysoft.geecon.error; + +import io.quarkus.qute.CheckedTemplate; +import io.quarkus.qute.TemplateInstance; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.jboss.resteasy.reactive.server.ServerExceptionMapper; + +class ExceptionMappers { + @ServerExceptionMapper + @Produces(MediaType.APPLICATION_JSON) + public Response mapJson(OAuthException exception) { + return Response.status(Response.Status.BAD_REQUEST).entity(exception.getResponse()).build(); + } + + @ServerExceptionMapper + @Produces(MediaType.APPLICATION_JSON) + public Response mapHtml(OAuthException exception) { + return Response.status(Response.Status.BAD_REQUEST).entity(Templates.error(exception.getResponse())).build(); + } + + @CheckedTemplate + public static class Templates { + public static native TemplateInstance error(OAuthException.ErrorResponse response); + } +} \ No newline at end of file diff --git a/src/main/java/com/ysoft/geecon/error/OAuthException.java b/src/main/java/com/ysoft/geecon/error/OAuthException.java index 7e5779d..ed511a3 100644 --- a/src/main/java/com/ysoft/geecon/error/OAuthException.java +++ b/src/main/java/com/ysoft/geecon/error/OAuthException.java @@ -1,8 +1,30 @@ package com.ysoft.geecon.error; +import com.fasterxml.jackson.annotation.JsonProperty; + public class OAuthException extends RuntimeException { + private final ErrorResponse response; + // https://www.ietf.org/archive/id/draft-ietf-oauth-v2-1-09.html#name-error-response-2 + public OAuthException(ErrorResponse response) { + super("OAuth error: " + response.error() + " " + response.description()); + this.response = response; + } + + public OAuthException(String error, String description) { + this(new ErrorResponse(error, description)); + } + + @Deprecated public OAuthException(String message) { - super(message); + this(message, message); + } + + public ErrorResponse getResponse() { + return response; + } + + public record ErrorResponse(@JsonProperty("error") String error, + @JsonProperty("error_description") String description) { } } diff --git a/src/main/resources/templates/ExceptionMappers/error.html b/src/main/resources/templates/ExceptionMappers/error.html new file mode 100644 index 0000000..6d4494e --- /dev/null +++ b/src/main/resources/templates/ExceptionMappers/error.html @@ -0,0 +1,76 @@ + + +
+ + +