-
Notifications
You must be signed in to change notification settings - Fork 1
edit: 테스트 케어콜, 즉시 케어콜 개선 #225
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -2,14 +2,14 @@ | |||||||||||||||
|
|
||||||||||||||||
| import com.example.medicare_call.domain.CareCallSetting; | ||||||||||||||||
| import com.example.medicare_call.domain.Elder; | ||||||||||||||||
| import com.example.medicare_call.domain.Member; | ||||||||||||||||
| import com.example.medicare_call.dto.carecall.CareCallTestRequest; | ||||||||||||||||
| import com.example.medicare_call.dto.carecall.ImmediateCareCallRequest.CareCallOption; | ||||||||||||||||
| import com.example.medicare_call.global.enums.CallType; | ||||||||||||||||
| import com.example.medicare_call.global.enums.ElderRelation; | ||||||||||||||||
| import com.example.medicare_call.global.enums.ResidenceType; | ||||||||||||||||
| import com.example.medicare_call.global.exception.CustomException; | ||||||||||||||||
| import com.example.medicare_call.global.exception.ErrorCode; | ||||||||||||||||
| import com.example.medicare_call.repository.CareCallSettingRepository; | ||||||||||||||||
| import com.example.medicare_call.repository.ElderRepository; | ||||||||||||||||
| import com.example.medicare_call.service.carecall.outbound.client.CareCallClient; | ||||||||||||||||
| import lombok.RequiredArgsConstructor; | ||||||||||||||||
|
|
@@ -22,56 +22,57 @@ | |||||||||||||||
| @RequiredArgsConstructor | ||||||||||||||||
| public class CareCallTestService { | ||||||||||||||||
|
|
||||||||||||||||
| /** 테스트 발송 시 사용하는 settingId. 실제 CareCallSetting과 무관한 식별용 음수 값 */ | ||||||||||||||||
| static final int TEST_SETTING_ID = -1; | ||||||||||||||||
|
|
||||||||||||||||
| private final ElderRepository elderRepository; | ||||||||||||||||
| private final com.example.medicare_call.service.carecall.setting.CareCallSettingService careCallSettingService; | ||||||||||||||||
| private final CareCallSettingRepository careCallSettingRepository; | ||||||||||||||||
| private final CareCallRequestSenderService careCallRequestSenderService; | ||||||||||||||||
| private final CareCallClient careCallClient; | ||||||||||||||||
|
|
||||||||||||||||
| // TODO: KUIT 데모데이 시연용 일시적 기능으로 불완전합니다. 제거 혹은 개선이 필요합니다. | ||||||||||||||||
| /** | ||||||||||||||||
| * 특정 어르신에게 즉시 케어콜을 발송 | ||||||||||||||||
| * 특정 어르신에게 즉시 케어콜을 발송 (베타테스트용) | ||||||||||||||||
| * 실제 DB에 등록된 Elder와 CareCallSetting을 기반으로 발송하며, | ||||||||||||||||
| * 통화 결과는 실제 케어콜과 동일하게 웹훅을 통해 DB에 저장 | ||||||||||||||||
| * | ||||||||||||||||
| * @param elderId 대상 어르신 ID | ||||||||||||||||
| * @param careCallOption 케어콜 옵션 (회차 정보 등) | ||||||||||||||||
| * @return 발송 완료 메시지 | ||||||||||||||||
| */ | ||||||||||||||||
| @Transactional | ||||||||||||||||
| @Transactional(readOnly = true) | ||||||||||||||||
| public String sendImmediateCall(Long elderId, CareCallOption careCallOption) { | ||||||||||||||||
| Elder elder = elderRepository.findById(elderId.intValue()) | ||||||||||||||||
|
Comment on lines
43
to
44
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
🛡️ 방어적 처리 예시- Elder elder = elderRepository.findById(elderId.intValue())
+ if (elderId > Integer.MAX_VALUE) {
+ throw new CustomException(ErrorCode.ELDER_NOT_FOUND, "유효하지 않은 어르신 ID: " + elderId);
+ }
+ Elder elder = elderRepository.findById(elderId.intValue())📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||
| .orElseThrow(() -> new CustomException(ErrorCode.ELDER_NOT_FOUND, "케어콜 발송 대상 어르신을 찾을 수 없습니다. ID: " + elderId)); | ||||||||||||||||
|
|
||||||||||||||||
| try { | ||||||||||||||||
| CareCallSetting setting = careCallSettingService.getOrCreateImmediateSetting(elder); | ||||||||||||||||
| CallType callType = convertOptionToCallType(careCallOption); | ||||||||||||||||
| CareCallSetting setting = careCallSettingRepository.findByElder(elder) | ||||||||||||||||
| .orElseThrow(() -> new CustomException(ErrorCode.CARE_CALL_SETTING_NOT_FOUND, | ||||||||||||||||
| "즉시 케어콜 발송 대상 어르신의 케어콜 설정을 찾을 수 없습니다. ID: " + elderId)); | ||||||||||||||||
| CallType callType = convertOptionToCallType(careCallOption); | ||||||||||||||||
|
|
||||||||||||||||
| careCallRequestSenderService.sendCall(setting.getId(), elderId.intValue(), callType); | ||||||||||||||||
| return String.format("%s 어르신께 즉시 케어콜 발송이 완료되었습니다.", elder.getName()); | ||||||||||||||||
| } catch (Exception e) { | ||||||||||||||||
| log.error("즉시 케어콜 발송 실패 - elderId: {}, error: {}", elder.getId(), e.getMessage()); | ||||||||||||||||
| throw new CustomException(ErrorCode.INTERNAL_SERVER_ERROR, "케어콜 발송 중 오류가 발생했습니다: " + e.getMessage()); | ||||||||||||||||
| } | ||||||||||||||||
| careCallRequestSenderService.sendCall(setting.getId(), elderId.intValue(), callType); | ||||||||||||||||
| return String.format("%s 어르신께 즉시 케어콜 발송이 완료되었습니다.", elder.getName()); | ||||||||||||||||
| } | ||||||||||||||||
|
|
||||||||||||||||
| // TODO: 테스트 서버를 운용하게 될 경우, @Profile로 분리를 권장 | ||||||||||||||||
| /** | ||||||||||||||||
| * 테스트용 케어콜을 발신 | ||||||||||||||||
| * 가상의 어르신 데이터(더미)를 사용하여 실제 발신 로직만 테스트하고 DB 저장은 수행하지 않는다 | ||||||||||||||||
| * | ||||||||||||||||
| * 개발자용 케어콜 발신 테스트 (production에서는 미사용) | ||||||||||||||||
| * 더미 Elder 데이터를 사용하여 발신 로직만 확인하는 용도입니다. | ||||||||||||||||
| * TEST_SETTING_ID(-1)를 사용하므로, 통화 완료 후 웹훅이 수신되어도 DB에 저장되지 않습니다. | ||||||||||||||||
| * | ||||||||||||||||
| * @param req 테스트할 프롬프트와 전화번호 정보 | ||||||||||||||||
| */ | ||||||||||||||||
| public void sendTestCall(CareCallTestRequest req) { | ||||||||||||||||
| // 테스트용이라 하드코딩된 더미 데이터 사용, DB 저장 안함 | ||||||||||||||||
| Elder testElder = Elder.builder() | ||||||||||||||||
| .id(100) | ||||||||||||||||
| .name("김옥자") // 테스트 이름 | ||||||||||||||||
| .name("김옥자") | ||||||||||||||||
| .phone("01011111111") | ||||||||||||||||
| .gender((byte)0) | ||||||||||||||||
| .relationship(ElderRelation.CHILD) | ||||||||||||||||
| .residenceType(ResidenceType.ALONE) | ||||||||||||||||
| .build(); | ||||||||||||||||
|
|
||||||||||||||||
| String testPrompt = req.prompt(); | ||||||||||||||||
| // 테스트 호출은 settingId 100으로 가정 | ||||||||||||||||
| careCallClient.requestCall(100, testElder.getId(), req.phoneNumber(), testPrompt); | ||||||||||||||||
| careCallClient.requestCall(TEST_SETTING_ID, testElder.getId(), req.phoneNumber(), testPrompt); | ||||||||||||||||
| } | ||||||||||||||||
|
|
||||||||||||||||
| /** | ||||||||||||||||
|
|
||||||||||||||||
Uh oh!
There was an error while loading. Please reload this page.