Skip to content

Commit

Permalink
Merge branch 'develop' into iss-#7
Browse files Browse the repository at this point in the history
  • Loading branch information
choidongkuen authored Jan 6, 2024
2 parents b68ca54 + 09acdf6 commit 6477a2a
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import net.teumteum.core.error.ErrorResponse;
import net.teumteum.core.security.service.SecurityService;
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;
Expand Down Expand Up @@ -50,6 +51,11 @@ public void addFriend(@PathVariable("friendId") Long friendId) {
userService.addFriends(getCurrentUserId(), 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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Friend> friends
) {

public static FriendsResponse of(List<User> 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()
);
}
}
}

}
8 changes: 8 additions & 0 deletions src/main/java/net/teumteum/user/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 + "\""));
Expand Down
7 changes: 7 additions & 0 deletions src/test/java/net/teumteum/integration/Api.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,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" +
Expand Down
52 changes: 52 additions & 0 deletions src/test/java/net/teumteum/integration/UserIntegrationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import net.teumteum.core.error.ErrorResponse;
import net.teumteum.user.domain.User;
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;
Expand Down Expand Up @@ -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);
}
}
}

0 comments on commit 6477a2a

Please sign in to comment.