From daaf2070c76edfc9a0464ee7691ea5c8bc2eaa2a Mon Sep 17 00:00:00 2001 From: aisensiy Date: Wed, 16 Aug 2017 16:25:08 +0800 Subject: [PATCH] save follow --- src/main/java/io/spring/api/ProfileApi.java | 17 +++++++++++++++- .../io/spring/core/user/FollowRelation.java | 17 ++++++++++++++++ .../io/spring/core/user/UserRepository.java | 4 ++++ .../user/MyBatisUserRepository.java | 11 ++++++++++ .../infrastructure/user/UserMapper.java | 5 +++++ src/main/resources/mapper/UserMapper.xml | 15 ++++++++++++++ .../java/io/spring/api/ProfileApiTest.java | 20 ++++++++++++++++++- .../user/MyBatisUserRepositoryTest.java | 11 ++++++++++ 8 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/spring/core/user/FollowRelation.java diff --git a/src/main/java/io/spring/api/ProfileApi.java b/src/main/java/io/spring/api/ProfileApi.java index ec55dab..4873e54 100644 --- a/src/main/java/io/spring/api/ProfileApi.java +++ b/src/main/java/io/spring/api/ProfileApi.java @@ -3,12 +3,15 @@ package io.spring.api; import io.spring.api.exception.ResourceNotFoundException; import io.spring.application.profile.ProfileData; import io.spring.application.profile.ProfileQueryService; +import io.spring.core.user.FollowRelation; import io.spring.core.user.User; +import io.spring.core.user.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,10 +21,12 @@ import java.util.HashMap; @RequestMapping(path = "profiles/{username}") public class ProfileApi { private ProfileQueryService profileQueryService; + private UserRepository userRepository; @Autowired - public ProfileApi(ProfileQueryService profileQueryService) { + public ProfileApi(ProfileQueryService profileQueryService, UserRepository userRepository) { this.profileQueryService = profileQueryService; + this.userRepository = userRepository; } @GetMapping @@ -32,6 +37,16 @@ public class ProfileApi { .orElseThrow(ResourceNotFoundException::new); } + @PostMapping(path = "follow") + public ResponseEntity follow(@PathVariable("username") String username, + @AuthenticationPrincipal User user) { + return userRepository.findByUsername(username).map(target -> { + FollowRelation followRelation = new FollowRelation(user.getId(), target.getId()); + userRepository.saveRelation(followRelation); + return profileResponse(profileQueryService.findByUsername(username, user).get()); + }).orElseThrow(ResourceNotFoundException::new); + } + private ResponseEntity profileResponse(ProfileData profile) { return ResponseEntity.ok(new HashMap() {{ put("profile", profile); diff --git a/src/main/java/io/spring/core/user/FollowRelation.java b/src/main/java/io/spring/core/user/FollowRelation.java new file mode 100644 index 0000000..c9471a1 --- /dev/null +++ b/src/main/java/io/spring/core/user/FollowRelation.java @@ -0,0 +1,17 @@ +package io.spring.core.user; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class FollowRelation { + private String userId; + private String targetId; + + public FollowRelation(String userId, String targetId) { + + this.userId = userId; + this.targetId = targetId; + } +} diff --git a/src/main/java/io/spring/core/user/UserRepository.java b/src/main/java/io/spring/core/user/UserRepository.java index da4675f..d26465c 100644 --- a/src/main/java/io/spring/core/user/UserRepository.java +++ b/src/main/java/io/spring/core/user/UserRepository.java @@ -13,4 +13,8 @@ public interface UserRepository { Optional findByUsername(String username); Optional findByEmail(String email); + + void saveRelation(FollowRelation followRelation); + + Optional findRelation(String userId, String targetId); } diff --git a/src/main/java/io/spring/infrastructure/user/MyBatisUserRepository.java b/src/main/java/io/spring/infrastructure/user/MyBatisUserRepository.java index 11e187b..00ce438 100644 --- a/src/main/java/io/spring/infrastructure/user/MyBatisUserRepository.java +++ b/src/main/java/io/spring/infrastructure/user/MyBatisUserRepository.java @@ -1,5 +1,6 @@ package io.spring.infrastructure.user; +import io.spring.core.user.FollowRelation; import io.spring.core.user.User; import io.spring.core.user.UserRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -39,4 +40,14 @@ public class MyBatisUserRepository implements UserRepository { public Optional findByEmail(String email) { return Optional.ofNullable(userMapper.findByEmail(email)); } + + @Override + public void saveRelation(FollowRelation followRelation) { + userMapper.saveRelation(followRelation); + } + + @Override + public Optional findRelation(String userId, String targetId) { + return Optional.ofNullable(userMapper.findRelation(userId, targetId)); + } } diff --git a/src/main/java/io/spring/infrastructure/user/UserMapper.java b/src/main/java/io/spring/infrastructure/user/UserMapper.java index 35df97a..7ce8170 100644 --- a/src/main/java/io/spring/infrastructure/user/UserMapper.java +++ b/src/main/java/io/spring/infrastructure/user/UserMapper.java @@ -1,5 +1,6 @@ package io.spring.infrastructure.user; +import io.spring.core.user.FollowRelation; import io.spring.core.user.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -16,4 +17,8 @@ public interface UserMapper { User findById(@Param("id") String id); void update(@Param("user") User user); + + FollowRelation findRelation(@Param("userId") String userId, @Param("targetId") String targetId); + + void saveRelation(@Param("followRelation") FollowRelation followRelation); } diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml index bde0228..cf7160b 100644 --- a/src/main/resources/mapper/UserMapper.xml +++ b/src/main/resources/mapper/UserMapper.xml @@ -11,6 +11,9 @@ #{user.image} ) + + insert into follows(user_id, follow_id) values (#{followRelation.userId}, #{followRelation.targetId}) + update users @@ -31,6 +34,18 @@ + + + + + + diff --git a/src/test/java/io/spring/api/ProfileApiTest.java b/src/test/java/io/spring/api/ProfileApiTest.java index 688ecea..663cea7 100644 --- a/src/test/java/io/spring/api/ProfileApiTest.java +++ b/src/test/java/io/spring/api/ProfileApiTest.java @@ -5,6 +5,7 @@ import io.spring.application.profile.ProfileData; import io.spring.application.profile.ProfileQueryService; import io.spring.core.article.Article; import io.spring.core.user.User; +import io.spring.core.user.UserRepository; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -15,6 +16,7 @@ import org.springframework.test.context.junit4.SpringRunner; import java.util.Optional; +import static io.restassured.RestAssured.given; import static org.hamcrest.core.IsEqual.equalTo; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; @@ -29,13 +31,15 @@ public class ProfileApiTest extends TestWithCurrentUser { @MockBean private ProfileQueryService profileQueryService; + private ProfileData profileData; @Before public void setUp() throws Exception { RestAssured.port = port; userFixture(); - profileData = new ProfileData("id", "username", "bio", "img", false); + anotherUser = new User("username@test.com", "username", "123", "", ""); + profileData = new ProfileData(anotherUser.getId(), anotherUser.getUsername(), anotherUser.getBio(), anotherUser.getImage(), false); } @Test @@ -49,4 +53,18 @@ public class ProfileApiTest extends TestWithCurrentUser { .statusCode(200) .body("profile.username", equalTo(profileData.getUsername())); } + + @Test + public void should_follow_user_success() throws Exception { + when(userRepository.findByUsername(eq(anotherUser.getUsername()))).thenReturn(Optional.of(anotherUser)); + when(profileQueryService.findByUsername(eq(profileData.getUsername()), eq(user))).thenReturn(Optional.of(profileData)); + given() + .header("Authorization", "Token " + token) + .when() + .post("/profiles/{username}/follow", anotherUser.getUsername()) + .prettyPeek() + .then() + .statusCode(200); + + } } \ No newline at end of file diff --git a/src/test/java/io/spring/infrastructure/user/MyBatisUserRepositoryTest.java b/src/test/java/io/spring/infrastructure/user/MyBatisUserRepositoryTest.java index 7b3e0a2..ef72d4c 100644 --- a/src/test/java/io/spring/infrastructure/user/MyBatisUserRepositoryTest.java +++ b/src/test/java/io/spring/infrastructure/user/MyBatisUserRepositoryTest.java @@ -1,5 +1,6 @@ package io.spring.infrastructure.user; +import io.spring.core.user.FollowRelation; import io.spring.core.user.User; import io.spring.core.user.UserRepository; import org.junit.Before; @@ -54,4 +55,14 @@ public class MyBatisUserRepositoryTest { assertThat(optional.get().getUsername(), is(newUsername)); assertThat(optional.get().getImage(), is(user.getImage())); } + + @Test + public void should_create_new_user_follow_success() throws Exception { + User other = new User("other@example.com", "other", "123", "", ""); + userRepository.save(other); + + FollowRelation followRelation = new FollowRelation(user.getId(), other.getId()); + userRepository.saveRelation(followRelation); + assertThat(userRepository.findRelation(user.getId(), other.getId()).isPresent(), is(true)); + } } \ No newline at end of file