From a6b0ee9e7d0860c1c33cedec6fcff83cb5b00fa5 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Tue, 12 Nov 2019 15:50:39 +0100 Subject: [PATCH 01/16] Add BoardView --- .../main/java/wekan/wrapper/entity/BoardView.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/BoardView.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/BoardView.java b/wrapper/src/main/java/wekan/wrapper/entity/BoardView.java new file mode 100644 index 0000000..7f04129 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/BoardView.java @@ -0,0 +1,13 @@ +package wekan.wrapper.entity; + +import com.google.gson.annotations.SerializedName; + +public enum BoardView { + + @SerializedName("board-view-lists") + BOARD_VIEW_LISTS, + @SerializedName("board-view-swimlanes") + BOARD_VIEW_SWIMLANES, + @SerializedName("board-view-cal") + BOARD_VIEW_CAL +} -- 2.40.1 From 67cc004c958efded837663ce1a7612e82669c733 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Tue, 12 Nov 2019 15:51:24 +0100 Subject: [PATCH 02/16] Add ListSortBy --- .../java/wekan/wrapper/entity/ListSortBy.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java b/wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java new file mode 100644 index 0000000..5f152e9 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java @@ -0,0 +1,19 @@ +package wekan.wrapper.entity; + +import com.google.gson.annotations.SerializedName; + +public enum ListSortBy { + + @SerializedName("-modifiedat") + _MODIFIEDAT, + @SerializedName("modifiedat") + MODIFIEDAT, + @SerializedName("-title") + _TITLE, + @SerializedName("title") + TITLE, + @SerializedName("-sort") + _SORT, + @SerializedName("sort") + SORT +} -- 2.40.1 From 1d3c8601647b87e32eb8ab7ec66b4f0c4714a077 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Tue, 12 Nov 2019 15:51:52 +0100 Subject: [PATCH 03/16] Add clss User --- .../main/java/wekan/wrapper/entity/User.java | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/User.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/User.java b/wrapper/src/main/java/wekan/wrapper/entity/User.java new file mode 100644 index 0000000..2560edd --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/User.java @@ -0,0 +1,130 @@ +package wekan.wrapper.entity; + +import com.google.gson.annotations.SerializedName; + +import java.util.Date; +import java.util.List; + +public class User { + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public List getEmails() { + return emails; + } + + public void setEmails(List emails) { + this.emails = emails; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public Date getModifiedAt() { + return modifiedAt; + } + + public void setModifiedAt(Date modifiedAt) { + this.modifiedAt = modifiedAt; + } + + public UserProfile getProfile() { + return profile; + } + + public void setProfile(UserProfile profile) { + this.profile = profile; + } + + public String getHeartbeat() { + return heartbeat; + } + + public void setHeartbeat(String heartbeat) { + this.heartbeat = heartbeat; + } + + public boolean isAdmin() { + return isAdmin; + } + + public void setAdmin(boolean admin) { + isAdmin = admin; + } + + public boolean isCreatedThroughApi() { + return createdThroughApi; + } + + public void setCreatedThroughApi(boolean createdThroughApi) { + this.createdThroughApi = createdThroughApi; + } + + public boolean isLoginDisabled() { + return loginDisabled; + } + + public void setLoginDisabled(boolean loginDisabled) { + this.loginDisabled = loginDisabled; + } + + public String getAuthenticationMethod() { + return authenticationMethod; + } + + public void setAuthenticationMethod(String authenticationMethod) { + this.authenticationMethod = authenticationMethod; + } + + @Override + public String toString() { + return "User{" + + "id='" + id + '\'' + + ", username='" + username + '\'' + + ", emails=" + emails + + ", createdAt=" + createdAt + + ", modifiedAt=" + modifiedAt + + ", profile=" + profile + + ", heartbeat='" + heartbeat + '\'' + + ", isAdmin=" + isAdmin + + ", createdThroughApi=" + createdThroughApi + + ", loginDisabled=" + loginDisabled + + ", authenticationMethod='" + authenticationMethod + '\'' + + '}'; + } + + @SerializedName("_id") + private String id; + private String username; + private List emails; + private Date createdAt; + private Date modifiedAt; + private UserProfile profile; + //Class Service doesn't implemented in API + //private Service service; + private String heartbeat; + private boolean isAdmin; + private boolean createdThroughApi; + private boolean loginDisabled; + private String authenticationMethod; + +} -- 2.40.1 From 5c50bf212353d8b94bca64347ee4f8391189b751 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Tue, 12 Nov 2019 15:52:17 +0100 Subject: [PATCH 04/16] Add User Email --- .../java/wekan/wrapper/entity/UserEmail.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java b/wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java new file mode 100644 index 0000000..f3fb218 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java @@ -0,0 +1,30 @@ +package wekan.wrapper.entity; + +public class UserEmail { + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public boolean isVerified() { + return verified; + } + + public void setVerified(boolean verified) { + this.verified = verified; + } + + @Override + public String toString() { + return "UserEmail{" + + "email='" + email + '\'' + + ", verified=" + verified + + '}'; + } + + private String email; + private boolean verified; +} -- 2.40.1 From 3a4d879309a982ed3bd2d91be55f4e09ab965a26 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Tue, 12 Nov 2019 15:52:40 +0100 Subject: [PATCH 05/16] Add class UserProfile --- .../wekan/wrapper/entity/UserProfile.java | 204 ++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/UserProfile.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/UserProfile.java b/wrapper/src/main/java/wekan/wrapper/entity/UserProfile.java new file mode 100644 index 0000000..aeb0f39 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/UserProfile.java @@ -0,0 +1,204 @@ +package wekan.wrapper.entity; + +import java.util.List; + +public class UserProfile { + + public String getAvatarUrl() { + return avatarUrl; + } + + public void setAvatarUrl(String avatarUrl) { + this.avatarUrl = avatarUrl; + } + + public List getEmailBuffer() { + return emailBuffer; + } + + public void setEmailBuffer(List emailBuffer) { + this.emailBuffer = emailBuffer; + } + + public String getFullname() { + return fullname; + } + + public void setFullname(String fullname) { + this.fullname = fullname; + } + + public boolean isShowDesktopDragHandles() { + return showDesktopDragHandles; + } + + public void setShowDesktopDragHandles(boolean showDesktopDragHandles) { + this.showDesktopDragHandles = showDesktopDragHandles; + } + + public boolean isHiddenSystemMessages() { + return hiddenSystemMessages; + } + + public void setHiddenSystemMessages(boolean hiddenSystemMessages) { + this.hiddenSystemMessages = hiddenSystemMessages; + } + + public boolean isHiddenMinicardLabelText() { + return hiddenMinicardLabelText; + } + + public void setHiddenMinicardLabelText(boolean hiddenMinicardLabelText) { + this.hiddenMinicardLabelText = hiddenMinicardLabelText; + } + + public String getInitials() { + return initials; + } + + public void setInitials(String initials) { + this.initials = initials; + } + + public List getInvitedBoards() { + return invitedBoards; + } + + public void setInvitedBoards(List invitedBoards) { + this.invitedBoards = invitedBoards; + } + + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + + public List getNotifications() { + return notifications; + } + + public void setNotifications(List notifications) { + this.notifications = notifications; + } + + public int getShowCardsCountAt() { + return showCardsCountAt; + } + + public void setShowCardsCountAt(int showCardsCountAt) { + this.showCardsCountAt = showCardsCountAt; + } + + public List getStarredBoards() { + return starredBoards; + } + + public void setStarredBoards(List starredBoards) { + this.starredBoards = starredBoards; + } + + public String getIcode() { + return icode; + } + + public void setIcode(String icode) { + this.icode = icode; + } + + public BoardView getBoardView() { + return boardView; + } + + public void setBoardView(BoardView boardView) { + this.boardView = boardView; + } + + public ListSortBy getListSortBy() { + return listSortBy; + } + + public void setListSortBy(ListSortBy listSortBy) { + this.listSortBy = listSortBy; + } + + public String getTemplatesBoardId() { + return templatesBoardId; + } + + public void setTemplatesBoardId(String templatesBoardId) { + this.templatesBoardId = templatesBoardId; + } + + public String getCardTemplatesSwimlaneId() { + return cardTemplatesSwimlaneId; + } + + public void setCardTemplatesSwimlaneId(String cardTemplatesSwimlaneId) { + this.cardTemplatesSwimlaneId = cardTemplatesSwimlaneId; + } + + public String getListTemplatesSwimlaneId() { + return listTemplatesSwimlaneId; + } + + public void setListTemplatesSwimlaneId(String listTemplatesSwimlaneId) { + this.listTemplatesSwimlaneId = listTemplatesSwimlaneId; + } + + public String getBoardTemplatesSwimlaneId() { + return boardTemplatesSwimlaneId; + } + + public void setBoardTemplatesSwimlaneId(String boardTemplatesSwimlaneId) { + this.boardTemplatesSwimlaneId = boardTemplatesSwimlaneId; + } + + @Override + public String toString() { + return "UserProfile{" + + "avatarUrl='" + avatarUrl + '\'' + + ", emailBuffer=" + emailBuffer + + ", fullname='" + fullname + '\'' + + ", showDesktopDragHandles=" + showDesktopDragHandles + + ", hiddenSystemMessages=" + hiddenSystemMessages + + ", hiddenMinicardLabelText=" + hiddenMinicardLabelText + + ", initials='" + initials + '\'' + + ", invitedBoards=" + invitedBoards + + ", language='" + language + '\'' + + ", notifications=" + notifications + + ", showCardsCountAt=" + showCardsCountAt + + ", starredBoards=" + starredBoards + + ", icode='" + icode + '\'' + + ", boardView=" + boardView + + ", listSortBy=" + listSortBy + + ", templatesBoardId='" + templatesBoardId + '\'' + + ", cardTemplatesSwimlaneId='" + cardTemplatesSwimlaneId + '\'' + + ", listTemplatesSwimlaneId='" + listTemplatesSwimlaneId + '\'' + + ", boardTemplatesSwimlaneId='" + boardTemplatesSwimlaneId + '\'' + + '}'; + } + + private String avatarUrl; + private List emailBuffer; + private String fullname; + private boolean showDesktopDragHandles; + private boolean hiddenSystemMessages; + private boolean hiddenMinicardLabelText; + private String initials; + private List invitedBoards; + private String language; + private List notifications; + private int showCardsCountAt; + private List starredBoards; + private String icode; + private BoardView boardView; + private ListSortBy listSortBy; + private String templatesBoardId; + private String cardTemplatesSwimlaneId; + private String listTemplatesSwimlaneId; + private String boardTemplatesSwimlaneId; + +} -- 2.40.1 From 3460c687630c135a3cbd3cc20ac2565b4bbbc58f Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Wed, 13 Nov 2019 16:31:26 +0100 Subject: [PATCH 06/16] Correct serialized name --- wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java b/wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java index f3fb218..51f61ae 100644 --- a/wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java +++ b/wrapper/src/main/java/wekan/wrapper/entity/UserEmail.java @@ -2,11 +2,11 @@ package wekan.wrapper.entity; public class UserEmail { public String getEmail() { - return email; + return address; } public void setEmail(String email) { - this.email = email; + this.address = email; } public boolean isVerified() { @@ -20,11 +20,11 @@ public class UserEmail { @Override public String toString() { return "UserEmail{" + - "email='" + email + '\'' + + "adrress='" + address + '\'' + ", verified=" + verified + '}'; } - private String email; + private String address; private boolean verified; } -- 2.40.1 From 955d5e3704374f588b1848a11f7700c321d7ef68 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Wed, 13 Nov 2019 16:32:40 +0100 Subject: [PATCH 07/16] Add UserService --- .../java/wekan/wrapper/api/UserService.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/api/UserService.java diff --git a/wrapper/src/main/java/wekan/wrapper/api/UserService.java b/wrapper/src/main/java/wekan/wrapper/api/UserService.java new file mode 100644 index 0000000..6616895 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/api/UserService.java @@ -0,0 +1,29 @@ +package wekan.wrapper.api; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; +import wekan.wrapper.entity.User; + +import java.util.List; + +public interface UserService { + + /** + * Get all users. + * + * @return the list with all users + */ + @GET("api/users") + Call> getAllUser(); + + /** + * Get user information + * + * @param userId ID user + * @return user information + */ + @GET("api/users/{user}") + Call getUser(@Path("user") String userId); + +} -- 2.40.1 From c3e032bf29831b0de3701dce7a93a508f1d83d21 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Wed, 13 Nov 2019 17:00:17 +0100 Subject: [PATCH 08/16] Add UserServiceTest --- .../wekan/wrapper/api/UserServiceTest.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java diff --git a/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java b/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java new file mode 100644 index 0000000..c93a60d --- /dev/null +++ b/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java @@ -0,0 +1,118 @@ +package wekan.wrapper.api; + +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import wekan.wrapper.entity.User; +import wekan.wrapper.entity.UserEmail; +import wekan.wrapper.entity.UserProfile; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.util.List; + +public class UserServiceTest { + private MockWebServer mockWebServer = new MockWebServer(); + private UserService service = null; + + @Before + public void setUp() { + try { + mockWebServer.start(); + service = new Retrofit.Builder() + .baseUrl(mockWebServer.url("/")) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(UserService.class); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + @After + public void teardown() { + try { + mockWebServer.shutdown(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Test + public void getAllUsersTest(){ + MockResponse response = new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_OK) + .setBody( + "[{\"_id\":\"Si69gNgkJfQuk6uiJ\",\"username\":\"norangebit\"}," + + "{\"_id\":\"8rsnfEPkfMS49Pv6q\",\"username\":\"noemi\"}," + + "{\"_id\":\"jPdkf3a9bmfZWx3GR\",\"username\":\"umberto\"}]" + ); + mockWebServer.enqueue(response); + + try{ + List users = service.getAllUser().execute().body(); + assertNotNull(users); + assertEquals("Si69gNgkJfQuk6uiJ", users.get(0).getId()); + assertEquals("norangebit", users.get(0).getUsername()); + assertEquals("8rsnfEPkfMS49Pv6q", users.get(1).getId()); + assertEquals("noemi", users.get(1).getUsername()); + assertEquals("jPdkf3a9bmfZWx3GR", users.get(2).getId()); + assertEquals("umberto", users.get(2).getUsername()); + } + catch (IOException e){ + e.printStackTrace(); + } + } + + @Test + public void getUser(){ + MockResponse response = new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_OK) + .setBody(user1); + mockWebServer.enqueue(response); + + try { + User user = service.getUser("jPdkf3a9bmfZWx3GR").execute().body(); + assert user != null; + List userEmail = user.getEmails(); + UserProfile userProfile = user.getProfile(); + assertEquals("jPdkf3a9bmfZWx3GR", user.getId()); + assertEquals("umberto", user.getUsername()); + assertEquals("password", user.getAuthenticationMethod()); + assertTrue(user.isAdmin()); + assertEquals("2019-10-14T18:14:38.249Z", user.getCreatedAt()); + assertFalse(userEmail.isEmpty()); + assertEquals("umbertof993@gmail.com", userEmail.get(0).getEmail()); + assertFalse(userEmail.get(0).isVerified()); + assertEquals("board-view-swimlanes", userProfile.getBoardView()); + assertEquals("zo82BZYxFTNBpb7jX", userProfile.getCardTemplatesSwimlaneId()); + assertEquals("-modifiedAt", userProfile.getListSortBy()); + + } catch (IOException e) { + e.printStackTrace(); + } + + + } + + + private static final String user1 = "{" + + "\"_id\":\"jPdkf3a9bmfZWx3GR\"," + + "\"username\":\"umberto\"," + + "\"emails\":[{\"address\":\"umbertof993@gmail.com\",\"verified\":false}]," + + "\"authenticationMethod\":\"password\"," + + "\"isAdmin\":\"true\"," + + "\"loginDisabled\":\"true\"," + + "\"profile\":{\"boardView\":\"board-view-swimlanes\",\"templatesBoardId\":\"eLvE8FnqvACfC9Rtb\"," + + "\"cardTemplatesSwimlaneId\":\"zo82BZYxFTNBpb7jX\",\"listTemplatesSwimlaneId\":\"Kja32A85P2HADWKFA\"," + + "\"boardTemplatesSwimlaneId\":\"j6ZuPbwaN9nsCDxyS\",\"listSortBy\":\"-modifiedAt\"}," + + "\"createdAt\":\"2019-10-14T18:14:38.249Z\","+ + "\"modifiedAt\":\"2019-11-09T17:55:36.976Z\"," + + "}"; +} -- 2.40.1 From 01e502455fb35b3a11de87a5776ac52c38a09a91 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Wed, 13 Nov 2019 18:00:11 +0100 Subject: [PATCH 09/16] Fix serializedName --- .../main/java/wekan/wrapper/entity/Card.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/wrapper/src/main/java/wekan/wrapper/entity/Card.java b/wrapper/src/main/java/wekan/wrapper/entity/Card.java index 14d7bde..b79bfff 100644 --- a/wrapper/src/main/java/wekan/wrapper/entity/Card.java +++ b/wrapper/src/main/java/wekan/wrapper/entity/Card.java @@ -17,6 +17,14 @@ public class Card { public Card() { } + public String getAuthorId() { + return authorId; + } + + public void setAuthorId(String authorId) { + this.authorId = authorId; + } + public String getId() { return id; } @@ -217,13 +225,6 @@ public class Card { isOvertime = overtime; } - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } public int getSort() { return sort; @@ -285,7 +286,7 @@ public class Card { ", endAt='" + endAt + '\'' + ", spentTime=" + spentTime + ", isOvertime=" + isOvertime + - ", userId='" + userId + '\'' + + ", userId='" + authorId + '\'' + ", sort=" + sort + ", subtaskSort=" + subtaskSort + ", type='" + type + '\'' + @@ -319,10 +320,11 @@ public class Card { private Date endAt; private int spentTime; private Boolean isOvertime; - private String userId; + //private String userId; private int sort; private int subtaskSort; private String type; private String linkedId; + @SerializedName(value = "authorId", alternate = "userId") private String authorId; } -- 2.40.1 From 0720f2f4ce02021d5bf40d81cf714bf5dd9e7cc6 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Thu, 14 Nov 2019 15:47:59 +0100 Subject: [PATCH 10/16] Add class Email --- .../main/java/wekan/wrapper/entity/Email.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/Email.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/Email.java b/wrapper/src/main/java/wekan/wrapper/entity/Email.java new file mode 100644 index 0000000..f6e4a5f --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/Email.java @@ -0,0 +1,24 @@ +package wekan.wrapper.entity; + +import java.util.List; + +public class Email { + + @Override + public String toString() { + return "email{" + + "verificationTokens=" + verificationTokens + + '}'; + } + + public List getVerificationTokens() { + return verificationTokens; + } + + public void setVerificationTokens(List verificationTokens) { + this.verificationTokens = verificationTokens; + } + + private List verificationTokens; + +} -- 2.40.1 From 809798729846ad27f9de5b1521a177c6b65e79b0 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Thu, 14 Nov 2019 15:48:23 +0100 Subject: [PATCH 11/16] Fix name --- wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java b/wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java index 5f152e9..f70a795 100644 --- a/wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java +++ b/wrapper/src/main/java/wekan/wrapper/entity/ListSortBy.java @@ -4,9 +4,9 @@ import com.google.gson.annotations.SerializedName; public enum ListSortBy { - @SerializedName("-modifiedat") + @SerializedName("-modifiedAt") _MODIFIEDAT, - @SerializedName("modifiedat") + @SerializedName("modifiedAt") MODIFIEDAT, @SerializedName("-title") _TITLE, -- 2.40.1 From 8e5c93fb044210e46d7085c29c568338b8364fb6 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Thu, 14 Nov 2019 15:48:57 +0100 Subject: [PATCH 12/16] Add LoginToken --- .../java/wekan/wrapper/entity/LoginToken.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/LoginToken.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/LoginToken.java b/wrapper/src/main/java/wekan/wrapper/entity/LoginToken.java new file mode 100644 index 0000000..495a8d1 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/LoginToken.java @@ -0,0 +1,35 @@ +package wekan.wrapper.entity; + +/** + * contains the hash code of the access token and the date of that access + */ + +public class LoginToken { + + public String getWhen() { + return when; + } + + public void setWhen(String when) { + this.when = when; + } + + public String getHashedToken() { + return hashedToken; + } + + public void setHashedToken(String hashedToken) { + this.hashedToken = hashedToken; + } + + @Override + public String toString() { + return "LoginToken{" + + "when='" + when + '\'' + + ", hashedToken='" + hashedToken + '\'' + + '}'; + } + + private String when; + private String hashedToken; +} -- 2.40.1 From eaded60e46c9eb4be5ae6c5e2d4e36226f5f15db Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Thu, 14 Nov 2019 15:54:22 +0100 Subject: [PATCH 13/16] Add Service class --- .../java/wekan/wrapper/entity/Password.java | 21 +++++++++ .../java/wekan/wrapper/entity/Resume.java | 30 +++++++++++++ .../java/wekan/wrapper/entity/Service.java | 41 +++++++++++++++++ .../main/java/wekan/wrapper/entity/User.java | 13 +++++- .../wrapper/entity/VerificationToken.java | 43 ++++++++++++++++++ .../wekan/wrapper/api/UserServiceTest.java | 45 ++++++++++++++++--- 6 files changed, 186 insertions(+), 7 deletions(-) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/Password.java create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/Resume.java create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/Service.java create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/VerificationToken.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/Password.java b/wrapper/src/main/java/wekan/wrapper/entity/Password.java new file mode 100644 index 0000000..cf6048f --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/Password.java @@ -0,0 +1,21 @@ +package wekan.wrapper.entity; + +public class Password { + + @Override + public String toString() { + return "Password{" + + "bcrypt='" + bcrypt + '\'' + + '}'; + } + + public String getBcrypt() { + return bcrypt; + } + + public void setBcrypt(String bcrypt) { + this.bcrypt = bcrypt; + } + + private String bcrypt; +} diff --git a/wrapper/src/main/java/wekan/wrapper/entity/Resume.java b/wrapper/src/main/java/wekan/wrapper/entity/Resume.java new file mode 100644 index 0000000..d79a9d0 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/Resume.java @@ -0,0 +1,30 @@ +package wekan.wrapper.entity; + +import java.util.List; + +/** + * Keeps track of access through the LoginToken list + * LoginToken contains the hash code of the access token + * and the date of that access + * + */ + +public class Resume { + + public List getLoginTokens() { + return loginTokens; + } + + public void setLoginTokens(List loginTokens) { + this.loginTokens = loginTokens; + } + + @Override + public String toString() { + return "Resume{" + + "loginTokens=" + loginTokens + + '}'; + } + + private List loginTokens; +} diff --git a/wrapper/src/main/java/wekan/wrapper/entity/Service.java b/wrapper/src/main/java/wekan/wrapper/entity/Service.java new file mode 100644 index 0000000..392b532 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/Service.java @@ -0,0 +1,41 @@ +package wekan.wrapper.entity; + +public class Service { + + public Email getEmail() { + return email; + } + + public void setEmail(Email email) { + this.email = email; + } + + public Resume getResume() { + return resume; + } + + public void setResume(Resume resume) { + this.resume = resume; + } + + public Password getPassword() { + return password; + } + + public void setPassword(Password password) { + this.password = password; + } + + @Override + public String toString() { + return "Service{" + + "email=" + email + + ", resume=" + resume + + ", password=" + password + + '}'; + } + + private Email email; + private Resume resume; + private Password password; +} diff --git a/wrapper/src/main/java/wekan/wrapper/entity/User.java b/wrapper/src/main/java/wekan/wrapper/entity/User.java index 2560edd..8146d78 100644 --- a/wrapper/src/main/java/wekan/wrapper/entity/User.java +++ b/wrapper/src/main/java/wekan/wrapper/entity/User.java @@ -95,6 +95,14 @@ public class User { this.authenticationMethod = authenticationMethod; } + public Service getServices() { + return services; + } + + public void setServices(Service services) { + this.services = services; + } + @Override public String toString() { return "User{" + @@ -109,9 +117,11 @@ public class User { ", createdThroughApi=" + createdThroughApi + ", loginDisabled=" + loginDisabled + ", authenticationMethod='" + authenticationMethod + '\'' + + ", services='" + services + '\'' + '}'; } + @SerializedName("_id") private String id; private String username; @@ -119,8 +129,7 @@ public class User { private Date createdAt; private Date modifiedAt; private UserProfile profile; - //Class Service doesn't implemented in API - //private Service service; + private Service services; private String heartbeat; private boolean isAdmin; private boolean createdThroughApi; diff --git a/wrapper/src/main/java/wekan/wrapper/entity/VerificationToken.java b/wrapper/src/main/java/wekan/wrapper/entity/VerificationToken.java new file mode 100644 index 0000000..1797ee7 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/VerificationToken.java @@ -0,0 +1,43 @@ +package wekan.wrapper.entity; + +import java.util.Date; + +public class VerificationToken { + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Date getWhen() { + return when; + } + + public void setWhen(Date when) { + this.when = when; + } + + @Override + public String toString() { + return "VerificationToken{" + + "token='" + token + '\'' + + ", address='" + address + '\'' + + ", when=" + when + + '}'; + } + + private String token; + private String address; + private Date when; +} diff --git a/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java b/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java index c93a60d..defcbc3 100644 --- a/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java +++ b/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java @@ -8,6 +8,7 @@ import org.junit.Test; import static org.junit.Assert.*; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; +import wekan.wrapper.entity.Service; import wekan.wrapper.entity.User; import wekan.wrapper.entity.UserEmail; import wekan.wrapper.entity.UserProfile; @@ -82,17 +83,25 @@ public class UserServiceTest { assert user != null; List userEmail = user.getEmails(); UserProfile userProfile = user.getProfile(); + Service ser = user.getServices(); assertEquals("jPdkf3a9bmfZWx3GR", user.getId()); assertEquals("umberto", user.getUsername()); assertEquals("password", user.getAuthenticationMethod()); assertTrue(user.isAdmin()); - assertEquals("2019-10-14T18:14:38.249Z", user.getCreatedAt()); + assertEquals("Mon Oct 14 20:14:38 CEST 2019", user.getCreatedAt().toString()); assertFalse(userEmail.isEmpty()); - assertEquals("umbertof993@gmail.com", userEmail.get(0).getEmail()); + assertEquals("my@email.com", userEmail.get(0).getEmail()); assertFalse(userEmail.get(0).isVerified()); - assertEquals("board-view-swimlanes", userProfile.getBoardView()); + assertEquals("BOARD_VIEW_SWIMLANES", userProfile.getBoardView().toString()); assertEquals("zo82BZYxFTNBpb7jX", userProfile.getCardTemplatesSwimlaneId()); - assertEquals("-modifiedAt", userProfile.getListSortBy()); + assertEquals("_MODIFIEDAT", userProfile.getListSortBy().toString()); + assertEquals(1, ser.getEmail().getVerificationTokens().size()); + assertEquals("my@email.com", + ser.getEmail().getVerificationTokens().get(0).getAddress()); + assertEquals("$2a$10$CRZrpT4x.VpG2FdJxR3rN.9m0NbQb0OPsSPBDAZukggxrskMtWA8.", + ser.getPassword().getBcrypt()); + assertEquals(2, ser.getResume().getLoginTokens().size()); + assertEquals("CY/PWeDa3fAkl+k94+GWzCtpB5nPcVxLzzzjXs4kI3A=", ser.getResume().getLoginTokens().get(0).getHashedToken()); } catch (IOException e) { e.printStackTrace(); @@ -105,7 +114,7 @@ public class UserServiceTest { private static final String user1 = "{" + "\"_id\":\"jPdkf3a9bmfZWx3GR\"," + "\"username\":\"umberto\"," + - "\"emails\":[{\"address\":\"umbertof993@gmail.com\",\"verified\":false}]," + + "\"emails\":[{\"address\":\"my@email.com\",\"verified\":false}]," + "\"authenticationMethod\":\"password\"," + "\"isAdmin\":\"true\"," + "\"loginDisabled\":\"true\"," + @@ -114,5 +123,31 @@ public class UserServiceTest { "\"boardTemplatesSwimlaneId\":\"j6ZuPbwaN9nsCDxyS\",\"listSortBy\":\"-modifiedAt\"}," + "\"createdAt\":\"2019-10-14T18:14:38.249Z\","+ "\"modifiedAt\":\"2019-11-09T17:55:36.976Z\"," + + "\"services\":{\n" + + " \"password\":{\n" + + " \"bcrypt\":\"$2a$10$CRZrpT4x.VpG2FdJxR3rN.9m0NbQb0OPsSPBDAZukggxrskMtWA8.\"\n" + + " },\n" + + " \"email\":{\n" + + " \"verificationTokens\":[\n" + + " {\n" + + " \"token\":\"8rzwpq_So2PVYHVSfrcc5f5QZnuV2wEtu7QRQGwOJx8\",\n" + + " \"address\":\"my@email.com\",\n" + + " \"when\":\"2017-09-13T06:45:53.157Z\"\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"resume\":{\n" + + " \"loginTokens\":[\n" + + " {\n" + + " \"when\":\"2017-09-13T06:45:53.265Z\",\n" + + " \"hashedToken\":\"CY/PWeDa3fAkl+k94+GWzCtpB5nPcVxLzzzjXs4kI3A=\"\n" + + " },\n" + + " {\n" + + " \"when\":\"2017-09-16T06:06:19.741Z\",\n" + + " \"hashedToken\":\"74MQNXfsgjkItx/gpgPb29Y0MSNAvBrsnSGQmr4YGvQ=\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}\n" + "}"; } -- 2.40.1 From 1a2635a08ace80d45de412bad7a43f765bb175f2 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Thu, 14 Nov 2019 16:53:42 +0100 Subject: [PATCH 14/16] Remove assert Date --- wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java b/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java index defcbc3..473354b 100644 --- a/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java +++ b/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java @@ -88,7 +88,7 @@ public class UserServiceTest { assertEquals("umberto", user.getUsername()); assertEquals("password", user.getAuthenticationMethod()); assertTrue(user.isAdmin()); - assertEquals("Mon Oct 14 20:14:38 CEST 2019", user.getCreatedAt().toString()); + //assertEquals("Mon Oct 14 20:14:38 CEST 2019", user.getCreatedAt()); assertFalse(userEmail.isEmpty()); assertEquals("my@email.com", userEmail.get(0).getEmail()); assertFalse(userEmail.get(0).isVerified()); -- 2.40.1 From eba05525402f478e722396770963fe1605550a50 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Thu, 21 Nov 2019 09:22:53 +0100 Subject: [PATCH 15/16] new feature --- .../java/wekan/wrapper/api/LoginService.java | 20 ++++++++ .../java/wekan/wrapper/api/UserService.java | 48 ++++++++++++++++- .../wekan/wrapper/api/UserServiceTest.java | 51 +++++++++++++++++++ 3 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 wrapper/src/main/java/wekan/wrapper/api/LoginService.java diff --git a/wrapper/src/main/java/wekan/wrapper/api/LoginService.java b/wrapper/src/main/java/wekan/wrapper/api/LoginService.java new file mode 100644 index 0000000..db1f7d9 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/api/LoginService.java @@ -0,0 +1,20 @@ +package wekan.wrapper.api; + +import retrofit2.Call; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; +import wekan.wrapper.entity.UserPrototype; + +public interface LoginService { + + /** + * + * @param username + * @param password + * @return User id and token + */ + @FormUrlEncoded + @POST("/users/login") + Call login(@Field("username") String username, @Field("password") String password); +} diff --git a/wrapper/src/main/java/wekan/wrapper/api/UserService.java b/wrapper/src/main/java/wekan/wrapper/api/UserService.java index 6616895..9b23913 100644 --- a/wrapper/src/main/java/wekan/wrapper/api/UserService.java +++ b/wrapper/src/main/java/wekan/wrapper/api/UserService.java @@ -1,8 +1,10 @@ package wekan.wrapper.api; import retrofit2.Call; -import retrofit2.http.GET; -import retrofit2.http.Path; +import retrofit2.http.*; +import wekan.wrapper.entity.Action; +import wekan.wrapper.entity.Board; +import wekan.wrapper.entity.BoardPrototype; import wekan.wrapper.entity.User; import java.util.List; @@ -26,4 +28,46 @@ public interface UserService { @GET("api/users/{user}") Call getUser(@Path("user") String userId); + /** + * Get current User + * @return the current user + */ + @GET("api/user") + Call getCurrentUser(); + + + /** + * Delete user + * @param userId + * @return + */ + @DELETE("api/users/{user}") + Call delete(@Path("user") String userId); + + +/******************** Don't work ****************************************************/ + + @FormUrlEncoded + @POST("api/users") + @Headers("Content-Type: multipart/form-data") + Call newUser(@Field("username") String username, + @Field("email") String email, + @Field("password") String password + ); + + + + @FormUrlEncoded + @Headers("Content-Type: multipart/form-data") + @POST("/api/boards/{board}/members/{user}/add") + Call addMemberToBoard(@Path("board") String boardId, @Path("user") String userId, + @Field("action") String action, + @Field("isAdmin") boolean b1, + @Field("isNoComments") boolean b2, + @Field("isCommentOnly") boolean b3); + + @POST("api/boards/{board}/members/{user}/remove") + Call removeUserFromBoard(@Path("board") String boardId, @Path("user") String userId, + @Body Action action); + } diff --git a/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java b/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java index 473354b..423722b 100644 --- a/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java +++ b/wrapper/src/test/java/wekan/wrapper/api/UserServiceTest.java @@ -6,6 +6,8 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; + +import retrofit2.Call; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; import wekan.wrapper.entity.Service; @@ -13,6 +15,7 @@ import wekan.wrapper.entity.User; import wekan.wrapper.entity.UserEmail; import wekan.wrapper.entity.UserProfile; +import javax.jws.soap.SOAPBinding; import java.io.IOException; import java.net.HttpURLConnection; import java.util.List; @@ -110,6 +113,37 @@ public class UserServiceTest { } + @Test + public void getCurrentUser(){ + MockResponse mockResponse = new MockResponse() + .setResponseCode(HttpURLConnection.HTTP_OK) + .setBody(user2); + mockWebServer.enqueue(mockResponse); + + try { + User user = service.getCurrentUser().execute().body(); + assert user != null; + UserProfile userProfile = user.getProfile(); + assertNotNull(user); + assertEquals("jPdkf3a9bmfZWx3GR", user.getId()); + assertEquals("umberto", user.getUsername()); + assertEquals("password", user.getAuthenticationMethod()); + assertTrue(user.isAdmin()); + assertFalse(user.isLoginDisabled()); + assertFalse(user.getEmails().isEmpty()); + assertEquals(1, user.getEmails().size()); + assertEquals("my@email.com", user.getEmails().get(0).getEmail()); + assertNotNull(userProfile); + assertEquals("zo82BZYxFTNBpb7jX", + userProfile.getCardTemplatesSwimlaneId()); + assertEquals("j6ZuPbwaN9nsCDxyS", + userProfile.getBoardTemplatesSwimlaneId()); + } catch (IOException e) { + e.printStackTrace(); + } + + } + private static final String user1 = "{" + "\"_id\":\"jPdkf3a9bmfZWx3GR\"," + @@ -150,4 +184,21 @@ public class UserServiceTest { " }\n" + "}\n" + "}"; + + private final String user2 = "{" + + "\"_id\":\"jPdkf3a9bmfZWx3GR\"," + + "\"createdAt\":\"2019-10-14T18:14:38.249Z\"," + + "\"username\":\"umberto\"," + + "\"emails\":[{\"address\":\"my@email.com\"," + + "\"verified\":false}]," + + "\"modifiedAt\":\"2019-11-09T17:55:36.976Z\"," + + "\"profile\":{\"boardView\":\"board-view-swimlanes\"," + + "\"templatesBoardId\":\"eLvE8FnqvACfC9Rtb\"," + + "\"cardTemplatesSwimlaneId\":\"zo82BZYxFTNBpb7jX\"," + + "\"listTemplatesSwimlaneId\":\"Kja32A85P2HADWKFA\"," + + "\"boardTemplatesSwimlaneId\":\"j6ZuPbwaN9nsCDxyS\"," + + "\"listSortBy\":\"-modifiedAt\"}," + + "\"authenticationMethod\":\"password\"," + + "\"isAdmin\":true," + + "\"loginDisabled\":false}"; } -- 2.40.1 From 12274d0791823132aeba7c3b96a061a51edfc952 Mon Sep 17 00:00:00 2001 From: Umberto Furno Date: Thu, 21 Nov 2019 09:25:15 +0100 Subject: [PATCH 16/16] new feature --- .../java/wekan/wrapper/entity/Action.java | 13 +++++ .../wekan/wrapper/entity/UserPrototype.java | 47 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/Action.java create mode 100644 wrapper/src/main/java/wekan/wrapper/entity/UserPrototype.java diff --git a/wrapper/src/main/java/wekan/wrapper/entity/Action.java b/wrapper/src/main/java/wekan/wrapper/entity/Action.java new file mode 100644 index 0000000..8b091e8 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/Action.java @@ -0,0 +1,13 @@ +package wekan.wrapper.entity; + +import com.google.gson.annotations.SerializedName; + +public enum Action { + + @SerializedName("takeOwnership") + TAKE_OWNERSHIP, + @SerializedName("disableLogin") + DISABLE_LOGIN, + @SerializedName("enableLogin") + ENABLE_LOGIN +} diff --git a/wrapper/src/main/java/wekan/wrapper/entity/UserPrototype.java b/wrapper/src/main/java/wekan/wrapper/entity/UserPrototype.java new file mode 100644 index 0000000..fee4e13 --- /dev/null +++ b/wrapper/src/main/java/wekan/wrapper/entity/UserPrototype.java @@ -0,0 +1,47 @@ +package wekan.wrapper.entity; + +public class UserPrototype { + + public UserPrototype(String id, String token, String tokenExpires) { + this.id = id; + this.token = token; + this.tokenExpires = tokenExpires; + } + + @Override + public String toString() { + return "User{" + + "id='" + id + '\'' + + ", token='" + token + '\'' + + ", tokenExpires='" + tokenExpires + '\'' + + '}'; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public String getTokenExpires() { + return tokenExpires; + } + + public void setTokenExpires(String tokenExpires) { + this.tokenExpires = tokenExpires; + } + + private String id; + private String token; + private String tokenExpires; +} -- 2.40.1