Skip to content

Commit 04379a2

Browse files
authored
Merge pull request #115 from Money-Touch/feat/#114
✨Feat : 소비 MBTI 결과 조회 기능 구현
2 parents 5414e73 + 992567a commit 04379a2

File tree

12 files changed

+132
-8
lines changed

12 files changed

+132
-8
lines changed

src/main/java/com/server/money_touch/domain/consumptionMbti/controller/ConsumptionMbtiController.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33

44
import com.server.money_touch.domain.consumptionMbti.dto.ConsumptionMbtiResponse;
5+
import com.server.money_touch.domain.consumptionMbti.service.ConsumptionMbtiService;
56
import com.server.money_touch.global.apiPayload.ApiResponse;
67
import com.server.money_touch.global.apiPayload.code.status.ErrorStatus;
78
import com.server.money_touch.global.validation.annotation.ApiErrorCodeExample;
@@ -11,6 +12,7 @@
1112
import io.swagger.v3.oas.annotations.Parameter;
1213
import io.swagger.v3.oas.annotations.Parameters;
1314
import io.swagger.v3.oas.annotations.tags.Tag;
15+
import jakarta.servlet.http.HttpServletRequest;
1416
import jakarta.validation.Valid;
1517
import jakarta.validation.constraints.NotBlank;
1618
import lombok.RequiredArgsConstructor;
@@ -26,6 +28,8 @@
2628
@RequestMapping("/api/consumptionMbti")
2729
public class ConsumptionMbtiController {
2830

31+
private final ConsumptionMbtiService consumptionMbtiService;
32+
2933
@Operation(
3034
summary = "소비 Mbti 조회 API",
3135
description = "결과 코드(예: PTG)에 해당하는 소비 MBTI 설명, 부제, 이미지 등을 조회합니다."
@@ -40,8 +44,8 @@ public class ConsumptionMbtiController {
4044
@Parameter(name = "result" , description = "조회하려는 소비 MBTI", example = "PTG" , required = true)
4145
})
4246
@GetMapping("/result")
43-
public ApiResponse<ConsumptionMbtiResponse.ConsumptionMbtiResultDTO> getMbti(@RequestParam @NotBlank(message = "결과값은 필수입니다.") String result) {
44-
ConsumptionMbtiResponse.ConsumptionMbtiResultDTO response = null; // TODO: 서비스 연결 예정
47+
public ApiResponse<ConsumptionMbtiResponse.ConsumptionMbtiResultDTO> getMbti(@RequestParam @NotBlank(message = "결과값은 필수입니다.") String result, HttpServletRequest request) {
48+
var response = consumptionMbtiService.getConsumptionMbti(result, request);
4549
return ApiResponse.onSuccess(response);
4650
}
4751

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.server.money_touch.domain.consumptionMbti.converter;
2+
3+
import com.server.money_touch.domain.consumptionMbti.dto.ConsumptionMbtiResponse;
4+
import com.server.money_touch.domain.consumptionMbti.entity.ConsumptionMbti;
5+
6+
public class ConsumptionMbtiConveter {
7+
8+
public static ConsumptionMbtiResponse.ConsumptionMbtiResultDTO toResultDTO(ConsumptionMbti entity) {
9+
return new ConsumptionMbtiResponse.ConsumptionMbtiResultDTO(
10+
entity.getId(),
11+
entity.getResult(),
12+
entity.getSubtitle(),
13+
entity.getMbtiImgUrl(),
14+
entity.getDescription()
15+
);
16+
17+
}
18+
}

src/main/java/com/server/money_touch/domain/consumptionMbti/dto/ConsumptionMbtiResponse.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public static class ConsumptionMbtiResultDTO{
1818
@Schema(description = "소비 mbti 이름", example = "PTG")
1919
private String result;
2020

21+
@Schema(description = "소비 mbti 부제" , example = "계획 철벽러")
22+
private String subtitle;
23+
2124
@Schema(description = "소비 mbti 설명" ,example = "철저한 계획 아래~")
2225
private String description;
2326

src/main/java/com/server/money_touch/domain/consumptionMbti/entity/ConsumptionMbti.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@ public class ConsumptionMbti {
2121
@GeneratedValue(strategy = GenerationType.IDENTITY)
2222
private Long id;
2323

24+
@Column(length = 10, nullable = false, unique = true)
25+
private String result; // 소비MBTI 이름 ex) PTG
26+
27+
private String subtitle; // ex) 계획 철벽러
28+
2429
private String mbtiImgUrl;
2530

2631
private String description;
2732

28-
@Column(length = 10)
29-
private String result; // 소비MBTI 이름 ex) PTG
3033

3134
@CreatedDate
3235
private LocalDateTime createdAt;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.server.money_touch.domain.consumptionMbti.repository;
2+
3+
import com.server.money_touch.domain.consumptionMbti.entity.ConsumptionMbti;
4+
import org.springframework.data.repository.CrudRepository;
5+
6+
import java.util.Optional;
7+
8+
public interface ConsumptionMbtiRepository extends CrudRepository<ConsumptionMbti, Long> {
9+
// 소비 MBTI 존재 유무 확인
10+
Optional <ConsumptionMbti> findByResult(String result);
11+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.server.money_touch.domain.consumptionMbti.service;
2+
3+
4+
import com.server.money_touch.domain.consumptionMbti.dto.ConsumptionMbtiResponse;
5+
import jakarta.servlet.http.HttpServletRequest;
6+
7+
public interface ConsumptionMbtiService {
8+
// 소비 MBTI 존재 여부 검증
9+
Boolean existsConsumptionMbti(Long consumptionMbtiId);
10+
11+
// 소비 MBTI 조회
12+
ConsumptionMbtiResponse.ConsumptionMbtiResultDTO getConsumptionMbti(String result, HttpServletRequest request);
13+
14+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.server.money_touch.domain.consumptionMbti.service;
2+
3+
import com.server.money_touch.domain.consumptionMbti.converter.ConsumptionMbtiConveter;
4+
import com.server.money_touch.domain.consumptionMbti.dto.ConsumptionMbtiResponse;
5+
import com.server.money_touch.domain.consumptionMbti.entity.ConsumptionMbti;
6+
import com.server.money_touch.domain.consumptionMbti.repository.ConsumptionMbtiRepository;
7+
import com.server.money_touch.domain.user.entity.User;
8+
import com.server.money_touch.domain.user.repository.user.UserRepository;
9+
import com.server.money_touch.global.apiPayload.code.status.ErrorStatus;
10+
import com.server.money_touch.global.apiPayload.exception.handler.ErrorHandler;
11+
import com.server.money_touch.global.utils.AuthUtil;
12+
import jakarta.servlet.http.HttpServletRequest;
13+
import lombok.RequiredArgsConstructor;
14+
import org.springframework.stereotype.Service;
15+
16+
import java.util.Optional;
17+
18+
@Service
19+
@RequiredArgsConstructor
20+
public class ConsumptionMbtiServiceImpl implements ConsumptionMbtiService{
21+
22+
private final ConsumptionMbtiRepository consumptionMbtiRepository;
23+
private final AuthUtil authUtil;
24+
private final UserRepository userRepository;
25+
26+
// 소비 MBTI 존재 여부 검증
27+
@Override
28+
public Boolean existsConsumptionMbti(Long ConsumptionMbtiId) {
29+
return consumptionMbtiRepository.existsById(ConsumptionMbtiId);
30+
}
31+
32+
// 유저 프로필이미지 존재 여부 검증
33+
34+
35+
@Override
36+
public ConsumptionMbtiResponse.ConsumptionMbtiResultDTO getConsumptionMbti(String result, HttpServletRequest request) {
37+
// 1. MBTI 결과 조회
38+
ConsumptionMbti consumptionMbti = consumptionMbtiRepository.findByResult(result)
39+
.orElseThrow(() -> new ErrorHandler(ErrorStatus.MBTI_NOT_FOUND));
40+
41+
// 2. 현재 로그인한 유저 ID 추출
42+
Long userId = authUtil.getUserIdFromRequest(request);
43+
44+
// 3. 유저 조회
45+
User user = userRepository.findById(userId)
46+
.orElseThrow(() -> new ErrorHandler(ErrorStatus.USER_NOT_FOUND));
47+
48+
// 유저의 프로필 이미지가 없고, 소비 MBTI 이미지가 존재할 경우
49+
if ((user.getProfileImgUrl() == null || user.getProfileImgUrl().isBlank())
50+
&& consumptionMbti.getMbtiImgUrl() != null && !consumptionMbti.getMbtiImgUrl().isBlank()) {
51+
user.setProfileImgUrl(consumptionMbti.getMbtiImgUrl());
52+
userRepository.save(user); // 유저 정보 저장
53+
}
54+
55+
return ConsumptionMbtiConveter.toResultDTO(consumptionMbti);
56+
}
57+
58+
}

src/main/java/com/server/money_touch/domain/user/repository/user/UserRepository.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ public interface UserRepository extends JpaRepository<User, Long> {
1212
@Query("SELECT u FROM User u LEFT JOIN FETCH u.userDetail")
1313
List<User> findAllWithUserDetail();
1414

15-
Optional<User> findByEmail(String email); // email로 사용자 정보를 가져옴
15+
// email로 유저 조회
16+
Optional<User> findByEmail(String email);
1617

17-
boolean existsByEmail(String email);
18+
Optional<User> findById(Long id);
19+
1820
}

src/main/java/com/server/money_touch/domain/user/service/user/AuthService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class AuthService {
3434
private final UserRepository userRepository;
3535
private final TokenProvider tokenProvider;
3636
private final PasswordEncoder passwordEncoder;
37+
private final UserQueryService userQueryService;
3738
private final BudgetCommandService budgetCommandService;
3839
private final TotalConsumptionRepository totalConsumptionRepository;
3940

@@ -46,7 +47,7 @@ public User oAuthLogin(String accessCode, HttpServletResponse httpServletRespons
4647
User user;
4748
boolean isNewUser = false;
4849

49-
if (userRepository.existsByEmail(email)) {
50+
if (userQueryService.existsByEmail(email)) {
5051
user = userRepository.findByEmail(email).get();
5152
} else {
5253
user = createNewUser(kakaoProfile); // 등록되지않은 회원이면 회원가입

src/main/java/com/server/money_touch/domain/user/service/user/UserCommandServiceImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public class UserCommandServiceImpl implements UserCommandService {
4949
private final UserDetailRepository userDetailRepository;
5050
private final PasswordEncoder passwordEncoder;
5151
private final TokenProvider tokenProvider;
52+
private final UserQueryService userQueryService;
5253
private final BudgetCommandService budgetCommandService;
5354
private final TotalConsumptionRepository totalConsumptionRepository;
5455

@@ -212,7 +213,7 @@ private Authentication createAuthentication(User user) {
212213
* 이메일 중복 검증
213214
*/
214215
private void validateDuplicateEmail(String email) {
215-
if (userRepository.existsByEmail(email)) {
216+
if (userQueryService.existsByEmail(email)) {
216217
throw new IllegalArgumentException("이미 사용중인 이메일입니다.");
217218
}
218219
}

0 commit comments

Comments
 (0)