From 72a4b58d7198daf7a4d73fa87204fcbd226bbfaf Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Sun, 18 Dec 2022 13:42:46 +0100 Subject: [PATCH 1/5] feat: created `GitHubUserDTO` --- .../pakland/mdas/githubstats/domain/entity/User.java | 2 -- .../infrastructure/github/model/GitHubUserDTO.java | 11 +++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/pakland/mdas/githubstats/infrastructure/github/model/GitHubUserDTO.java diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/entity/User.java b/src/main/java/io/pakland/mdas/githubstats/domain/entity/User.java index 8df91936..1415ac7d 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/entity/User.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/entity/User.java @@ -18,11 +18,9 @@ public class User { @Id @Column(updatable = false, nullable = false) - @JsonProperty("id") private Integer id; @Column(name = "login") - @JsonProperty("login") private String login; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/model/GitHubUserDTO.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/model/GitHubUserDTO.java new file mode 100644 index 00000000..a4d23e92 --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/model/GitHubUserDTO.java @@ -0,0 +1,11 @@ +package io.pakland.mdas.githubstats.infrastructure.github.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class GitHubUserDTO { + @JsonProperty("id") + private Integer id; + + @JsonProperty("login") + private String login; +} From 604a19f9183ff13871ac2b87ad54a8a1ec598faf Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Sun, 18 Dec 2022 13:44:26 +0100 Subject: [PATCH 2/5] feat: added `UserDTO` interface --- .../mdas/githubstats/application/dto/UserDTO.java | 6 ++++++ .../infrastructure/github/model/GitHubUserDTO.java | 11 ++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/pakland/mdas/githubstats/application/dto/UserDTO.java diff --git a/src/main/java/io/pakland/mdas/githubstats/application/dto/UserDTO.java b/src/main/java/io/pakland/mdas/githubstats/application/dto/UserDTO.java new file mode 100644 index 00000000..22f0e557 --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/application/dto/UserDTO.java @@ -0,0 +1,6 @@ +package io.pakland.mdas.githubstats.application.dto; + +public interface UserDTO { + Integer getId(); + String getLogin(); +} diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/model/GitHubUserDTO.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/model/GitHubUserDTO.java index a4d23e92..4e11c701 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/model/GitHubUserDTO.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/model/GitHubUserDTO.java @@ -1,11 +1,20 @@ package io.pakland.mdas.githubstats.infrastructure.github.model; import com.fasterxml.jackson.annotation.JsonProperty; +import io.pakland.mdas.githubstats.application.dto.UserDTO; -public class GitHubUserDTO { +public class GitHubUserDTO implements UserDTO { @JsonProperty("id") private Integer id; @JsonProperty("login") private String login; + + public Integer getId() { + return this.id; + } + + public String getLogin() { + return this.login; + } } From 42ef12d7031004fe1fcc21932179771d6627c2b4 Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Sun, 18 Dec 2022 13:46:11 +0100 Subject: [PATCH 3/5] feat: add `UserMapper` --- .../githubstats/application/mappers/UserMapper.java | 10 ++++++++++ .../pakland/mdas/githubstats/domain/entity/User.java | 5 ++--- 2 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 src/main/java/io/pakland/mdas/githubstats/application/mappers/UserMapper.java diff --git a/src/main/java/io/pakland/mdas/githubstats/application/mappers/UserMapper.java b/src/main/java/io/pakland/mdas/githubstats/application/mappers/UserMapper.java new file mode 100644 index 00000000..e3145b56 --- /dev/null +++ b/src/main/java/io/pakland/mdas/githubstats/application/mappers/UserMapper.java @@ -0,0 +1,10 @@ +package io.pakland.mdas.githubstats.application.mappers; + +import io.pakland.mdas.githubstats.application.dto.UserDTO; +import io.pakland.mdas.githubstats.domain.entity.User; + +public class UserMapper { + public static User dtoToEntity(UserDTO dto) { + return User.builder().id(dto.getId()).login(dto.getLogin()).build(); + } +} diff --git a/src/main/java/io/pakland/mdas/githubstats/domain/entity/User.java b/src/main/java/io/pakland/mdas/githubstats/domain/entity/User.java index 1415ac7d..6ebbec64 100644 --- a/src/main/java/io/pakland/mdas/githubstats/domain/entity/User.java +++ b/src/main/java/io/pakland/mdas/githubstats/domain/entity/User.java @@ -1,9 +1,7 @@ package io.pakland.mdas.githubstats.domain.entity; import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import javax.persistence.*; import java.util.ArrayList; @@ -12,6 +10,7 @@ @Data @NoArgsConstructor @AllArgsConstructor +@Builder @Entity @Table(name = "user") public class User { From 8e11b75a01da50d2a1fcbe3c07876813b1be009d Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Sun, 18 Dec 2022 13:50:26 +0100 Subject: [PATCH 4/5] test: add mapper tests --- .../application/mappers/UserMapperTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/test/java/io/pakland/mdas/githubstats/application/mappers/UserMapperTest.java diff --git a/src/test/java/io/pakland/mdas/githubstats/application/mappers/UserMapperTest.java b/src/test/java/io/pakland/mdas/githubstats/application/mappers/UserMapperTest.java new file mode 100644 index 00000000..5d83fbee --- /dev/null +++ b/src/test/java/io/pakland/mdas/githubstats/application/mappers/UserMapperTest.java @@ -0,0 +1,24 @@ +package io.pakland.mdas.githubstats.application.mappers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import io.pakland.mdas.githubstats.application.dto.UserDTO; +import io.pakland.mdas.githubstats.domain.entity.User; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +public class UserMapperTest { + @Test + public void shouldConvertDtoToEntity() { + UserDTO dto = Mockito.mock(UserDTO.class); + Mockito.when(dto.getId()).thenReturn(1); + Mockito.when(dto.getLogin()).thenReturn("github-stats"); + + User entity = UserMapper.dtoToEntity(dto); + + assertEquals(1, (int) entity.getId()); + assertEquals("github-stats", entity.getLogin()); + } + +} From ec46cdbf1bdcce0217178ab34bf8019283979455 Mon Sep 17 00:00:00 2001 From: Miquel de Domingo Date: Sun, 18 Dec 2022 19:45:09 +0100 Subject: [PATCH 5/5] fix: use user dto mapper when fetching data --- .../external/FetchUsersFromTeam.java | 2 +- .../application/mappers/UserMapper.java | 9 +++++++- .../repository/UserGitHubRepository.java | 21 +++++++++++-------- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/pakland/mdas/githubstats/application/external/FetchUsersFromTeam.java b/src/main/java/io/pakland/mdas/githubstats/application/external/FetchUsersFromTeam.java index b541bcbc..361f4293 100644 --- a/src/main/java/io/pakland/mdas/githubstats/application/external/FetchUsersFromTeam.java +++ b/src/main/java/io/pakland/mdas/githubstats/application/external/FetchUsersFromTeam.java @@ -7,7 +7,7 @@ import java.util.List; public class FetchUsersFromTeam { - private UserExternalRepository userExternalRepository; + private final UserExternalRepository userExternalRepository; public FetchUsersFromTeam(UserExternalRepository userExternalRepository) { diff --git a/src/main/java/io/pakland/mdas/githubstats/application/mappers/UserMapper.java b/src/main/java/io/pakland/mdas/githubstats/application/mappers/UserMapper.java index e3145b56..95824dec 100644 --- a/src/main/java/io/pakland/mdas/githubstats/application/mappers/UserMapper.java +++ b/src/main/java/io/pakland/mdas/githubstats/application/mappers/UserMapper.java @@ -2,9 +2,16 @@ import io.pakland.mdas.githubstats.application.dto.UserDTO; import io.pakland.mdas.githubstats.domain.entity.User; +import java.util.ArrayList; public class UserMapper { public static User dtoToEntity(UserDTO dto) { - return User.builder().id(dto.getId()).login(dto.getLogin()).build(); + return User.builder() + .id(dto.getId()) + .login(dto.getLogin()) + .userReviews(new ArrayList<>()) + .commits(new ArrayList<>()) + .pullRequests(new ArrayList<>()) + .build(); } } diff --git a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/repository/UserGitHubRepository.java b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/repository/UserGitHubRepository.java index 10ed8c8e..97c5a835 100644 --- a/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/repository/UserGitHubRepository.java +++ b/src/main/java/io/pakland/mdas/githubstats/infrastructure/github/repository/UserGitHubRepository.java @@ -1,15 +1,16 @@ package io.pakland.mdas.githubstats.infrastructure.github.repository; import io.pakland.mdas.githubstats.application.exceptions.HttpException; +import io.pakland.mdas.githubstats.application.mappers.UserMapper; import io.pakland.mdas.githubstats.domain.entity.User; import io.pakland.mdas.githubstats.domain.repository.UserExternalRepository; +import io.pakland.mdas.githubstats.infrastructure.github.model.GitHubUserDTO; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; import org.springframework.web.reactive.function.client.WebClientResponseException; -import java.util.List; - @Repository public class UserGitHubRepository implements UserExternalRepository { @@ -21,15 +22,17 @@ public UserGitHubRepository(WebClientConfiguration webClientConfiguration) { } @Override - public List fetchUsersFromTeam(String organizationName, String teamName) throws HttpException { + public List fetchUsersFromTeam(String organizationName, String teamName) + throws HttpException { try { return this.webClientConfiguration.getWebClient().get() - .uri(String.format("/orgs/%s/teams/%s/members", organizationName, teamName)) - .retrieve() - .bodyToFlux(User.class) - .collectList() - .block(); - } catch (WebClientResponseException ex) { + .uri(String.format("/orgs/%s/teams/%s/members", organizationName, teamName)) + .retrieve() + .bodyToFlux(GitHubUserDTO.class) + .map(UserMapper::dtoToEntity) + .collectList() + .block(); + } catch (WebClientResponseException ex) { logger.error(ex.toString()); throw new HttpException(ex.getRawStatusCode(), ex.getMessage()); }