Skip to content

Commit e7ae564

Browse files
committed
feat: 본인 정보 조회 api 구현
1 parent 5edd8f3 commit e7ae564

File tree

5 files changed

+146
-1
lines changed

5 files changed

+146
-1
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package apptive.team5.user.controller;
2+
3+
import apptive.team5.user.dto.UserResponse;
4+
import apptive.team5.user.service.UserService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.HttpStatus;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.bind.annotation.RestController;
12+
13+
@RestController
14+
@RequestMapping("/api/users")
15+
@RequiredArgsConstructor
16+
public class UserController {
17+
18+
private final UserService userService;
19+
20+
@GetMapping("/my")
21+
public ResponseEntity<UserResponse> getMyInfo(@AuthenticationPrincipal String identifier) {
22+
23+
UserResponse response = userService.getUserInfo(identifier);
24+
25+
return ResponseEntity.status(HttpStatus.OK).body(response);
26+
}
27+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package apptive.team5.user.dto;
2+
3+
import apptive.team5.user.domain.SocialType;
4+
import apptive.team5.user.domain.UserEntity;
5+
import apptive.team5.user.domain.UserRoleType;
6+
7+
public record UserResponse(
8+
String username,
9+
String identifier,
10+
String email,
11+
String profileImageUrl,
12+
UserRoleType userRoleType,
13+
SocialType socialType
14+
) {
15+
16+
public UserResponse(UserEntity userEntity) {
17+
this(userEntity.getUsername(), userEntity.getIdentifier(), userEntity.getEmail(),
18+
userEntity.getProfileImageUrl(), userEntity.getRoleType(), userEntity.getSocialType());
19+
}
20+
}

src/main/java/apptive/team5/user/service/UserService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import apptive.team5.oauth2.dto.OAuth2Response;
88
import apptive.team5.user.domain.UserEntity;
99
import apptive.team5.user.domain.UserRoleType;
10+
import apptive.team5.user.dto.UserResponse;
1011
import lombok.RequiredArgsConstructor;
1112
import org.springframework.stereotype.Service;
1213
import org.springframework.transaction.annotation.Transactional;
@@ -40,5 +41,11 @@ public TokenResponse socialLogin(OAuth2Response oAuth2Response) {
4041
return new TokenResponse(accessToken, refreshToken);
4142
}
4243

44+
public UserResponse getUserInfo(String identifier) {
45+
UserEntity findUser = userLowService.findByIdentifier(identifier);
46+
47+
return new UserResponse(findUser);
48+
}
49+
4350

4451
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package apptive.team5.user.controller;
2+
3+
import apptive.team5.global.exception.ExceptionCode;
4+
import apptive.team5.jwt.TokenType;
5+
import apptive.team5.jwt.component.JWTUtil;
6+
import apptive.team5.user.domain.UserEntity;
7+
import apptive.team5.user.dto.UserResponse;
8+
import apptive.team5.user.repository.UserRepository;
9+
import apptive.team5.util.TestUtil;
10+
import apptive.team5.util.mockuser.WithCustomMockUser;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
import org.assertj.core.api.SoftAssertions;
13+
import org.junit.jupiter.api.DisplayName;
14+
import org.junit.jupiter.api.Test;
15+
import org.springframework.beans.factory.annotation.Autowired;
16+
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
17+
import org.springframework.boot.test.context.SpringBootTest;
18+
import org.springframework.http.HttpStatus;
19+
import org.springframework.mock.web.MockHttpServletResponse;
20+
import org.springframework.test.web.servlet.MockMvc;
21+
import org.springframework.test.web.servlet.assertj.MockMvcTester;
22+
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
23+
import org.springframework.transaction.annotation.Transactional;
24+
25+
import java.util.Map;
26+
27+
import static org.assertj.core.api.SoftAssertions.*;
28+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
29+
30+
31+
@SpringBootTest
32+
@AutoConfigureMockMvc
33+
@Transactional
34+
class UserControllerTest {
35+
36+
@Autowired
37+
private MockMvc mockMvc;
38+
39+
@Autowired
40+
private UserRepository userRepository;
41+
42+
@Autowired
43+
private JWTUtil jwtUtil;
44+
45+
@Autowired
46+
private ObjectMapper objectMapper;
47+
48+
49+
@DisplayName("회원 정보 조회 성공")
50+
@Test
51+
@WithCustomMockUser(identifier = TestUtil.userIdentifier)
52+
void getMyInfoSuccess() throws Exception {
53+
54+
UserEntity user = TestUtil.makeUserEntity();
55+
userRepository.save(user);
56+
57+
String response = mockMvc.perform(get("/api/users/my"))
58+
.andReturn().getResponse().getContentAsString();
59+
60+
UserResponse userResponse = objectMapper.readValue(response, UserResponse.class);
61+
62+
assertSoftly(softly -> {
63+
softly.assertThat(userResponse.email()).isEqualTo(user.getEmail());
64+
softly.assertThat(userResponse.identifier()).isEqualTo(user.getIdentifier());
65+
softly.assertThat(userResponse.socialType()).isEqualTo(user.getSocialType());
66+
softly.assertThat(userResponse.userRoleType()).isEqualTo(user.getRoleType());
67+
softly.assertThat(userResponse.profileImageUrl()).isEqualTo(user.getProfileImageUrl());
68+
});
69+
}
70+
71+
@DisplayName("회원 정보 조회 실패 - 존재하지 않는 회원")
72+
@Test
73+
@WithCustomMockUser
74+
void getMyInfoFail() throws Exception {
75+
76+
77+
MockHttpServletResponse response = mockMvc.perform(get("/api/users/my"))
78+
.andReturn().getResponse();
79+
80+
String content = response.getContentAsString();
81+
82+
83+
assertSoftly(softly -> {
84+
softly.assertThat(response.getStatus()).isEqualTo(HttpStatus.NOT_FOUND.value());
85+
softly.assertThat(content.contains(ExceptionCode.NOT_FOUND_USER.getDescription()));
86+
});
87+
88+
}
89+
90+
91+
}

src/test/java/apptive/team5/util/mockuser/WithCustomMockUser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
)
1414
public @interface WithCustomMockUser {
1515

16-
String identifier() default "GOOGLE_1234";
16+
String identifier() default "GOOGLE-1234";
1717
String role() default "ROLE_USER";
1818
}

0 commit comments

Comments
 (0)