Skip to content

Commit 175de7e

Browse files
Merge pull request #38 from gdsc-ssu/feat/#34-senior-profile
[SENIOR] 어르신 정보 입력 및 조회 기능 구현
2 parents 7d9bd02 + 594e60c commit 175de7e

File tree

6 files changed

+119
-22
lines changed

6 files changed

+119
-22
lines changed

src/main/java/com/weve/controller/UserController.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import com.weve.common.api.payload.BasicResponse;
44
import com.weve.domain.User;
55
import com.weve.dto.request.PatchMypageRequest;
6+
import com.weve.dto.request.SeniorInfoRequest;
67
import com.weve.dto.response.MypageResponse;
8+
import com.weve.dto.response.SeniorProfileResponse;
79
import com.weve.repository.UserRepository;
810
import com.weve.security.CustomUserDetails;
911
import com.weve.service.UserService;
@@ -25,15 +27,15 @@
2527
@RequiredArgsConstructor
2628
@Validated
2729
@Slf4j
28-
@RequestMapping("/api/mypage")
30+
@RequestMapping("/api")
2931
@Tag(name = "User", description = "User 관련 API입니다.")
3032
public class UserController {
3133

3234
private final UserService userService;
3335
private final UserRepository userRepository;
3436

3537
// 마이페이지 정보 조회
36-
@GetMapping
38+
@GetMapping("/mypage")
3739
public BasicResponse<MypageResponse> getMypage(@AuthenticationPrincipal UserDetails userDetails) {
3840

3941
String username = userDetails.getUsername();
@@ -42,9 +44,28 @@ public BasicResponse<MypageResponse> getMypage(@AuthenticationPrincipal UserDeta
4244
}
4345

4446
// 마이페이지 정보 수정
45-
@PatchMapping
47+
@PatchMapping("/mypage")
4648
public BasicResponse<MypageResponse> patchMypage(@AuthenticationPrincipal UserDetails userDetails, @RequestBody PatchMypageRequest request) {
4749
MypageResponse response = userService.patchMypage(userDetails.getUsername(), request).getResult();
4850
return BasicResponse.onSuccess(response);
4951
}
52+
53+
// 어르신 정보 입력
54+
@PostMapping("/senior")
55+
public BasicResponse<?> postSeniorInfo(@AuthenticationPrincipal UserDetails userDetails, @RequestBody SeniorInfoRequest request) {
56+
57+
String username = userDetails.getUsername();
58+
userService.postSeniorInfo(username, request);
59+
60+
return BasicResponse.onSuccess(null);
61+
}
62+
63+
// 어르신 정보 확인
64+
@GetMapping("/senior")
65+
public BasicResponse<SeniorProfileResponse> getSeniorInfo(@AuthenticationPrincipal UserDetails userDetails) {
66+
67+
String username = userDetails.getUsername();
68+
SeniorProfileResponse response = userService.getSeniorInfo(username).getResult();
69+
return BasicResponse.onSuccess(response);
70+
}
5071
}

src/main/java/com/weve/domain/MatchingInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import lombok.*;
1010

1111
@Getter
12-
@Builder
12+
@Builder(toBuilder = true)
1313
@Embeddable
1414
@AllArgsConstructor
1515
@NoArgsConstructor(access = AccessLevel.PROTECTED)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.weve.dto.request;
2+
3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
import com.weve.domain.enums.HardshipCategory;
5+
import com.weve.domain.enums.JobCategory;
6+
import com.weve.domain.enums.ValueCategory;
7+
import lombok.Getter;
8+
9+
import java.time.LocalDate;
10+
11+
@Getter
12+
public class SeniorInfoRequest {
13+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
14+
private LocalDate birth;
15+
private String job;
16+
private String value;
17+
private String hardship;
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.weve.dto.response;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import com.weve.domain.User;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Getter
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@JsonInclude(JsonInclude.Include.NON_NULL)
15+
public class SeniorProfileResponse {
16+
17+
private String name;
18+
private String nationality;
19+
20+
public static SeniorProfileResponse fromUser(User user) {
21+
return SeniorProfileResponse.builder()
22+
.name(user.getName())
23+
.nationality(user.getNationality())
24+
.build();
25+
}
26+
}

src/main/java/com/weve/service/MessageService.java

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,17 +105,4 @@ public boolean verifySMSCode(String phoneNumber, String inputCode) {
105105
}
106106
return false;
107107
}
108-
}
109-
110-
111-
// 문자인증 시 들어오는 값은 [국가번호 + 전화번호]
112-
// 국가번호는 3개 중 하나로 파싱 후 이에 따라 국적 분류해야함
113-
// 문자 인증 시 다른 나라 번호도 가능한지 알아봐야함
114-
115-
// 문자인증 연결은 1. 회원가입 2. 전화번호 수정
116-
// mysql에 sms_code 속성 추가한 후 이를 저장한 뒤, 비교해서 같은 값이면 인증 성공 (시간 초과 시 실패)
117-
// 인증 다시 할 때마다 db에 있는 값 갱신
118-
119-
// 1. sms 인증 코드 구현 (mysql 코드 저장 포함)
120-
// 2. 국가번호 파싱 -> 국가 저장 포함 -> sms 인증 연결
121-
// 3. #28 브랜치에서 1번 진행 후 나머지는 2번에서 진행 ???????
108+
}

