본문 바로가기
Project/깃터디 (gitudy)

[깃터디/Auth] 회원 정보 조회 구현

by J-rain 2024. 5. 10.

 

 

💡 .java를 클릭시 관련 커밋으로 이동💡

 

/auth/info

@AuthenticationPrincipal 사용하여 인증된 사용자의 정보 → 역할 확인(UNAUNTH 면 예외 처리)→ platformId + platformType 으로 DB에 저장된 값 조회 → 없으면 예외처리 → 사용자 정보 조회

 

 

AuthController.java

@ApiResponse(responseCode = "200", description = "회원 정보 조회 성공", content = @Content(schema = @Schema(implementation = UserInfoResponse.class)))
@GetMapping("/info")
    public JsonResult<UserInfoResponse> userInfo(@AuthenticationPrincipal User user) {

        if (user.getRole() == UNAUTH) {
            return JsonResult.failOf(ExceptionMessage.UNAUTHORIZED_AUTHORITY.getText());
        }

        UserInfoResponse userInfoResponse = authService.getUserByInfo(user.getPlatformId(), user.getPlatformType());

        return JsonResult.successOf(userInfoResponse);
    }

회원 정보 조회 api Controller 구현

 

 

UserInfoResponse.java

@Getter
public class UserInfoResponse {
    private UserRole role;
    private String githubId;
    private String name;
    private String profileImageUrl;
    private boolean pushAlarmYn;
    private boolean profilePublicYn;
    private int score;
    private int point;

    @Builder
    public UserInfoResponse(UserRole role, String githubId, String name, String profileImageUrl, boolean pushAlarmYn, boolean profilePublicYn, int score, int point) {
        this.role = role;
        this.githubId = githubId;
        this.name = name;
        this.profileImageUrl = profileImageUrl;
        this.pushAlarmYn = pushAlarmYn;
        this.profilePublicYn = profilePublicYn;
        this.score = score;
        this.point = point;
    }

    public static UserInfoResponse of(User user){
        return UserInfoResponse.builder()
                .role(user.getRole())
                .githubId(user.getGithubId())
                .name(user.getName())
                .profileImageUrl(user.getProfileImageUrl())
                .pushAlarmYn(user.isPushAlarmYn())
                .profilePublicYn(user.isProfilePublicYn())
                .score(user.getScore())
                .point(user.getPoint())
                .build();
    }
}

유저에게 보여줄 정보 DTO 추가

 

 

AuthService.java

 public UserInfoResponse getUserByInfo(String platformId, UserPlatformType platformType) {

        User userInfoResponse = userRepository.findByPlatformIdAndPlatformType(platformId, platformType)
                .orElseThrow(() -> {
                    log.warn(">>>> User not found with platformId: {} platformType: {}", platformId, platformType);
                     throw new UserException(ExceptionMessage.USER_NOT_FOUND);
                });


        return UserInfoResponse.of(userInfoResponse);

    }

회원 정보 조회 Service 구현

 


테스트

 

AuthControllerTest.java

    @Test
    @DisplayName("유저정보 조회 성공 테스트")
    void userInfoSuccessTest() throws Exception {
        //given
        User user = User.builder()
                .name(expectedName)
                .role(UserRole.USER)
                .platformId(expectedPlatformId)
                .platformType(UserPlatformType.GOOGLE)
                .githubId("j-ra1n")
                .profileImageUrl(expectedProfileImageUrl)
                .pushAlarmYn(true)
                .score(0)
                .point(0)
                .build();
        UserInfoResponse savedUser = UserInfoResponse.of(userRepository.save(user));

        when(authService.getUserByInfo(expectedPlatformId, UserPlatformType.GOOGLE)).thenReturn(savedUser);

        HashMap<String, String> map = new HashMap<>();
        map.put("role", user.getRole().name());
        map.put("platformId", user.getPlatformId());
        map.put("platformType", String.valueOf(user.getPlatformType()));

        String accessToken = jwtService.generateAccessToken(map, user);
        String refreshToken = jwtService.generateRefreshToken(map, user);

        // when
        mockMvc.perform(get("/auth/info")
                        .contentType(MediaType.APPLICATION_JSON)
                        .header(AUTHORIZATION, createAuthorizationHeader(accessToken, refreshToken)))
                // then
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.res_code").value(200))
                .andExpect(jsonPath("$.res_obj.role").value(String.valueOf(UserRole.USER)))
                .andExpect(jsonPath("$.res_obj.name").value(expectedName))
                .andExpect(jsonPath("$.res_obj.profile_image_url").value(expectedProfileImageUrl))
                .andExpect(jsonPath("$.res_obj.github_id").value("j-ra1n"))
                .andExpect(jsonPath("$.res_obj.push_alarm_yn").value(true))
                .andExpect(jsonPath("$.res_obj.score").value(0))
                .andExpect(jsonPath("$.res_obj.point").value(0));

    }


    @Test
    @DisplayName("유저정보 조회 실패 테스트 - 잘못된 Token")
    void userInfoWhenInvalidToken() throws Exception {
        // given
        String accessToken = "strangeToken";
        String refreshToken = "strangeToken";

        // when
        mockMvc.perform(get("/auth/info")
                        .contentType(MediaType.APPLICATION_JSON)
                        .header(AUTHORIZATION, createAuthorizationHeader(accessToken, refreshToken)))
                // then
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.res_code").value(400))
                .andExpect(jsonPath("$.res_msg").value(ExceptionMessage.JWT_MALFORMED.getText()));
    }

    @Test
    @DisplayName("유저정보 조회 실패 테스트 - 잘못된 권한")
    void userInfoWhenInvalidAuthority() throws Exception {
        User user = User.builder()
                .name(expectedName)
                .role(UserRole.UNAUTH)       // 잘못된 권한(미인증)
                .platformId(expectedPlatformId)
                .platformType(UserPlatformType.GOOGLE)
                .githubId("j-ra1n")
                .profileImageUrl(expectedProfileImageUrl)
                .pushAlarmYn(true)
                .score(0)
                .point(0)
                .build();
        User savedUser = userRepository.save(user);

        HashMap<String, String> map = new HashMap<>();
        map.put("role", savedUser.getRole().name());
        map.put("platformId", savedUser.getPlatformId());
        map.put("platformType", String.valueOf(savedUser.getPlatformType()));

        String accessToken = jwtService.generateAccessToken(map, user);
        String refreshToken = jwtService.generateRefreshToken(map, user);

        // when
        mockMvc.perform(get("/auth/info")
                        .contentType(MediaType.APPLICATION_JSON)
                        .header(AUTHORIZATION, createAuthorizationHeader(accessToken, refreshToken)))
                // then
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.res_code").value(400));

    }

유저 정보 조회 성공 테스트

잘못된 Token → 유저 정보 조회 실패 테스트

잘못된 권한 → 유저 정보 조회 실패 테스

 

 

AuthServiceTest.java

    @Test
    @DisplayName("유저 정보가 가져와지는지 확인")
    void getUserByInfoTest() {
        // given
        String expectedProfileUrl = "https://google.com";
        String expectedGithubId = "j_ra1n";

        User savedUser = userRepository.save(generateUser());

        // when
        UserInfoResponse expectedUser = authService.getUserByInfo(savedUser.getPlatformId(), savedUser.getPlatformType());

        // then
        assertThat(expectedUser).isNotNull();
        assertEquals(expectedUser.getRole(), USER);
        assertEquals(expectedUser.getProfileImageUrl(), expectedProfileUrl);
        assertEquals(expectedUser.getGithubId(), expectedGithubId);

    }

회원 정보 조회 Service 테스트

댓글