diff --git a/dialogflow-fun-api/pom.xml b/dialogflow-fun-api/pom.xml
index eefe0d4..b3d36df 100644
--- a/dialogflow-fun-api/pom.xml
+++ b/dialogflow-fun-api/pom.xml
@@ -45,6 +45,11 @@
javax.json
1.1.4
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/DialogflowFunApiApplication.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/DialogflowFunApiApplication.java
index f6f7c2e..fe65739 100644
--- a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/DialogflowFunApiApplication.java
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/DialogflowFunApiApplication.java
@@ -1,12 +1,15 @@
package fr.lengrand.dialogflowfunapi;
import fr.lengrand.dialogflowfunapi.openbankproject.auth.Auth;
+import fr.lengrand.dialogflowfunapi.openbankproject.transactions.TransactionsHandler;
+import fr.lengrand.dialogflowfunapi.openbankproject.transactions.data.Transactions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.PostConstruct;
import java.io.IOException;
@SpringBootApplication
@@ -16,10 +19,22 @@ public class DialogflowFunApiApplication {
@Autowired
private Auth auth;
+ @Autowired
+ private TransactionsHandler transactionsHandler;
+
public static void main(String[] args) {
SpringApplication.run(DialogflowFunApiApplication.class, args);
}
+ @PostConstruct
+ private void init() {
+ try {
+ auth.authenticate();
+ } catch (IOException | InterruptedException e) {
+ System.out.println("Error while authenticating!"); // TODO : Use a logger
+ }
+ }
+
@GetMapping("/")
public String hello() {
return "hello world!";
@@ -28,7 +43,12 @@ public class DialogflowFunApiApplication {
@GetMapping("/auth")
public String auth() throws IOException, InterruptedException {
auth.authenticate(); // TODO: Should be done on start!
- return auth.getAuthToken().isPresent()? auth.getAuthToken().get().getToken() : "No token!";
+ return auth.getToken().isPresent()? auth.getToken().get() : "No token!";
+ }
+
+ @GetMapping("/transactions")
+ public Transactions transactions() throws IOException, InterruptedException {
+ return transactionsHandler.getTransactions();
}
}
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/Auth.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/Auth.java
index 7dcb4d6..2280b7a 100644
--- a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/Auth.java
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/Auth.java
@@ -1,5 +1,7 @@
package fr.lengrand.dialogflowfunapi.openbankproject.auth;
+import fr.lengrand.dialogflowfunapi.openbankproject.auth.data.AuthToken;
+import fr.lengrand.dialogflowfunapi.openbankproject.auth.data.OpenBankCredentials;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -23,14 +25,9 @@ public class Auth {
public JSONBodyHandler jsonBodyHandler = JSONBodyHandler.getHandler(AuthToken.class);
- private Optional authToken = Optional.empty();
+ private Optional token = Optional.empty();
public void authenticate() throws IOException, InterruptedException {
- System.out.println("Username is " + credentials.getUsername());
- System.out.println("Password is " + credentials.getPassword());
- System.out.println("Key is " + credentials.getKey());
-
-
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.headers("Content-Type", "application/json",
@@ -40,16 +37,16 @@ public class Auth {
.build();
HttpResponse response = client.send(request, jsonBodyHandler); //TODO : Handle failures.
- System.out.println(response.body().getToken());
- authToken = Optional.of(response.body());
+ System.out.println("Authenticated");
+ token = Optional.of(response.body().getToken());
}
public boolean isAuthenticated() {
- return authToken.isPresent();
+ return token.isPresent() && token.get() != null;
}
- public Optional getAuthToken() {
- return authToken;
+ public Optional getToken() {
+ return token;
}
private String createDirectLoginHeader(){
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/JSONBodyHandler.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/JSONBodyHandler.java
index 379c2db..45da36b 100644
--- a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/JSONBodyHandler.java
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/JSONBodyHandler.java
@@ -10,6 +10,7 @@ import java.net.http.HttpResponse.ResponseInfo;
import java.util.function.Function;
public class JSONBodyHandler implements HttpResponse.BodyHandler {
+ // TODO : Use Jackson
private final Jsonb jsonBinder;
private final Class type;
private HttpResponse.BodySubscriber byteArraySubscriber;
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/AuthToken.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/data/AuthToken.java
similarity index 74%
rename from dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/AuthToken.java
rename to dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/data/AuthToken.java
index e658684..83f5d16 100644
--- a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/AuthToken.java
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/data/AuthToken.java
@@ -1,4 +1,4 @@
-package fr.lengrand.dialogflowfunapi.openbankproject.auth;
+package fr.lengrand.dialogflowfunapi.openbankproject.auth.data;
public class AuthToken {
private String token;
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/OpenBankCredentials.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/data/OpenBankCredentials.java
similarity index 90%
rename from dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/OpenBankCredentials.java
rename to dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/data/OpenBankCredentials.java
index af89351..847eac9 100644
--- a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/OpenBankCredentials.java
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/data/OpenBankCredentials.java
@@ -1,4 +1,4 @@
-package fr.lengrand.dialogflowfunapi.openbankproject.auth;
+package fr.lengrand.dialogflowfunapi.openbankproject.auth.data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.ComponentScan;
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/TransactionsHandler.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/TransactionsHandler.java
new file mode 100644
index 0000000..913ca57
--- /dev/null
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/TransactionsHandler.java
@@ -0,0 +1,46 @@
+package fr.lengrand.dialogflowfunapi.openbankproject.transactions;
+
+import fr.lengrand.dialogflowfunapi.openbankproject.auth.Auth;
+import fr.lengrand.dialogflowfunapi.openbankproject.auth.JSONBodyHandler;
+import fr.lengrand.dialogflowfunapi.openbankproject.auth.data.AuthToken;
+import fr.lengrand.dialogflowfunapi.openbankproject.transactions.data.Transactions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+
+@Service
+public class TransactionsHandler {
+
+ @Autowired
+ private Auth auth;
+
+ public JSONBodyHandler jsonBodyHandler = JSONBodyHandler.getHandler(Transactions.class);
+
+ public Transactions getTransactions() throws IOException, InterruptedException {
+ HttpClient client = HttpClient.newHttpClient();
+ HttpRequest request = HttpRequest.newBuilder()
+ .headers("Content-Type", "application/json",
+ "Authorization", createAuthHeader())
+ .uri(URI.create(createUrl("at02-1465--01", "john_doe"))) // TODO : Convert to DialogFlow names
+ .build();
+
+ HttpResponse response = client.send(request, jsonBodyHandler); //TODO : Handle failures.
+ return response.body();
+ }
+
+ private String createUrl(String bank, String user){
+ return "https://psd2-api.openbankproject.com/obp/v4.0.0/my/banks/"+ bank + "/accounts/" + user + "/transactions";
+ }
+
+ private String createAuthHeader(){
+ return "DirectLogin token=" + this.auth.getToken().get();
+ }
+}
+
+
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Amount.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Amount.java
new file mode 100644
index 0000000..e2e4ec0
--- /dev/null
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Amount.java
@@ -0,0 +1,7 @@
+package fr.lengrand.dialogflowfunapi.openbankproject.transactions.data;
+
+public class Amount {
+
+ public String currency;
+ public float amount;
+}
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Details.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Details.java
new file mode 100644
index 0000000..8167239
--- /dev/null
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Details.java
@@ -0,0 +1,13 @@
+package fr.lengrand.dialogflowfunapi.openbankproject.transactions.data;
+
+import java.util.Date;
+
+public class Details {
+ public String description;
+ public Date posted;
+ public Date completed;
+ public Amount value;
+ public Amount new_balance;
+
+}
+
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Transaction.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Transaction.java
new file mode 100644
index 0000000..8cfb0df
--- /dev/null
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Transaction.java
@@ -0,0 +1,8 @@
+package fr.lengrand.dialogflowfunapi.openbankproject.transactions.data;
+
+public class Transaction {
+
+ public String id;
+ public Details details;
+
+}
diff --git a/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Transactions.java b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Transactions.java
new file mode 100644
index 0000000..973242b
--- /dev/null
+++ b/dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Transactions.java
@@ -0,0 +1,8 @@
+package fr.lengrand.dialogflowfunapi.openbankproject.transactions.data;
+
+import java.util.List;
+
+public class Transactions {
+
+ public List transactions;
+}
diff --git a/dialogflow-fun-api/src/main/resources/application.properties b/dialogflow-fun-api/src/main/resources/application.properties
index 98fdb68..4c9c811 100644
--- a/dialogflow-fun-api/src/main/resources/application.properties
+++ b/dialogflow-fun-api/src/main/resources/application.properties
@@ -1,3 +1,4 @@
obp.username=${OPENBANKPROJECT_USERNAME}
obp.password=${OPENBANKPROJECT_PASSWORD}
-obp.key=${OPENBANKPROJECT_CONSUMERKEY}
\ No newline at end of file
+obp.key=${OPENBANKPROJECT_CONSUMERKEY}
+spring.jackson.serialization.indent_output=true