src/main/java/com/weve/service/UserService.java

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,23 @@
33
import com.weve.common.api.exception.GeneralException;
44
import com.weve.common.api.payload.BasicResponse;
55
import com.weve.common.api.payload.code.status.ErrorStatus;
6+
import com.weve.domain.MatchingInfo;
67
import com.weve.domain.User;
7-
import com.weve.domain.enums.Language;
8+
import com.weve.domain.enums.HardshipCategory;
9+
import com.weve.domain.enums.JobCategory;
10+
import com.weve.domain.enums.ValueCategory;
811
import com.weve.dto.request.PatchMypageRequest;
12+
import com.weve.dto.request.SeniorInfoRequest;
913
import com.weve.dto.response.MypageResponse;
14+
import com.weve.dto.response.SeniorProfileResponse;
1015
import com.weve.repository.UserRepository;
1116
import lombok.RequiredArgsConstructor;
1217
import lombok.extern.slf4j.Slf4j;
1318
import org.springframework.stereotype.Service;
1419
import org.springframework.transaction.annotation.Transactional;
1520

16-
import java.time.LocalDate;
17-
1821
import static com.weve.domain.enums.UserType.JUNIOR;
1922
import static com.weve.domain.enums.UserType.SENIOR;
20-
import static com.weve.service.AuthService.COUNTRY_NATIONALITY_MAP;
2123

2224
@Slf4j
2325
@Service
@@ -27,6 +29,7 @@ public class UserService {
2729

2830
private final UserRepository userRepository;
2931
private final AuthService authService;
32+
private final GeminiService geminiService;
3033

3134
// id로 유저 검색
3235
public User findById(Long memberId) {
@@ -83,7 +86,49 @@ public BasicResponse<MypageResponse> patchMypage(String username, PatchMypageReq
8386
userRepository.save(patchedUser);
8487
MypageResponse response = MypageResponse.fromUser(patchedUser);
8588
return BasicResponse.onSuccess(response);
89+
}
90+
91+
// 어르신 정보 입력
92+
@Transactional
93+
public void postSeniorInfo(String username, SeniorInfoRequest request) {
94+
95+
User user = findByPhoneNumber(username);
96+
checkIfSenior(user); // 시니어인지 검사 (생략 가능)
97+
98+
// 정보 받아서 텍스트 분석 후 카테고리 분류 (User 테이블 저장)
99+
// Gemini 서비스에 있는 analyzeText() 이용
100+
String newJob = request.getJob();
101+
String newValue = request.getValue();
102+
String newHardship = request.getHardship();
103+
String prompt = newJob + newValue + newHardship;
104+
105+
// 텍스트 분석 후 카테고리 분류 (세 번 호출하는 방식)
106+
JobCategory jobResult = geminiService.analyzeText(prompt).getJob();
107+
ValueCategory valueResult = geminiService.analyzeText(prompt).getValue();
108+
HardshipCategory hardshipResult = geminiService.analyzeText(prompt).getHardship();
109+
log.info(String.valueOf(jobResult));
110+
log.info(String.valueOf(valueResult));
111+
log.info(String.valueOf(hardshipResult));
112+
113+
// MatchingInfo 객체 생성
114+
MatchingInfo matchingInfo = new MatchingInfo(jobResult, valueResult, hardshipResult);
115+
116+
// 분석된 것을 User 테이블에 저장
117+
User newUser = user.toBuilder()
118+
.birth(request.getBirth())
119+
.matchingInfo(matchingInfo)
120+
.build();
121+
122+
123+
// 변경된 User 엔티티 저장
124+
userRepository.save(newUser);
125+
}
86126

127+
// 어르신 정보 확인
128+
public BasicResponse<SeniorProfileResponse> getSeniorInfo(String username) {
87129

130+
User user = findByPhoneNumber(username);
131+
SeniorProfileResponse response = SeniorProfileResponse.fromUser(user);
132+
return BasicResponse.onSuccess(response);
88133
}
89134
}

0 commit comments

Comments
 (0)