Skip to content

Commit 3a76c0e

Browse files
authored
Merge pull request #46 from HappyProcess/feature/sms-toggle
feat: 문자 알림 수신 on/off 토글 (opt-in)
2 parents cce9e49 + 583dd7a commit 3a76c0e

5 files changed

Lines changed: 28 additions & 7 deletions

File tree

src/main/java/com/haapyProcess/domain/alert/service/NotificationScheduler.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,10 @@ private void saveNotificationHistory(Member receiver, RiskAnalysisResult result,
138138
log.info("회원 ID {}에게 위험 알림 발송 완료 (대상: {}): {}",
139139
receiver.getMemberId(), relativeName == null ? "본인" : relativeName, diseaseNamesStr);
140140

141-
// 트랜잭션 커밋 후 비동기로 문자 발송 (수신자 본인/가족 모두)
142-
eventPublisher.publishEvent(new com.haapyProcess.domain.alert.event.NotificationCreatedEvent(
143-
receiver.getMemberId(), receiver.getPhoneNumber(), message));
141+
// 트랜잭션 커밋 후 비동기로 문자 발송 (문자 수신을 켜고 번호가 등록된 수신자만)
142+
if (receiver.hasPhoneNumber() && receiver.isSmsEnabled()) {
143+
eventPublisher.publishEvent(new com.haapyProcess.domain.alert.event.NotificationCreatedEvent(
144+
receiver.getMemberId(), receiver.getPhoneNumber(), message));
145+
}
144146
}
145147
}

src/main/java/com/haapyProcess/domain/member/dto/ProfileResponse.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ public record ProfileResponse(
88
@Schema(description = "로그인 아이디", example = "user1234") String loginId,
99
@Schema(description = "이름", example = "홍길동") String name,
1010
@Schema(description = "생년월일", example = "2000-01-01") LocalDate birth,
11-
@Schema(description = "휴대폰 번호", example = "01012345678") String phoneNumber
11+
@Schema(description = "휴대폰 번호", example = "01012345678") String phoneNumber,
12+
@Schema(description = "문자 알림 수신 여부", example = "true") boolean smsEnabled
1213
) {
1314
public static ProfileResponse from(Member member) {
1415
return new ProfileResponse(
1516
member.getLoginId(),
1617
member.getName(),
1718
member.getBirth(),
18-
member.getPhoneNumber()
19+
member.getPhoneNumber(),
20+
member.isSmsEnabled()
1921
);
2022
}
2123
}

src/main/java/com/haapyProcess/domain/member/dto/UpdateProfileRequest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,7 @@ public class UpdateProfileRequest {
2020
@Schema(description = "휴대폰 번호 (하이픈 없이 숫자만)", example = "01012345678")
2121
@Pattern(regexp = "^$|^01[016789]\\d{7,8}$", message = "휴대폰 번호는 하이픈 없이 숫자만 입력해주세요. (예: 01012345678)")
2222
private String phoneNumber;
23+
24+
@Schema(description = "문자 알림 수신 여부 (null이면 변경 안 함)", example = "true")
25+
private Boolean smsEnabled;
2326
}

src/main/java/com/haapyProcess/domain/member/entity/Member.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@ public class Member {
3939
@Column(name = "PHONE_NUMBER", length = 20)
4040
private String phoneNumber;
4141

42+
// 문자 알림 수신 동의 여부 (opt-in). 기본은 미수신이며, 마이페이지에서 명시적으로 켜야 발송된다.
43+
// 미설정(null)도 미수신으로 간주한다.
44+
@Builder.Default
45+
@Column(name = "SMS_ENABLED")
46+
private Boolean smsEnabled = false;
47+
4248
@Builder.Default
4349
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
4450
private List<Location> locations = new ArrayList<>();
@@ -55,7 +61,7 @@ public class Member {
5561
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
5662
private List<HealthCondition> healthConditions = new ArrayList<>();
5763

58-
public void updateProfile(String name, LocalDate birth, String phoneNumber) {
64+
public void updateProfile(String name, LocalDate birth, String phoneNumber, Boolean smsEnabled) {
5965
if (name != null && !name.isBlank()) {
6066
this.name = name;
6167
}
@@ -65,9 +71,17 @@ public void updateProfile(String name, LocalDate birth, String phoneNumber) {
6571
if (phoneNumber != null && !phoneNumber.isBlank()) {
6672
this.phoneNumber = phoneNumber;
6773
}
74+
if (smsEnabled != null) {
75+
this.smsEnabled = smsEnabled;
76+
}
6877
}
6978

7079
public boolean hasPhoneNumber() {
7180
return phoneNumber != null && !phoneNumber.isBlank();
7281
}
82+
83+
// 미설정(null)은 미수신으로 간주 (opt-in)
84+
public boolean isSmsEnabled() {
85+
return smsEnabled != null && smsEnabled;
86+
}
7387
}

src/main/java/com/haapyProcess/domain/member/service/MemberService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public ProfileResponse getMyProfile() {
2626
@Transactional
2727
public void updateMyProfile(UpdateProfileRequest request) {
2828
Member member = getCurrentMember();
29-
member.updateProfile(request.getName(), request.getBirth(), request.getPhoneNumber());
29+
member.updateProfile(request.getName(), request.getBirth(), request.getPhoneNumber(), request.getSmsEnabled());
3030
}
3131

3232
public Member getCurrentMember() {

0 commit comments

Comments
 (0)