Skip to content

Commit be7f7d3

Browse files
authored
Merge pull request #50 from Central-MakeUs/refactor/#49-terms-api-separate
약관 동의 API를 분리한다.
2 parents 3231b7c + 70b51b1 commit be7f7d3

File tree

7 files changed

+76
-40
lines changed

7 files changed

+76
-40
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package akuma.whiplash.domains.member.application.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.Builder;
6+
7+
@Builder
8+
public record MemberPrivacyPolicyModifyRequest(
9+
@Schema(description = "개인정보 수집 동의 여부", requiredMode = Schema.RequiredMode.REQUIRED)
10+
@NotNull(message = "개인정보 수집 동의 여부를 선택해주세요.")
11+
Boolean privacyPolicy
12+
) {
13+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package akuma.whiplash.domains.member.application.dto.request;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.Builder;
6+
7+
@Builder
8+
public record MemberPushNotificationPolicyModifyRequest(
9+
@Schema(description = "푸시 알림 수신 동의 여부", requiredMode = Schema.RequiredMode.REQUIRED)
10+
@NotNull(message = "푸시 알림 수신 동의 여부를 선택해주세요.")
11+
Boolean pushNotificationPolicy
12+
) {
13+
14+
}

src/main/java/akuma/whiplash/domains/member/application/dto/request/MemberTermsModifyRequest.java

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package akuma.whiplash.domains.member.application.usecase;
22

3-
import akuma.whiplash.domains.member.application.dto.request.MemberTermsModifyRequest;
3+
import akuma.whiplash.domains.auth.application.dto.etc.MemberContext;
4+
import akuma.whiplash.domains.member.application.dto.request.MemberPrivacyPolicyModifyRequest;
5+
import akuma.whiplash.domains.member.application.dto.request.MemberPushNotificationPolicyModifyRequest;
46
import akuma.whiplash.domains.member.domain.service.MemberCommandService;
57
import akuma.whiplash.global.annotation.architecture.UseCase;
68
import lombok.RequiredArgsConstructor;
@@ -12,11 +14,15 @@ public class MemberUseCase {
1214

1315
private final MemberCommandService memberCommandService;
1416

15-
public void modifyMemberTermsInfo(Long memberId, MemberTermsModifyRequest request) {
16-
memberCommandService.modifyMemberTermsInfo(memberId, request);
17+
public void modifyMemberPrivacyPolicy(Long memberId, MemberPrivacyPolicyModifyRequest request) {
18+
memberCommandService.modifyPrivacyPolicy(memberId, request.privacyPolicy());
1719
}
1820

19-
public void hardDeleteMember(Long memberId) {
20-
memberCommandService.hardDeleteMember(memberId);
21+
public void modifyMemberPushNotificationPolicy(Long memberId, MemberPushNotificationPolicyModifyRequest request) {
22+
memberCommandService.modifyPushNotificationPolicy(memberId, request.pushNotificationPolicy());
23+
}
24+
25+
public void hardDeleteMember(MemberContext memberContext) {
26+
memberCommandService.hardDeleteMember(memberContext.memberId(), memberContext.deviceId());
2127
}
2228
}
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package akuma.whiplash.domains.member.domain.service;
22

3-
import akuma.whiplash.domains.member.application.dto.request.MemberTermsModifyRequest;
4-
53
public interface MemberCommandService {
6-
void modifyMemberTermsInfo(Long memberId, MemberTermsModifyRequest request);
7-
void hardDeleteMember(Long memberId);
4+
void modifyPrivacyPolicy(Long memberId, boolean privacyPolicy);
5+
void modifyPushNotificationPolicy(Long memberId, boolean pushNotificationPolicy);
6+
void hardDeleteMember(Long memberId, String deviceId);
87
}

src/main/java/akuma/whiplash/domains/member/domain/service/MemberCommandServiceImpl.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import akuma.whiplash.domains.alarm.persistence.repository.AlarmOffLogRepository;
55
import akuma.whiplash.domains.alarm.persistence.repository.AlarmRepository;
66
import akuma.whiplash.domains.alarm.persistence.repository.AlarmRingingLogRepository;
7-
import akuma.whiplash.domains.member.application.dto.request.MemberTermsModifyRequest;
87
import akuma.whiplash.domains.member.exception.MemberErrorCode;
98
import akuma.whiplash.domains.member.persistence.entity.MemberEntity;
109
import akuma.whiplash.domains.member.persistence.repository.MemberRepository;
10+
import akuma.whiplash.global.config.security.jwt.JwtUtils;
1111
import akuma.whiplash.global.exception.ApplicationException;
12+
import akuma.whiplash.infrastructure.redis.RedisService;
1213
import lombok.RequiredArgsConstructor;
1314
import org.springframework.stereotype.Service;
1415
import org.springframework.transaction.annotation.Transactional;
@@ -23,23 +24,31 @@ public class MemberCommandServiceImpl implements MemberCommandService {
2324
private final AlarmOccurrenceRepository alarmOccurrenceRepository;
2425
private final AlarmOffLogRepository alarmOffLogRepository;
2526
private final AlarmRingingLogRepository alarmRingingLogRepository;
27+
private final JwtUtils jwtUtils;
28+
private final RedisService redisService;
2629

2730
@Override
28-
public void modifyMemberTermsInfo(Long memberId, MemberTermsModifyRequest request) {
31+
public void modifyPrivacyPolicy(Long memberId, boolean privacyPolicy) {
2932
MemberEntity member = memberRepository.findById(memberId)
3033
.orElseThrow(() -> ApplicationException.from(MemberErrorCode.MEMBER_NOT_FOUND));
3134

32-
if (request.privacyPolicy() != null) {
33-
member.updatePrivacyPolicy(request.privacyPolicy());
35+
if (member.isPrivacyPolicy() != privacyPolicy) {
36+
member.updatePrivacyPolicy(privacyPolicy);
3437
}
38+
}
39+
40+
@Override
41+
public void modifyPushNotificationPolicy(Long memberId, boolean pushNotificationPolicy) {
42+
MemberEntity member = memberRepository.findById(memberId)
43+
.orElseThrow(() -> ApplicationException.from(MemberErrorCode.MEMBER_NOT_FOUND));
3544

36-
if (request.pushNotificationPolicy() != null) {
37-
member.updatePushNotificationPolicy(request.pushNotificationPolicy());
45+
if (member.isPushNotificationPolicy() != pushNotificationPolicy) {
46+
member.updatePushNotificationPolicy(pushNotificationPolicy);
3847
}
3948
}
4049

4150
@Override
42-
public void hardDeleteMember(Long memberId) {
51+
public void hardDeleteMember(Long memberId, String deviceId) {
4352
MemberEntity member = memberRepository.findById(memberId)
4453
.orElseThrow(() -> ApplicationException.from(MemberErrorCode.MEMBER_NOT_FOUND));
4554

@@ -58,7 +67,8 @@ public void hardDeleteMember(Long memberId) {
5867
// 6. member 삭제
5968
memberRepository.delete(member);
6069

61-
62-
// TODO: 리프레시 토큰, FCM 토큰 삭제
70+
// 리프레시 토큰, FCM 토큰 삭제
71+
jwtUtils.expireRefreshToken(memberId, deviceId);
72+
redisService.removeFcmTokenForDevice(memberId, deviceId);
6373
}
6474
}

src/main/java/akuma/whiplash/domains/member/presentation/MemberController.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import static akuma.whiplash.domains.member.exception.MemberErrorCode.*;
44

55
import akuma.whiplash.domains.auth.application.dto.etc.MemberContext;
6-
import akuma.whiplash.domains.member.application.dto.request.MemberTermsModifyRequest;
6+
import akuma.whiplash.domains.member.application.dto.request.MemberPrivacyPolicyModifyRequest;
7+
import akuma.whiplash.domains.member.application.dto.request.MemberPushNotificationPolicyModifyRequest;
78
import akuma.whiplash.domains.member.application.usecase.MemberUseCase;
89
import akuma.whiplash.global.annotation.swagger.CustomErrorCodes;
910
import akuma.whiplash.global.response.ApplicationResponse;
@@ -25,18 +26,26 @@ public class MemberController {
2526
private final MemberUseCase memberUseCase;
2627

2728
@CustomErrorCodes(memberErrorCodes = {MEMBER_NOT_FOUND})
28-
@Operation(summary = "회원 약관 동의 정보 변경", description = "개인정보 제공 동의, 푸시 알림 수신 동의 여부를 변경합니다.")
29-
@PutMapping("/terms")
30-
public ApplicationResponse<Void> modifyMemberTermsInfo(@AuthenticationPrincipal MemberContext memberContext, @RequestBody @Valid MemberTermsModifyRequest request) {
31-
memberUseCase.modifyMemberTermsInfo(memberContext.memberId(), request);
29+
@Operation(summary = "회원 개인정보 수집 동의 변경", description = "개인정보 수집 동의 여부를 변경합니다.")
30+
@PutMapping("/terms/privacy")
31+
public ApplicationResponse<Void> modifyPrivacyPolicy(@AuthenticationPrincipal MemberContext memberContext, @RequestBody @Valid MemberPrivacyPolicyModifyRequest request) {
32+
memberUseCase.modifyMemberPrivacyPolicy(memberContext.memberId(), request);
3233
return ApplicationResponse.onSuccess();
3334
}
3435

35-
@CustomErrorCodes
36+
@CustomErrorCodes(memberErrorCodes = {MEMBER_NOT_FOUND})
37+
@Operation(summary = "회원 푸시 알림 수신 동의 변경", description = "푸시 알림 수신 동의 여부를 변경합니다.")
38+
@PutMapping("/terms/push-notifications")
39+
public ApplicationResponse<Void> modifyPushNotificationPolicy(@AuthenticationPrincipal MemberContext memberContext, @RequestBody @Valid MemberPushNotificationPolicyModifyRequest request) {
40+
memberUseCase.modifyMemberPushNotificationPolicy(memberContext.memberId(), request);
41+
return ApplicationResponse.onSuccess();
42+
}
43+
44+
@CustomErrorCodes(memberErrorCodes = {MEMBER_NOT_FOUND})
3645
@Operation(summary = "회원 탈퇴", description = "회원 정보, 관련된 알람 정보를 hard delete 합니다.")
3746
@DeleteMapping
3847
public ApplicationResponse<Void> hardDeleteMember(@AuthenticationPrincipal MemberContext memberContext) {
39-
memberUseCase.hardDeleteMember(memberContext.memberId());
48+
memberUseCase.hardDeleteMember(memberContext);
4049
return ApplicationResponse.onSuccess();
4150
}
4251
}

0 commit comments

Comments
 (0)