From a040b24cfd42bfbb329d1288399c69942856266c Mon Sep 17 00:00:00 2001 From: Julien Lengrand-Lambert Date: Mon, 21 Oct 2019 18:25:16 +0200 Subject: [PATCH] Add support for transactions viewing --- dialogflow-fun-api/pom.xml | 5 ++ .../DialogflowFunApiApplication.java | 22 ++++++++- .../openbankproject/auth/Auth.java | 19 ++++---- .../openbankproject/auth/JSONBodyHandler.java | 1 + .../auth/{ => data}/AuthToken.java | 2 +- .../auth/{ => data}/OpenBankCredentials.java | 2 +- .../transactions/TransactionsHandler.java | 46 +++++++++++++++++++ .../transactions/data/Amount.java | 7 +++ .../transactions/data/Details.java | 13 ++++++ .../transactions/data/Transaction.java | 8 ++++ .../transactions/data/Transactions.java | 8 ++++ .../src/main/resources/application.properties | 3 +- 12 files changed, 121 insertions(+), 15 deletions(-) rename dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/{ => data}/AuthToken.java (74%) rename dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/auth/{ => data}/OpenBankCredentials.java (90%) create mode 100644 dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/TransactionsHandler.java create mode 100644 dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Amount.java create mode 100644 dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Details.java create mode 100644 dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Transaction.java create mode 100644 dialogflow-fun-api/src/main/java/fr/lengrand/dialogflowfunapi/openbankproject/transactions/data/Transactions.java 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