From 28bbf0815e936709c3f875ecc0d1eaf9ade111e0 Mon Sep 17 00:00:00 2001 From: Malanius Date: Tue, 2 Oct 2018 20:39:01 +0200 Subject: [PATCH 1/4] Some draft of rest api calls --- pom.xml | 9 ++++ src/main/java/cz/brmlab/wm/Application.java | 9 ++++ .../wm/wekan/pojo/card/CardRequest.java | 15 +++++++ .../wm/wekan/pojo/card/CardResponse.java | 10 +++++ .../wm/wekan/pojo/login/LoginRequest.java | 13 ++++++ .../wm/wekan/pojo/login/LoginToken.java | 10 +++++ .../cz/brmlab/wm/wekan/rest/CardPost.java | 41 +++++++++++++++++++ .../cz/brmlab/wm/wekan/rest/LoginPost.java | 34 +++++++++++++++ 8 files changed, 141 insertions(+) create mode 100644 src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java create mode 100644 src/main/java/cz/brmlab/wm/wekan/pojo/card/CardResponse.java create mode 100644 src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginRequest.java create mode 100644 src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java create mode 100644 src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java create mode 100644 src/main/java/cz/brmlab/wm/wekan/rest/LoginPost.java diff --git a/pom.xml b/pom.xml index 01690d5..5ae9233 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,15 @@ provided + + org.springframework + spring-web + + + com.fasterxml.jackson.core + jackson-databind + + com.github.stefanbirkner system-rules diff --git a/src/main/java/cz/brmlab/wm/Application.java b/src/main/java/cz/brmlab/wm/Application.java index 04623d1..32b37c0 100644 --- a/src/main/java/cz/brmlab/wm/Application.java +++ b/src/main/java/cz/brmlab/wm/Application.java @@ -2,6 +2,9 @@ package cz.brmlab.wm; import cz.brmlab.wm.utils.Exceptions.BrmException; import cz.brmlab.wm.wekan.WekanConfiguration; +import cz.brmlab.wm.wekan.pojo.card.CardRequest; +import cz.brmlab.wm.wekan.rest.CardPost; +import cz.brmlab.wm.wekan.rest.LoginPost; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; @@ -23,6 +26,12 @@ public class Application implements CommandLineRunner { try { WekanConfiguration wekanConfiguration = new WekanConfiguration(); + LoginPost loginPost = new LoginPost(wekanConfiguration); + loginPost.login(); + + CardPost cardPost = new CardPost(loginPost.getToken(), wekanConfiguration); + cardPost.postCard("Test from spring", "Test card from awesome spring app.\nAnd next line"); + } catch (BrmException ex) { System.exit(ex.getExitCode().getCode()); } diff --git a/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java b/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java new file mode 100644 index 0000000..6d75b72 --- /dev/null +++ b/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java @@ -0,0 +1,15 @@ +package cz.brmlab.wm.wekan.pojo.card; + +import cz.brmlab.wm.wekan.WekanConfiguration; +import cz.brmlab.wm.wekan.pojo.login.LoginToken; +import lombok.Data; + +@Data +public class CardRequest { + + private String title; + private String description; + private String authorId; + private final String swimlaneId = "Default"; + +} diff --git a/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardResponse.java b/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardResponse.java new file mode 100644 index 0000000..94e6b2f --- /dev/null +++ b/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardResponse.java @@ -0,0 +1,10 @@ +package cz.brmlab.wm.wekan.pojo.card; + +import lombok.Data; + +@Data +public class CardResponse { + + private String id; + +} diff --git a/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginRequest.java b/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginRequest.java new file mode 100644 index 0000000..1d812d5 --- /dev/null +++ b/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginRequest.java @@ -0,0 +1,13 @@ +package cz.brmlab.wm.wekan.pojo.login; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class LoginRequest implements Serializable { + + private String username; + private String password; + +} diff --git a/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java b/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java new file mode 100644 index 0000000..a696226 --- /dev/null +++ b/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java @@ -0,0 +1,10 @@ +package cz.brmlab.wm.wekan.pojo.login; + +import lombok.Data; + +@Data +public class LoginToken { + public String id; + public String token; + public String tokenExpires; +} diff --git a/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java b/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java new file mode 100644 index 0000000..8280673 --- /dev/null +++ b/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java @@ -0,0 +1,41 @@ +package cz.brmlab.wm.wekan.rest; + +import cz.brmlab.wm.wekan.WekanConfiguration; +import cz.brmlab.wm.wekan.pojo.card.CardRequest; +import cz.brmlab.wm.wekan.pojo.card.CardResponse; +import cz.brmlab.wm.wekan.pojo.login.LoginToken; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.client.RestTemplate; + +public class CardPost { + + private static final Logger LOG = LoggerFactory.getLogger(CardPost.class); + + private final LoginToken token; + private final WekanConfiguration configuration; + + public CardPost(LoginToken token, WekanConfiguration configuration) { + this.token = token; + this.configuration = configuration; + } + + public CardResponse postCard(String title, String description) { + CardRequest cardRequest = new CardRequest(); + cardRequest.setAuthorId(token.getId()); + cardRequest.setTitle(title); + cardRequest.setDescription(description); + + String cardUrl = configuration.getWekanUrl() + + "/api/boards" + + configuration.getWekanBoard() + + "/lists/" + + configuration.getWekanList() + "cards"; + + RestTemplate restTemplate = new RestTemplate(); + LOG.debug("Sending card: {}", cardRequest); + CardResponse cardResponse = restTemplate.postForObject(cardUrl, cardRequest, CardResponse.class); + + } + +} diff --git a/src/main/java/cz/brmlab/wm/wekan/rest/LoginPost.java b/src/main/java/cz/brmlab/wm/wekan/rest/LoginPost.java new file mode 100644 index 0000000..b201fd4 --- /dev/null +++ b/src/main/java/cz/brmlab/wm/wekan/rest/LoginPost.java @@ -0,0 +1,34 @@ +package cz.brmlab.wm.wekan.rest; + +import cz.brmlab.wm.wekan.WekanConfiguration; +import cz.brmlab.wm.wekan.pojo.login.LoginRequest; +import cz.brmlab.wm.wekan.pojo.login.LoginToken; +import lombok.Getter; +import org.springframework.web.client.RestTemplate; + +public class LoginPost { + + private final WekanConfiguration configuration; + + @Getter + private LoginToken token; + + public LoginPost(WekanConfiguration configuration) { + this.configuration = configuration; + } + + + public void login() { + + String loginUrl = configuration.getWekanUrl() + "/users/login"; + + LoginRequest loginRequest = new LoginRequest(); + loginRequest.setUsername(configuration.getWekanUser()); + loginRequest.setPassword(configuration.getWekanPassword()); + + RestTemplate restTemplate = new RestTemplate(); + token = restTemplate.postForObject(loginUrl, loginRequest, LoginToken.class); + + System.out.println(token); + } +} From 1bff1b0f6e5030de063f7b0c301bb96921b9af88 Mon Sep 17 00:00:00 2001 From: Malanius Date: Mon, 22 Oct 2018 20:43:22 +0200 Subject: [PATCH 2/4] Enhance logging with use of lombok --- src/main/java/cz/brmlab/wm/Application.java | 5 ++++- .../cz/brmlab/wm/utils/LogMarker/LogMarker.java | 17 +++++++++++++++++ .../cz/brmlab/wm/wekan/WekanConfiguration.java | 17 ++++++----------- .../brmlab/wm/wekan/pojo/card/CardRequest.java | 2 -- .../java/cz/brmlab/wm/wekan/rest/CardPost.java | 13 ++++++++----- .../java/cz/brmlab/wm/wekan/rest/LoginPost.java | 10 ++++++++-- 6 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 src/main/java/cz/brmlab/wm/utils/LogMarker/LogMarker.java diff --git a/src/main/java/cz/brmlab/wm/Application.java b/src/main/java/cz/brmlab/wm/Application.java index 32b37c0..624a916 100644 --- a/src/main/java/cz/brmlab/wm/Application.java +++ b/src/main/java/cz/brmlab/wm/Application.java @@ -2,21 +2,23 @@ package cz.brmlab.wm; import cz.brmlab.wm.utils.Exceptions.BrmException; import cz.brmlab.wm.wekan.WekanConfiguration; -import cz.brmlab.wm.wekan.pojo.card.CardRequest; import cz.brmlab.wm.wekan.rest.CardPost; import cz.brmlab.wm.wekan.rest.LoginPost; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +@Slf4j @SpringBootApplication public class Application implements CommandLineRunner { private static final Logger LOG = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { + log.trace("Starting wekan-mailer app..."); SpringApplication.run(Application.class, args); } @@ -33,6 +35,7 @@ public class Application implements CommandLineRunner { cardPost.postCard("Test from spring", "Test card from awesome spring app.\nAnd next line"); } catch (BrmException ex) { + log.error("Error {} encountered, shutting down!", ex.getExitCode()); System.exit(ex.getExitCode().getCode()); } } diff --git a/src/main/java/cz/brmlab/wm/utils/LogMarker/LogMarker.java b/src/main/java/cz/brmlab/wm/utils/LogMarker/LogMarker.java new file mode 100644 index 0000000..0547713 --- /dev/null +++ b/src/main/java/cz/brmlab/wm/utils/LogMarker/LogMarker.java @@ -0,0 +1,17 @@ +package cz.brmlab.wm.utils.LogMarker; + +import lombok.Getter; +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; + +public enum LogMarker { + + SECRET("SECRET"); + + @Getter + private Marker marker; + + LogMarker(String markerText) { + this.marker = MarkerFactory.getMarker(markerText); + } +} diff --git a/src/main/java/cz/brmlab/wm/wekan/WekanConfiguration.java b/src/main/java/cz/brmlab/wm/wekan/WekanConfiguration.java index 9d69546..7ba64c5 100644 --- a/src/main/java/cz/brmlab/wm/wekan/WekanConfiguration.java +++ b/src/main/java/cz/brmlab/wm/wekan/WekanConfiguration.java @@ -3,20 +3,15 @@ package cz.brmlab.wm.wekan; import cz.brmlab.wm.utils.Exceptions.BrmException; import cz.brmlab.wm.utils.Exceptions.ExitCode; import lombok.Getter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +@Slf4j public class WekanConfiguration { - /** - * Class logger - */ - private static final Logger LOG = LoggerFactory.getLogger(WekanConfiguration.class); - //ENV variables for wekan private static final String WEKAN_URL = "WEKAN_URL"; private static final String WEKAN_USER = "WEKAN_USER"; @@ -33,7 +28,7 @@ public class WekanConfiguration { * @throws BrmException if some of the properties is missing in ENV variables. */ public WekanConfiguration() throws BrmException { - LOG.trace("{}() - start.", this.getClass().getSimpleName()); + log.trace("{}() - start.", this.getClass().getSimpleName()); for (String prop : properties) { checkProp(prop); @@ -44,7 +39,7 @@ public class WekanConfiguration { this.wekanBoard = System.getenv(WEKAN_TARGET_BOARD); this.wekanList = System.getenv(WEKAN_TARGET_LIST); - LOG.info("Wekan config loaded successfully."); + log.info("Wekan config loaded successfully."); } @Getter @@ -63,11 +58,11 @@ public class WekanConfiguration { private String wekanList; private void checkProp(String prop) throws BrmException { - LOG.trace("checkProp({}) - start.", prop); + log.trace("checkProp({}) - start.", prop); if (System.getenv(prop) == null) { String message = ExitCode.CONFIGURATION_MISSING.getReason() + prop; - LOG.error(message, ExitCode.CONFIGURATION_MISSING); + log.error(message, ExitCode.CONFIGURATION_MISSING); throw new BrmException(message, ExitCode.CONFIGURATION_MISSING); } } diff --git a/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java b/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java index 6d75b72..fc713e5 100644 --- a/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java +++ b/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java @@ -1,7 +1,5 @@ package cz.brmlab.wm.wekan.pojo.card; -import cz.brmlab.wm.wekan.WekanConfiguration; -import cz.brmlab.wm.wekan.pojo.login.LoginToken; import lombok.Data; @Data diff --git a/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java b/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java index 8280673..9ad5d67 100644 --- a/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java +++ b/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java @@ -4,23 +4,24 @@ import cz.brmlab.wm.wekan.WekanConfiguration; import cz.brmlab.wm.wekan.pojo.card.CardRequest; import cz.brmlab.wm.wekan.pojo.card.CardResponse; import cz.brmlab.wm.wekan.pojo.login.LoginToken; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.client.RestTemplate; +@Slf4j public class CardPost { - private static final Logger LOG = LoggerFactory.getLogger(CardPost.class); - private final LoginToken token; private final WekanConfiguration configuration; public CardPost(LoginToken token, WekanConfiguration configuration) { + log.trace("{}() - start.", this.getClass().getSimpleName()); this.token = token; this.configuration = configuration; } public CardResponse postCard(String title, String description) { + log.trace("postCard({}, {}) - start.", title, description); + CardRequest cardRequest = new CardRequest(); cardRequest.setAuthorId(token.getId()); cardRequest.setTitle(title); @@ -33,9 +34,11 @@ public class CardPost { + configuration.getWekanList() + "cards"; RestTemplate restTemplate = new RestTemplate(); - LOG.debug("Sending card: {}", cardRequest); + log.debug("Sending card: {}", cardRequest); CardResponse cardResponse = restTemplate.postForObject(cardUrl, cardRequest, CardResponse.class); + log.info("Card {} successfully sent - cardId: {}", title, cardResponse.getId()); + return cardResponse; } } diff --git a/src/main/java/cz/brmlab/wm/wekan/rest/LoginPost.java b/src/main/java/cz/brmlab/wm/wekan/rest/LoginPost.java index b201fd4..4fa9574 100644 --- a/src/main/java/cz/brmlab/wm/wekan/rest/LoginPost.java +++ b/src/main/java/cz/brmlab/wm/wekan/rest/LoginPost.java @@ -1,11 +1,14 @@ package cz.brmlab.wm.wekan.rest; +import cz.brmlab.wm.utils.LogMarker.LogMarker; import cz.brmlab.wm.wekan.WekanConfiguration; import cz.brmlab.wm.wekan.pojo.login.LoginRequest; import cz.brmlab.wm.wekan.pojo.login.LoginToken; import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import org.springframework.web.client.RestTemplate; +@Slf4j public class LoginPost { private final WekanConfiguration configuration; @@ -19,16 +22,19 @@ public class LoginPost { public void login() { + log.trace("login() - start."); String loginUrl = configuration.getWekanUrl() + "/users/login"; + log.debug("Wekan login endpoint: {}", loginUrl); LoginRequest loginRequest = new LoginRequest(); loginRequest.setUsername(configuration.getWekanUser()); loginRequest.setPassword(configuration.getWekanPassword()); + log.info("Sending login request..."); RestTemplate restTemplate = new RestTemplate(); token = restTemplate.postForObject(loginUrl, loginRequest, LoginToken.class); - - System.out.println(token); + log.info("Login successful, token obtained."); + log.debug(LogMarker.SECRET.getMarker(), "Token: {}", token.toString()); } } From da353afd21b981b71df4c082aaec0f397fe5c1a0 Mon Sep 17 00:00:00 2001 From: Malanius Date: Sun, 28 Oct 2018 10:28:34 +0100 Subject: [PATCH 3/4] Fix access level for LoginToken POJO fields --- src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java b/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java index a696226..5a1874c 100644 --- a/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java +++ b/src/main/java/cz/brmlab/wm/wekan/pojo/login/LoginToken.java @@ -4,7 +4,7 @@ import lombok.Data; @Data public class LoginToken { - public String id; - public String token; - public String tokenExpires; + private String id; + private String token; + private String tokenExpires; } From 3f5c1d4fc383e4b344789f8f42d0b2e7627c8ddf Mon Sep 17 00:00:00 2001 From: Malanius Date: Sun, 28 Oct 2018 11:32:44 +0100 Subject: [PATCH 4/4] Make POSTing cards work --- src/main/java/cz/brmlab/wm/Application.java | 3 +- .../brmlab/wm/utils/Exceptions/ExitCode.java | 3 +- ...{CardRequest.java => PostCardRequest.java} | 2 +- ...ardResponse.java => PostCardResponse.java} | 4 +- .../cz/brmlab/wm/wekan/rest/CardPost.java | 53 ++++++++++++------- 5 files changed, 41 insertions(+), 24 deletions(-) rename src/main/java/cz/brmlab/wm/wekan/pojo/card/{CardRequest.java => PostCardRequest.java} (86%) rename src/main/java/cz/brmlab/wm/wekan/pojo/card/{CardResponse.java => PostCardResponse.java} (55%) diff --git a/src/main/java/cz/brmlab/wm/Application.java b/src/main/java/cz/brmlab/wm/Application.java index 624a916..b6cd28c 100644 --- a/src/main/java/cz/brmlab/wm/Application.java +++ b/src/main/java/cz/brmlab/wm/Application.java @@ -2,6 +2,7 @@ package cz.brmlab.wm; import cz.brmlab.wm.utils.Exceptions.BrmException; import cz.brmlab.wm.wekan.WekanConfiguration; +import cz.brmlab.wm.wekan.pojo.card.PostCardResponse; import cz.brmlab.wm.wekan.rest.CardPost; import cz.brmlab.wm.wekan.rest.LoginPost; import lombok.extern.slf4j.Slf4j; @@ -32,7 +33,7 @@ public class Application implements CommandLineRunner { loginPost.login(); CardPost cardPost = new CardPost(loginPost.getToken(), wekanConfiguration); - cardPost.postCard("Test from spring", "Test card from awesome spring app.\nAnd next line"); + PostCardResponse postCardResponse = cardPost.postCard("Test from spring", "Test card from awesome spring app.\nAnd next line"); } catch (BrmException ex) { log.error("Error {} encountered, shutting down!", ex.getExitCode()); diff --git a/src/main/java/cz/brmlab/wm/utils/Exceptions/ExitCode.java b/src/main/java/cz/brmlab/wm/utils/Exceptions/ExitCode.java index fe95534..c41b965 100644 --- a/src/main/java/cz/brmlab/wm/utils/Exceptions/ExitCode.java +++ b/src/main/java/cz/brmlab/wm/utils/Exceptions/ExitCode.java @@ -4,7 +4,8 @@ import lombok.Getter; public enum ExitCode { - CONFIGURATION_MISSING(10, "Missing configuration property: "); + CONFIGURATION_MISSING(10, "Missing configuration property: "), + POST_ERROR(20, "Failed POST request, RC: "); @Getter private String reason; diff --git a/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java b/src/main/java/cz/brmlab/wm/wekan/pojo/card/PostCardRequest.java similarity index 86% rename from src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java rename to src/main/java/cz/brmlab/wm/wekan/pojo/card/PostCardRequest.java index fc713e5..5d1deb5 100644 --- a/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardRequest.java +++ b/src/main/java/cz/brmlab/wm/wekan/pojo/card/PostCardRequest.java @@ -3,7 +3,7 @@ package cz.brmlab.wm.wekan.pojo.card; import lombok.Data; @Data -public class CardRequest { +public class PostCardRequest { private String title; private String description; diff --git a/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardResponse.java b/src/main/java/cz/brmlab/wm/wekan/pojo/card/PostCardResponse.java similarity index 55% rename from src/main/java/cz/brmlab/wm/wekan/pojo/card/CardResponse.java rename to src/main/java/cz/brmlab/wm/wekan/pojo/card/PostCardResponse.java index 94e6b2f..1a47ae2 100644 --- a/src/main/java/cz/brmlab/wm/wekan/pojo/card/CardResponse.java +++ b/src/main/java/cz/brmlab/wm/wekan/pojo/card/PostCardResponse.java @@ -3,8 +3,8 @@ package cz.brmlab.wm.wekan.pojo.card; import lombok.Data; @Data -public class CardResponse { +public class PostCardResponse { - private String id; + private String _id; } diff --git a/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java b/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java index 9ad5d67..9d1068b 100644 --- a/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java +++ b/src/main/java/cz/brmlab/wm/wekan/rest/CardPost.java @@ -1,44 +1,59 @@ package cz.brmlab.wm.wekan.rest; +import cz.brmlab.wm.utils.Exceptions.BrmException; +import cz.brmlab.wm.utils.Exceptions.ExitCode; import cz.brmlab.wm.wekan.WekanConfiguration; -import cz.brmlab.wm.wekan.pojo.card.CardRequest; -import cz.brmlab.wm.wekan.pojo.card.CardResponse; +import cz.brmlab.wm.wekan.pojo.card.PostCardRequest; +import cz.brmlab.wm.wekan.pojo.card.PostCardResponse; import cz.brmlab.wm.wekan.pojo.login.LoginToken; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.*; +import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.RestTemplate; +import java.util.Collections; + @Slf4j public class CardPost { private final LoginToken token; - private final WekanConfiguration configuration; + private static final String POST_CARD_URL_TEMPLATE = "${host}/api/boards/${boardId}/lists/${listId}/cards"; + private final String postCardUrl; public CardPost(LoginToken token, WekanConfiguration configuration) { log.trace("{}() - start.", this.getClass().getSimpleName()); this.token = token; - this.configuration = configuration; + postCardUrl = POST_CARD_URL_TEMPLATE.replace("${host}", configuration.getWekanUrl()) + .replace("${boardId}", configuration.getWekanBoard()) + .replace("${listId}", configuration.getWekanList()); + log.debug("Card post URL: {}", postCardUrl); } - public CardResponse postCard(String title, String description) { + public PostCardResponse postCard(String title, String description) throws BrmException { log.trace("postCard({}, {}) - start.", title, description); - CardRequest cardRequest = new CardRequest(); - cardRequest.setAuthorId(token.getId()); - cardRequest.setTitle(title); - cardRequest.setDescription(description); - - String cardUrl = configuration.getWekanUrl() - + "/api/boards" - + configuration.getWekanBoard() - + "/lists/" - + configuration.getWekanList() + "cards"; + PostCardRequest postCardRequest = new PostCardRequest(); + postCardRequest.setAuthorId(token.getId()); + postCardRequest.setTitle(title); + postCardRequest.setDescription(description); RestTemplate restTemplate = new RestTemplate(); - log.debug("Sending card: {}", cardRequest); - CardResponse cardResponse = restTemplate.postForObject(cardUrl, cardRequest, CardResponse.class); + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.set("Authorization", "Bearer " + token.getToken()); + HttpEntity entity = new HttpEntity<>(postCardRequest, headers); + + log.debug("Sending card: {}", postCardRequest); + try { + ResponseEntity responseEntity = restTemplate.exchange(postCardUrl, HttpMethod.POST, entity, PostCardResponse.class); + PostCardResponse postCardResponse = responseEntity.getBody(); + log.info("Card {} successfully sent - cardId: {}", title, postCardResponse != null ? postCardResponse.get_id() : null); + return postCardResponse; + } catch (HttpStatusCodeException ex) { + log.error("Unable to POST a card, status code: {}", ex.getStatusCode()); + throw new BrmException(ExitCode.POST_ERROR.getReason() + ex.getStatusCode(), ExitCode.POST_ERROR); + } - log.info("Card {} successfully sent - cardId: {}", title, cardResponse.getId()); - return cardResponse; } }