From 28be8d5d90c676999f79560d1f9ed5c15ece0a62 Mon Sep 17 00:00:00 2001
From: Martin Vogel <martin.vogel@sinc.de>
Date: Wed, 8 Jun 2022 12:25:08 +0200
Subject: [PATCH] #414 Add custom problems to wrap exceptions

---
 .../api/problems/DecryptionProblem.java       | 19 +++++
 .../api/problems/EncryptionProblem.java       | 19 +++++
 .../api/problems/FitConnectProblem.java       | 73 +++++++++++++++++++
 .../api/schema/FitConnectSchemaScopes.java    | 27 +++++++
 4 files changed, 138 insertions(+)
 create mode 100644 api/src/main/java/fitconnect/api/problems/DecryptionProblem.java
 create mode 100644 api/src/main/java/fitconnect/api/problems/EncryptionProblem.java
 create mode 100644 api/src/main/java/fitconnect/api/problems/FitConnectProblem.java
 create mode 100644 api/src/main/java/fitconnect/api/schema/FitConnectSchemaScopes.java

diff --git a/api/src/main/java/fitconnect/api/problems/DecryptionProblem.java b/api/src/main/java/fitconnect/api/problems/DecryptionProblem.java
new file mode 100644
index 000000000..44dd6769a
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/problems/DecryptionProblem.java
@@ -0,0 +1,19 @@
+package fitconnect.api.problems;
+
+import org.zalando.problem.Status;
+
+public class DecryptionProblem extends FitConnectProblem {
+
+    private static final long serialVersionUID = 1L;
+
+    public DecryptionProblem(String issue) {
+        super(
+                makeProblemURI("invalid-jwe-content"),
+                "Invalid JWE Content",
+                Status.BAD_REQUEST,
+                "There was a problem parsing the JWE",
+                null,
+                issue
+        );
+    }
+}
diff --git a/api/src/main/java/fitconnect/api/problems/EncryptionProblem.java b/api/src/main/java/fitconnect/api/problems/EncryptionProblem.java
new file mode 100644
index 000000000..044001728
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/problems/EncryptionProblem.java
@@ -0,0 +1,19 @@
+package fitconnect.api.problems;
+
+import org.zalando.problem.Status;
+
+public class EncryptionProblem extends FitConnectProblem {
+
+    private static final long serialVersionUID = 1L;
+
+    public EncryptionProblem(String issue) {
+        super(
+                makeProblemURI("invalid-jwe-content"),
+                "Invalid JWE Content",
+                Status.BAD_REQUEST,
+                "There was a problem parsing the JWE",
+                null,
+                issue
+        );
+    }
+}
diff --git a/api/src/main/java/fitconnect/api/problems/FitConnectProblem.java b/api/src/main/java/fitconnect/api/problems/FitConnectProblem.java
new file mode 100644
index 000000000..20d3fcacf
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/problems/FitConnectProblem.java
@@ -0,0 +1,73 @@
+package fitconnect.api.problems;
+
+import fitconnect.api.schema.FitConnectSchemaScopes;
+import org.zalando.problem.StatusType;
+import org.zalando.problem.ThrowableProblem;
+
+import java.net.URI;
+import java.util.Collections;
+import java.util.Map;
+
+public class FitConnectProblem extends ThrowableProblem {
+
+    private static final long serialVersionUID = 1L;
+
+    private final URI type;
+
+    private final String title;
+
+    private final StatusType status;
+
+    private final String detail;
+
+    private final URI instance;
+
+    private final String issue;
+
+    protected FitConnectProblem(URI type, String title, StatusType status) {
+        this(type, title, status, null, null, null);
+    }
+
+    protected FitConnectProblem(URI type, String title, StatusType status, String detail, URI instance, String issue) {
+        this.type = type;
+        this.title = title;
+        this.status = status;
+        this.detail = detail;
+        this.instance = instance;
+        this.issue = issue;
+    }
+
+    public static URI makeProblemURI(String problemName) {
+        return URI.create(FitConnectSchemaScopes.PROBLEMS_BASE_URI + problemName);
+    }
+
+    @Override
+    public URI getType() {
+        return type;
+    }
+
+    @Override
+    public String getTitle() {
+        return title;
+    }
+
+    @Override
+    public StatusType getStatus() {
+        return status;
+    }
+
+    @Override
+    public String getDetail() {
+        return detail;
+    }
+
+    @Override
+    public URI getInstance() {
+        return instance;
+    }
+
+    @Override
+    public Map<String, Object> getParameters() {
+        return issue == null ? Collections.emptyMap() : Map.of("issue", issue);
+    }
+}
diff --git a/api/src/main/java/fitconnect/api/schema/FitConnectSchemaScopes.java b/api/src/main/java/fitconnect/api/schema/FitConnectSchemaScopes.java
new file mode 100644
index 000000000..0fcf4379c
--- /dev/null
+++ b/api/src/main/java/fitconnect/api/schema/FitConnectSchemaScopes.java
@@ -0,0 +1,27 @@
+package fitconnect.api.schema;
+
+public final class FitConnectSchemaScopes {
+
+    // Schema-Basis-URI für alle Services
+    private static final String BASE_URI = "https://schema.fitko.de/fit-connect";
+
+    // Events sind nicht API-spezifisch
+    public static final String EVENTS_BASE_URI = BASE_URI + "/events/";
+
+    // API-spezifische Schema-Basis-URI
+    private static final String API_BASE_URI = BASE_URI + "/submission-api";
+
+    // Callbacks sind API-spezifisch
+    public static final String CALLBACKS_BASE_URI = API_BASE_URI + "/callbacks/";
+
+    // Problems sind API-spezifisch
+    public static final String PROBLEMS_BASE_URI = API_BASE_URI + "/problems/";
+
+    // API-spezifische Schema-Basis-URI
+    private static final String SET_BASE_URI = BASE_URI + "/set-payload";
+
+    // static class only for constants
+    private FitConnectSchemaScopes() {
+    }
+}
+
-- 
GitLab