Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.leets7th.job_is_be.domain.user.controller;

import com.leets7th.job_is_be.domain.user.dto.AccountResponse;
import com.leets7th.job_is_be.domain.user.service.AccountService;
import com.leets7th.job_is_be.global.response.ApiResponse;
import com.leets7th.job_is_be.global.status.SuccessStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/settings/account")
@RequiredArgsConstructor
public class AccountController {

private final AccountService accountService;

@GetMapping
public ResponseEntity<ApiResponse<AccountResponse>> getAccount(
@AuthenticationPrincipal Jwt jwt
) {
return ApiResponse.success(
SuccessStatus.ACCOUNT_GET_SUCCESS,
accountService.getAccount(userId(jwt))
);
}

private Long userId(Jwt jwt) {
return Long.valueOf(jwt.getSubject());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.leets7th.job_is_be.domain.user.dto;

import com.leets7th.job_is_be.domain.user.enums.SocialType;

import java.time.LocalDateTime;

public record AccountResponse(
SocialType socialType,
LocalDateTime joinedAt,
String receivingEmail,
boolean emailVerified
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.leets7th.job_is_be.domain.user.service;

import com.leets7th.job_is_be.domain.notification.entity.NotificationSetting;
import com.leets7th.job_is_be.domain.notification.repository.NotificationSettingRepository;
import com.leets7th.job_is_be.domain.user.dto.AccountResponse;
import com.leets7th.job_is_be.domain.user.entity.User;
import com.leets7th.job_is_be.domain.user.repository.UserRepository;
import com.leets7th.job_is_be.global.exception.GeneralException;
import com.leets7th.job_is_be.global.status.ErrorStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AccountService {

private final UserRepository userRepository;
private final NotificationSettingRepository notificationSettingRepository;

public AccountResponse getAccount(Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND));

boolean emailVerified = notificationSettingRepository.findByUser(user)
.map(NotificationSetting::isEmailVerified)
.orElse(false);

return new AccountResponse(
user.getSocialType(),
user.getCreatedAt(),
user.getEmail(),
emailVerified
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,12 @@ public enum SuccessStatus implements BaseStatus {
NOTIFICATION_SETTING_GET_SUCCESS(HttpStatus.OK, "NOTIFICATION_200_1", "알림 수신 설정을 조회했습니다."),
NOTIFICATION_SETTING_UPDATE_SUCCESS(HttpStatus.OK, "NOTIFICATION_200_2", "알림 수신 설정을 변경했습니다."),
NOTIFICATION_SNOOZE_SUCCESS(HttpStatus.OK, "NOTIFICATION_200_3", "알림 발송을 스누즈 설정했습니다."),
NOTIFICATION_SNOOZE_CANCEL_SUCCESS(HttpStatus.OK, "NOTIFICATION_200_4", "알림 스누즈를 해제했습니다.");
NOTIFICATION_SNOOZE_CANCEL_SUCCESS(HttpStatus.OK, "NOTIFICATION_200_4", "알림 스누즈를 해제했습니다."),

/**
* Account
*/
ACCOUNT_GET_SUCCESS(HttpStatus.OK, "ACCOUNT_200_1", "계정 정보를 조회했습니다.");

private final HttpStatus httpStatus;
private final String code;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.leets7th.job_is_be.domain.user.service;

import com.leets7th.job_is_be.domain.notification.entity.NotificationSetting;
import com.leets7th.job_is_be.domain.notification.repository.NotificationSettingRepository;
import com.leets7th.job_is_be.domain.user.dto.AccountResponse;
import com.leets7th.job_is_be.domain.user.entity.User;
import com.leets7th.job_is_be.domain.user.enums.SocialType;
import com.leets7th.job_is_be.domain.user.repository.UserRepository;
import com.leets7th.job_is_be.global.exception.GeneralException;
import com.leets7th.job_is_be.global.status.ErrorStatus;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;

import java.time.LocalDateTime;
import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowableOfType;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
class AccountServiceTest {

@Mock
private UserRepository userRepository;
@Mock
private NotificationSettingRepository notificationSettingRepository;

@InjectMocks
private AccountService accountService;

private User user() {
User user = User.builder().socialId("s").socialType(SocialType.KAKAO).email("a@a.com").build();
ReflectionTestUtils.setField(user, "id", 1L);
return user;
}

@Test
void 사용자가_없으면_예외를_던진다() {
when(userRepository.findById(1L)).thenReturn(Optional.empty());

GeneralException exception = catchThrowableOfType(
() -> accountService.getAccount(1L), GeneralException.class);

assertThat(exception.getErrorStatus()).isEqualTo(ErrorStatus.USER_NOT_FOUND);
}

@Test
void 계정_정보를_조회한다() {
User user = user();
LocalDateTime createdAt = LocalDateTime.of(2026, 1, 15, 10, 30);
ReflectionTestUtils.setField(user, "createdAt", createdAt);
NotificationSetting setting = NotificationSetting.builder().user(user).sendSlot("07:30").build();
ReflectionTestUtils.setField(setting, "emailVerified", true);
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
when(notificationSettingRepository.findByUser(user)).thenReturn(Optional.of(setting));

AccountResponse response = accountService.getAccount(1L);

assertThat(response.socialType()).isEqualTo(SocialType.KAKAO);
assertThat(response.joinedAt()).isEqualTo(createdAt);
assertThat(response.receivingEmail()).isEqualTo("a@a.com");
assertThat(response.emailVerified()).isTrue();
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}

@Test
void 알림_설정이_없으면_이메일_미확인_상태로_반환한다() {
User user = user();
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
when(notificationSettingRepository.findByUser(user)).thenReturn(Optional.empty());

AccountResponse response = accountService.getAccount(1L);

assertThat(response.emailVerified()).isFalse();
}
}