From 09acdf67315971ef088251fd5b7953f66d45c482 Mon Sep 17 00:00:00 2001 From: xb205 <62425964+devxb@users.noreply.github.com> Date: Wed, 3 Jan 2024 18:51:50 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=EC=9D=98=20=EC=B9=9C?= =?UTF-8?q?=EA=B5=AC=20=EC=A1=B0=ED=9A=8C=20API=20(#27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * test: 친구 조회 통합테스트를 작성한다 * feat: 유저의 친구 조회 기능을 개발한다 --- .../user/controller/UserController.java | 6 +++ .../user/domain/response/FriendsResponse.java | 54 +++++++++++++++++++ .../teumteum/user/service/UserService.java | 8 +++ .../java/net/teumteum/integration/Api.java | 7 +++ .../integration/UserIntegrationTest.java | 52 ++++++++++++++++++ 5 files changed, 127 insertions(+) create mode 100644 src/main/java/net/teumteum/user/domain/response/FriendsResponse.java diff --git a/src/main/java/net/teumteum/user/controller/UserController.java b/src/main/java/net/teumteum/user/controller/UserController.java index e5018666..89f28b84 100644 --- a/src/main/java/net/teumteum/user/controller/UserController.java +++ b/src/main/java/net/teumteum/user/controller/UserController.java @@ -5,6 +5,7 @@ import net.teumteum.core.context.LoginContext; import net.teumteum.core.error.ErrorResponse; import net.teumteum.user.domain.request.UserUpdateRequest; +import net.teumteum.user.domain.response.FriendsResponse; import net.teumteum.user.domain.response.UserGetResponse; import net.teumteum.user.domain.response.UsersGetByIdResponse; import net.teumteum.user.service.UserService; @@ -56,6 +57,11 @@ public void addFriend(@PathVariable("friendId") Long friendId) { userService.addFriends(loginContext.getUserId(), friendId); } + @GetMapping("/{userId}/friends") + @ResponseStatus(HttpStatus.OK) + public FriendsResponse findFriends(@PathVariable("userId") Long userId) { + return userService.findFriendsByUserId(userId); + } @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) diff --git a/src/main/java/net/teumteum/user/domain/response/FriendsResponse.java b/src/main/java/net/teumteum/user/domain/response/FriendsResponse.java new file mode 100644 index 00000000..5dbe6b54 --- /dev/null +++ b/src/main/java/net/teumteum/user/domain/response/FriendsResponse.java @@ -0,0 +1,54 @@ +package net.teumteum.user.domain.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; +import net.teumteum.user.domain.User; + +public record FriendsResponse( + List friends +) { + + public static FriendsResponse of(List users) { + return new FriendsResponse( + users.stream() + .map(Friend::of) + .toList() + ); + } + + public record Friend( + Long id, + Long characterId, + String name, + Job job + ) { + + public static Friend of(User user) { + return new Friend( + user.getId(), + user.getCharacterId(), + user.getName(), + Job.of(user) + ); + } + + public record Job( + String name, + boolean certificated, + @JsonProperty("class") + String jobClass, + String detailClass + ) { + + public static Job of(User user) { + return new Job( + user.getJob().getName(), + user.getJob().isCertificated(), + user.getJob().getJobClass(), + user.getJob().getDetailJobClass() + ); + } + } + } + +} diff --git a/src/main/java/net/teumteum/user/service/UserService.java b/src/main/java/net/teumteum/user/service/UserService.java index cdd9e588..e6a349c7 100644 --- a/src/main/java/net/teumteum/user/service/UserService.java +++ b/src/main/java/net/teumteum/user/service/UserService.java @@ -5,6 +5,7 @@ import net.teumteum.user.domain.User; import net.teumteum.user.domain.UserRepository; import net.teumteum.user.domain.request.UserUpdateRequest; +import net.teumteum.user.domain.response.FriendsResponse; import net.teumteum.user.domain.response.UserGetResponse; import net.teumteum.user.domain.response.UsersGetByIdResponse; import org.springframework.stereotype.Service; @@ -52,6 +53,13 @@ public void addFriends(Long myId, Long friendId) { me.addFriend(friend); } + public FriendsResponse findFriendsByUserId(Long userId) { + var user = getUser(userId); + var friends = userRepository.findAllById(user.getFriends()); + + return FriendsResponse.of(friends); + } + private User getUser(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new IllegalArgumentException("userId에 해당하는 user를 찾을 수 없습니다. \"" + userId + "\"")); diff --git a/src/test/java/net/teumteum/integration/Api.java b/src/test/java/net/teumteum/integration/Api.java index 5973cf0b..8c0a22b9 100644 --- a/src/test/java/net/teumteum/integration/Api.java +++ b/src/test/java/net/teumteum/integration/Api.java @@ -52,6 +52,13 @@ ResponseSpec addFriends(String token, Long friendId) { .exchange(); } + ResponseSpec getFriendsByUserId(String token, Long userId) { + return webTestClient.get() + .uri("/users/" + userId + "/friends") + .header(HttpHeaders.AUTHORIZATION, token) + .exchange(); + } + ResponseSpec getOpenMeetings(String token, Long cursorId, int size) { return webTestClient.get() .uri("/meetings" + diff --git a/src/test/java/net/teumteum/integration/UserIntegrationTest.java b/src/test/java/net/teumteum/integration/UserIntegrationTest.java index f57e1b56..b136783d 100644 --- a/src/test/java/net/teumteum/integration/UserIntegrationTest.java +++ b/src/test/java/net/teumteum/integration/UserIntegrationTest.java @@ -2,6 +2,7 @@ import java.util.List; import net.teumteum.core.error.ErrorResponse; +import net.teumteum.user.domain.response.FriendsResponse; import net.teumteum.user.domain.response.UserGetResponse; import net.teumteum.user.domain.response.UsersGetByIdResponse; import org.assertj.core.api.Assertions; @@ -144,4 +145,55 @@ void Return_200_ok_with_success_make_friends() { result.expectStatus().isOk(); } } + + @Nested + @DisplayName("친구 조회 API는") + class Find_friends_api { + + @Test + @DisplayName("user의 id를 입력받으면, id에 해당하는 user의 친구 목록을 반환한다.") + void Return_friends_when_received_user_id() { + // given + var me = repository.saveAndGetUser(); + var friend1 = repository.saveAndGetUser(); + var friend2 = repository.saveAndGetUser(); + + loginContext.setUserId(me.getId()); + api.addFriends(VALID_TOKEN, friend1.getId()); + api.addFriends(VALID_TOKEN, friend2.getId()); + + var expected = FriendsResponse.of(List.of(friend1, friend2)); + + // when + var result = api.getFriendsByUserId(VALID_TOKEN, me.getId()); + + // then + Assertions.assertThat(result.expectStatus().isOk() + .expectBody(FriendsResponse.class) + .returnResult() + .getResponseBody()) + .usingRecursiveComparison().isEqualTo(expected); + } + + @Test + @DisplayName("user의 id를 입력받았을때, 친구가 한명도 없다면, 빈 목록을 반환한다.") + void Return_empty_friends_when_received_empty_friends_user_id() { + // given + var me = repository.saveAndGetUser(); + + loginContext.setUserId(me.getId()); + + var expected = FriendsResponse.of(List.of()); + + // when + var result = api.getFriendsByUserId(VALID_TOKEN, me.getId()); + + // then + Assertions.assertThat(result.expectStatus().isOk() + .expectBody(FriendsResponse.class) + .returnResult() + .getResponseBody()) + .usingRecursiveComparison().isEqualTo(expected); + } + } }