From b141c54a259117ba74b38cce3d4f704bb0510b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=90=E1=85=A2=20=E1=84=8E?= =?UTF-8?q?=E1=85=AC?= Date: Sat, 13 Sep 2025 15:46:42 +0900 Subject: [PATCH 1/8] =?UTF-8?q?refactor:=20=ED=9A=8C=EC=9B=90=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=95=8C=EB=A6=BC=20=EC=88=98=EC=8B=A0=20?= =?UTF-8?q?=EB=8F=99=EC=9D=98=20=ED=95=84=EB=93=9C=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/cherrypic/member/entity/Member.java | 7 +++++-- .../src/main/resources/db/migration/V1__init.sql | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java b/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java index 49593056..80ee0775 100644 --- a/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java +++ b/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java @@ -36,7 +36,7 @@ public class Member extends BaseTimeEntity { @Enumerated(EnumType.STRING) private MemberStatus status; - @NotNull private Boolean appAlarm = Boolean.FALSE; + @NotNull private Boolean serviceAgree; @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) private List payments = new ArrayList<>(); @@ -56,12 +56,14 @@ private Member( String nickname, String profileImageUrl, MemberRole role, - MemberStatus status) { + MemberStatus status, + Boolean serviceAgree) { this.oauthInfo = oauthInfo; this.nickname = nickname; this.profileImageUrl = profileImageUrl; this.role = role; this.status = status; + this.serviceAgree = serviceAgree; } public static Member createMember( @@ -72,6 +74,7 @@ public static Member createMember( .profileImageUrl(profileImageUrl) .role(MemberRole.USER) .status(MemberStatus.NORMAL) + .serviceAgree(Boolean.FALSE) .build(); } diff --git a/cherrypic-domain/src/main/resources/db/migration/V1__init.sql b/cherrypic-domain/src/main/resources/db/migration/V1__init.sql index 73707709..e1dedaaa 100644 --- a/cherrypic-domain/src/main/resources/db/migration/V1__init.sql +++ b/cherrypic-domain/src/main/resources/db/migration/V1__init.sql @@ -6,7 +6,7 @@ CREATE TABLE member ( profile_image_url VARCHAR(255), role VARCHAR(255) NOT NULL CHECK(role IN ('ADMIN','USER')), status VARCHAR(255) NOT NULL CHECK(status IN ('NORMAL','DELETED','FORBIDDEN')), - app_alarm BOOLEAN NOT NULL, + service_agree BOOLEAN NOT NULL, created_at DATETIME(6) NOT NULL, updated_at DATETIME(6) NOT NULL ); From d8fdeec8f9c99f03645d9104f7c224b6d5c8f05b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=90=E1=85=A2=20=E1=84=8E?= =?UTF-8?q?=E1=85=AC?= Date: Sat, 13 Sep 2025 15:57:47 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=EC=97=90=20=EB=A7=88=EC=BC=80=ED=8C=85=20?= =?UTF-8?q?=EC=88=98=EC=8B=A0=20=EB=8F=99=EC=9D=98=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/cherrypic/member/entity/Member.java | 7 ++++++- .../src/main/resources/db/migration/V1__init.sql | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java b/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java index 80ee0775..e6ffa208 100644 --- a/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java +++ b/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java @@ -38,6 +38,8 @@ public class Member extends BaseTimeEntity { @NotNull private Boolean serviceAgree; + @NotNull private Boolean marketingAgree; + @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true) private List payments = new ArrayList<>(); @@ -57,13 +59,15 @@ private Member( String profileImageUrl, MemberRole role, MemberStatus status, - Boolean serviceAgree) { + Boolean serviceAgree, + Boolean marketingAgree) { this.oauthInfo = oauthInfo; this.nickname = nickname; this.profileImageUrl = profileImageUrl; this.role = role; this.status = status; this.serviceAgree = serviceAgree; + this.marketingAgree = marketingAgree; } public static Member createMember( @@ -75,6 +79,7 @@ public static Member createMember( .role(MemberRole.USER) .status(MemberStatus.NORMAL) .serviceAgree(Boolean.FALSE) + .marketingAgree(Boolean.FALSE) .build(); } diff --git a/cherrypic-domain/src/main/resources/db/migration/V1__init.sql b/cherrypic-domain/src/main/resources/db/migration/V1__init.sql index e1dedaaa..c817a175 100644 --- a/cherrypic-domain/src/main/resources/db/migration/V1__init.sql +++ b/cherrypic-domain/src/main/resources/db/migration/V1__init.sql @@ -7,6 +7,7 @@ CREATE TABLE member ( role VARCHAR(255) NOT NULL CHECK(role IN ('ADMIN','USER')), status VARCHAR(255) NOT NULL CHECK(status IN ('NORMAL','DELETED','FORBIDDEN')), service_agree BOOLEAN NOT NULL, + marketing_agree BOOLEAN NOT NULL, created_at DATETIME(6) NOT NULL, updated_at DATETIME(6) NOT NULL ); From 0a034ff8cf6599d1cd395127a5aa47bac1581c9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=90=E1=85=A2=20=E1=84=8E?= =?UTF-8?q?=E1=85=AC?= Date: Sat, 13 Sep 2025 16:22:37 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20=ED=9A=8C=EC=9B=90=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=95=8C=EB=A6=BC=20=EC=88=98=EC=8B=A0=20?= =?UTF-8?q?=EB=8F=99=EC=9D=98=20=ED=95=84=EB=93=9C=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/cherrypic/member/entity/Member.java | 8 ++++---- .../src/main/resources/db/migration/V1__init.sql | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java b/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java index e6ffa208..370a574d 100644 --- a/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java +++ b/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java @@ -36,7 +36,7 @@ public class Member extends BaseTimeEntity { @Enumerated(EnumType.STRING) private MemberStatus status; - @NotNull private Boolean serviceAgree; + @NotNull private Boolean serviceAlarmAgree; @NotNull private Boolean marketingAgree; @@ -59,14 +59,14 @@ private Member( String profileImageUrl, MemberRole role, MemberStatus status, - Boolean serviceAgree, + Boolean serviceAlarmAgree, Boolean marketingAgree) { this.oauthInfo = oauthInfo; this.nickname = nickname; this.profileImageUrl = profileImageUrl; this.role = role; this.status = status; - this.serviceAgree = serviceAgree; + this.serviceAlarmAgree = serviceAlarmAgree; this.marketingAgree = marketingAgree; } @@ -78,7 +78,7 @@ public static Member createMember( .profileImageUrl(profileImageUrl) .role(MemberRole.USER) .status(MemberStatus.NORMAL) - .serviceAgree(Boolean.FALSE) + .serviceAlarmAgree(Boolean.FALSE) .marketingAgree(Boolean.FALSE) .build(); } diff --git a/cherrypic-domain/src/main/resources/db/migration/V1__init.sql b/cherrypic-domain/src/main/resources/db/migration/V1__init.sql index c817a175..1d5258c0 100644 --- a/cherrypic-domain/src/main/resources/db/migration/V1__init.sql +++ b/cherrypic-domain/src/main/resources/db/migration/V1__init.sql @@ -6,7 +6,7 @@ CREATE TABLE member ( profile_image_url VARCHAR(255), role VARCHAR(255) NOT NULL CHECK(role IN ('ADMIN','USER')), status VARCHAR(255) NOT NULL CHECK(status IN ('NORMAL','DELETED','FORBIDDEN')), - service_agree BOOLEAN NOT NULL, + service_alarm_agree BOOLEAN NOT NULL, marketing_agree BOOLEAN NOT NULL, created_at DATETIME(6) NOT NULL, updated_at DATETIME(6) NOT NULL From 2795d088888d5e203b9fa82175e623f0e542eb34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=90=E1=85=A2=20=E1=84=8E?= =?UTF-8?q?=E1=85=AC?= Date: Sat, 13 Sep 2025 16:38:53 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=EC=95=8C=EB=A6=BC=20=EB=B0=8F=20=EB=A7=88?= =?UTF-8?q?=EC=BC=80=ED=8C=85=20=EC=88=98=EC=8B=A0=20=EB=8F=99=EC=9D=98=20?= =?UTF-8?q?=ED=86=A0=EA=B8=80=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 14 ++++++++++++++ .../response/MarketingAgreeToggleResponse.java | 11 +++++++++++ .../ServiceAlarmAgreeToggleResponse.java | 11 +++++++++++ .../domain/member/service/MemberService.java | 6 ++++++ .../domain/member/service/MemberServiceImpl.java | 16 ++++++++++++++++ .../java/org/cherrypic/member/entity/Member.java | 8 ++++++++ 6 files changed, 66 insertions(+) create mode 100644 cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/MarketingAgreeToggleResponse.java create mode 100644 cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/ServiceAlarmAgreeToggleResponse.java diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/member/controller/MemberController.java b/cherrypic-api/src/main/java/org/cherrypic/domain/member/controller/MemberController.java index 1103d8ea..ceec255b 100644 --- a/cherrypic-api/src/main/java/org/cherrypic/domain/member/controller/MemberController.java +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/member/controller/MemberController.java @@ -6,8 +6,10 @@ import lombok.RequiredArgsConstructor; import org.cherrypic.domain.member.dto.request.FcmTokenSaveRequest; import org.cherrypic.domain.member.dto.request.MemberProfileUpdateRequest; +import org.cherrypic.domain.member.dto.response.MarketingAgreeToggleResponse; import org.cherrypic.domain.member.dto.response.MemberInfoResponse; import org.cherrypic.domain.member.dto.response.MemberProfileUpdateResponse; +import org.cherrypic.domain.member.dto.response.ServiceAlarmAgreeToggleResponse; import org.cherrypic.domain.member.service.MemberService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -42,4 +44,16 @@ public ResponseEntity memberFcmTokenSave( memberService.saveFcmToken(request); return ResponseEntity.noContent().build(); } + + @PatchMapping("/me/service-alarm") + @Operation(summary = "서비스 알림 수신 동의 상태 변경", description = "앱 내 주요 서비스 관련 알림 수신 여부를 변경합니다.") + public ServiceAlarmAgreeToggleResponse serviceAlarmAgreeToggle() { + return memberService.toggleServiceAlarmAgree(); + } + + @PatchMapping("/me/marketing") + @Operation(summary = "마케팅 수신 동의 상태 변경", description = "회원의 마케팅 수신 여부를 변경합니다.") + public MarketingAgreeToggleResponse marketingAgreeToggle() { + return memberService.toggleMarketingAgree(); + } } diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/MarketingAgreeToggleResponse.java b/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/MarketingAgreeToggleResponse.java new file mode 100644 index 00000000..cf430beb --- /dev/null +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/MarketingAgreeToggleResponse.java @@ -0,0 +1,11 @@ +package org.cherrypic.domain.member.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.cherrypic.member.entity.Member; + +public record MarketingAgreeToggleResponse( + @Schema(description = "마케팅 수신 동의 여부", example = "false") Boolean marketingAgree) { + public static MarketingAgreeToggleResponse from(Member member) { + return new MarketingAgreeToggleResponse(member.getMarketingAgree()); + } +} diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/ServiceAlarmAgreeToggleResponse.java b/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/ServiceAlarmAgreeToggleResponse.java new file mode 100644 index 00000000..e69700f2 --- /dev/null +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/ServiceAlarmAgreeToggleResponse.java @@ -0,0 +1,11 @@ +package org.cherrypic.domain.member.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import org.cherrypic.member.entity.Member; + +public record ServiceAlarmAgreeToggleResponse( + @Schema(description = "서비스 알림 수신 동의 여부", example = "false") Boolean serviceAlarmAgree) { + public static ServiceAlarmAgreeToggleResponse from(Member member) { + return new ServiceAlarmAgreeToggleResponse(member.getServiceAlarmAgree()); + } +} diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/member/service/MemberService.java b/cherrypic-api/src/main/java/org/cherrypic/domain/member/service/MemberService.java index cf1485c0..a22a3f18 100644 --- a/cherrypic-api/src/main/java/org/cherrypic/domain/member/service/MemberService.java +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/member/service/MemberService.java @@ -2,8 +2,10 @@ import org.cherrypic.domain.member.dto.request.FcmTokenSaveRequest; import org.cherrypic.domain.member.dto.request.MemberProfileUpdateRequest; +import org.cherrypic.domain.member.dto.response.MarketingAgreeToggleResponse; import org.cherrypic.domain.member.dto.response.MemberInfoResponse; import org.cherrypic.domain.member.dto.response.MemberProfileUpdateResponse; +import org.cherrypic.domain.member.dto.response.ServiceAlarmAgreeToggleResponse; public interface MemberService { MemberInfoResponse getMemberInfo(); @@ -11,4 +13,8 @@ public interface MemberService { MemberProfileUpdateResponse updateProfile(MemberProfileUpdateRequest request); void saveFcmToken(FcmTokenSaveRequest request); + + ServiceAlarmAgreeToggleResponse toggleServiceAlarmAgree(); + + MarketingAgreeToggleResponse toggleMarketingAgree(); } diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/member/service/MemberServiceImpl.java b/cherrypic-api/src/main/java/org/cherrypic/domain/member/service/MemberServiceImpl.java index b02128e6..ab6f5976 100644 --- a/cherrypic-api/src/main/java/org/cherrypic/domain/member/service/MemberServiceImpl.java +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/member/service/MemberServiceImpl.java @@ -4,8 +4,10 @@ import org.cherrypic.domain.image.event.ImageDeleteEvent; import org.cherrypic.domain.member.dto.request.FcmTokenSaveRequest; import org.cherrypic.domain.member.dto.request.MemberProfileUpdateRequest; +import org.cherrypic.domain.member.dto.response.MarketingAgreeToggleResponse; import org.cherrypic.domain.member.dto.response.MemberInfoResponse; import org.cherrypic.domain.member.dto.response.MemberProfileUpdateResponse; +import org.cherrypic.domain.member.dto.response.ServiceAlarmAgreeToggleResponse; import org.cherrypic.domain.notification.service.FcmTokenService; import org.cherrypic.global.util.MemberUtil; import org.cherrypic.member.entity.Member; @@ -50,4 +52,18 @@ public void saveFcmToken(FcmTokenSaveRequest request) { final Member currentMember = memberUtil.getCurrentMember(); fcmTokenService.saveFcmToken(currentMember.getId(), request.fcmToken()); } + + @Override + public ServiceAlarmAgreeToggleResponse toggleServiceAlarmAgree() { + final Member currentMember = memberUtil.getCurrentMember(); + currentMember.toggleServiceAlarmAgree(); + return ServiceAlarmAgreeToggleResponse.from(currentMember); + } + + @Override + public MarketingAgreeToggleResponse toggleMarketingAgree() { + final Member currentMember = memberUtil.getCurrentMember(); + currentMember.toggleMarketingAgree(); + return MarketingAgreeToggleResponse.from(currentMember); + } } diff --git a/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java b/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java index 370a574d..86de91b8 100644 --- a/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java +++ b/cherrypic-domain/src/main/java/org/cherrypic/member/entity/Member.java @@ -87,4 +87,12 @@ public void updateMember(String nickname, String profileImageUrl) { this.nickname = nickname; this.profileImageUrl = profileImageUrl; } + + public void toggleServiceAlarmAgree() { + serviceAlarmAgree = !serviceAlarmAgree; + } + + public void toggleMarketingAgree() { + marketingAgree = !marketingAgree; + } } From 4adc294471720f74fc5a3877dbaefd205a223088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=90=E1=85=A2=20=E1=84=8E?= =?UTF-8?q?=E1=85=AC?= Date: Sat, 13 Sep 2025 16:43:08 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EC=9D=91=EB=8B=B5=EC=97=90=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EC=95=8C=EB=A6=BC=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A7=88=EC=BC=80=ED=8C=85=20=EC=88=98=EC=8B=A0=20=EB=8F=99?= =?UTF-8?q?=EC=9D=98=20=EC=97=AC=EB=B6=80=20=ED=95=84=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/dto/response/MemberInfoResponse.java | 8 ++++++-- .../cherrypic/member/controller/MemberControllerTest.java | 8 ++++++-- .../org/cherrypic/member/service/MemberServiceTest.java | 8 ++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/MemberInfoResponse.java b/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/MemberInfoResponse.java index 8f998514..c07ad966 100644 --- a/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/MemberInfoResponse.java +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/member/dto/response/MemberInfoResponse.java @@ -16,7 +16,9 @@ public record MemberInfoResponse( "http://k.kakaocdn.net/dn/ceTrU6/btsL0V0mhKO/DGqAZKAK/img_110x110.jpg") String profileImageUrl, @Schema(description = "회원 상태", example = "NORMAL") MemberStatus status, - @Schema(description = "회원 역할", example = "ROLE_USER") MemberRole role) { + @Schema(description = "회원 역할", example = "ROLE_USER") MemberRole role, + @Schema(description = "서비스 알림 수신 동의 여부", example = "false") Boolean serviceAlarmAgree, + @Schema(description = "마케팅 수신 동의 여부", example = "false") Boolean marketingAgree) { public static MemberInfoResponse from(Member member) { return new MemberInfoResponse( member.getId(), @@ -24,6 +26,8 @@ public static MemberInfoResponse from(Member member) { member.getNickname(), member.getProfileImageUrl(), member.getStatus(), - member.getRole()); + member.getRole(), + member.getServiceAlarmAgree(), + member.getMarketingAgree()); } } diff --git a/cherrypic-api/src/test/java/org/cherrypic/member/controller/MemberControllerTest.java b/cherrypic-api/src/test/java/org/cherrypic/member/controller/MemberControllerTest.java index c39ca47c..2c79d247 100644 --- a/cherrypic-api/src/test/java/org/cherrypic/member/controller/MemberControllerTest.java +++ b/cherrypic-api/src/test/java/org/cherrypic/member/controller/MemberControllerTest.java @@ -51,7 +51,9 @@ class 회원_정보_조회_요청_시 { "testNickname", "testProfileImageUrl", MemberStatus.NORMAL, - MemberRole.USER); + MemberRole.USER, + Boolean.FALSE, + Boolean.FALSE); given(memberService.getMemberInfo()).willReturn(response); @@ -66,7 +68,9 @@ class 회원_정보_조회_요청_시 { .andExpect(jsonPath("$.data.nickname").value("testNickname")) .andExpect(jsonPath("$.data.profileImageUrl").value("testProfileImageUrl")) .andExpect(jsonPath("$.data.status").value("NORMAL")) - .andExpect(jsonPath("$.data.role").value("USER")); + .andExpect(jsonPath("$.data.role").value("USER")) + .andExpect(jsonPath("$.data.serviceAlarmAgree").value("false")) + .andExpect(jsonPath("$.data.marketingAgree").value("false")); } } diff --git a/cherrypic-api/src/test/java/org/cherrypic/member/service/MemberServiceTest.java b/cherrypic-api/src/test/java/org/cherrypic/member/service/MemberServiceTest.java index 4f7b251c..dec972ae 100644 --- a/cherrypic-api/src/test/java/org/cherrypic/member/service/MemberServiceTest.java +++ b/cherrypic-api/src/test/java/org/cherrypic/member/service/MemberServiceTest.java @@ -73,14 +73,18 @@ class 회원_정보를_조회할_때 { "nickname", "profileImageUrl", "role", - "status") + "status", + "serviceAlarmAgree", + "marketingAgree") .containsExactly( 1L, "testOauthProvider", "testNickname", "testProfileImageUrl", MemberRole.USER, - MemberStatus.NORMAL); + MemberStatus.NORMAL, + Boolean.FALSE, + Boolean.FALSE); } } From 71cb14d2ebf4e3158b3531a4fecc9f522a9c07a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=90=E1=85=A2=20=E1=84=8E?= =?UTF-8?q?=E1=85=AC?= Date: Sat, 13 Sep 2025 17:17:53 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat:=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EB=B0=8F=20=EB=A7=88=EC=BC=80=ED=8C=85=20?= =?UTF-8?q?=EC=88=98=EC=8B=A0=20=EB=8F=99=EC=9D=98=20=ED=86=A0=EA=B8=80=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MemberControllerTest.java | 43 +++++++++++++++++++ .../member/service/MemberServiceTest.java | 28 ++++++++++++ 2 files changed, 71 insertions(+) diff --git a/cherrypic-api/src/test/java/org/cherrypic/member/controller/MemberControllerTest.java b/cherrypic-api/src/test/java/org/cherrypic/member/controller/MemberControllerTest.java index 2c79d247..96d64dd6 100644 --- a/cherrypic-api/src/test/java/org/cherrypic/member/controller/MemberControllerTest.java +++ b/cherrypic-api/src/test/java/org/cherrypic/member/controller/MemberControllerTest.java @@ -9,8 +9,10 @@ import org.cherrypic.domain.member.controller.MemberController; import org.cherrypic.domain.member.dto.request.FcmTokenSaveRequest; import org.cherrypic.domain.member.dto.request.MemberProfileUpdateRequest; +import org.cherrypic.domain.member.dto.response.MarketingAgreeToggleResponse; import org.cherrypic.domain.member.dto.response.MemberInfoResponse; import org.cherrypic.domain.member.dto.response.MemberProfileUpdateResponse; +import org.cherrypic.domain.member.dto.response.ServiceAlarmAgreeToggleResponse; import org.cherrypic.domain.member.service.MemberService; import org.cherrypic.member.enums.MemberRole; import org.cherrypic.member.enums.MemberStatus; @@ -206,4 +208,45 @@ class FCM_토큰_저장_요청_시 { .andExpect(jsonPath("$.data.message").value("FCM Token은 비워둘 수 없습니다.")); } } + + @Nested + class 서비스_알림_수신_동의_상태_변경_요청_시 { + + @Test + void 유효한_요청이면_서비스_알림_수신_동의_상태를_변경하고_반환한다() throws Exception { + // given + ServiceAlarmAgreeToggleResponse response = + new ServiceAlarmAgreeToggleResponse(Boolean.TRUE); + + given(memberService.toggleServiceAlarmAgree()).willReturn(response); + + // when & then + ResultActions perform = mockMvc.perform(patch("/members/me/service-alarm")); + + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.success").value(true)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.data.serviceAlarmAgree").value("true")); + } + } + + @Nested + class 마케팅_수신_동의_상태_변경_요청_시 { + + @Test + void 유효한_요청이면_마케팅_수신_동의_상태를_변경하고_반환한다() throws Exception { + // given + MarketingAgreeToggleResponse response = new MarketingAgreeToggleResponse(Boolean.TRUE); + + given(memberService.toggleMarketingAgree()).willReturn(response); + + // when & then + ResultActions perform = mockMvc.perform(patch("/members/me/marketing")); + + perform.andExpect(status().isOk()) + .andExpect(jsonPath("$.success").value(true)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.data.marketingAgree").value("true")); + } + } } diff --git a/cherrypic-api/src/test/java/org/cherrypic/member/service/MemberServiceTest.java b/cherrypic-api/src/test/java/org/cherrypic/member/service/MemberServiceTest.java index dec972ae..937a2706 100644 --- a/cherrypic-api/src/test/java/org/cherrypic/member/service/MemberServiceTest.java +++ b/cherrypic-api/src/test/java/org/cherrypic/member/service/MemberServiceTest.java @@ -159,4 +159,32 @@ void cleanUp() { assertThat(redisTemplate.opsForSet().size(("fcmToken:1"))).isEqualTo(2); } } + + @Nested + class 서비스_알림_수신_동의_상태를_변경할_때 { + + @Test + void 유효한_요청이면_서비스_알림_수신_동의_상태를_변경한다() { + // when + memberService.toggleServiceAlarmAgree(); + + // then + Member member = memberRepository.findById(1L).get(); + assertThat(member.getServiceAlarmAgree()).isTrue(); + } + } + + @Nested + class 마케팅_수신_동의_상태를_변경할_때 { + + @Test + void 유효한_요청이면_마케팅_수신_동의_상태를_변경한다() { + // when + memberService.toggleMarketingAgree(); + + // then + Member member = memberRepository.findById(1L).get(); + assertThat(member.getMarketingAgree()).isTrue(); + } + } } From 8f2a8bd8039a33e419c85a4a2c0ca197f0734b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=90=E1=85=A2=20=E1=84=8E?= =?UTF-8?q?=E1=85=AC?= Date: Sat, 13 Sep 2025 17:30:04 +0900 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20=EB=A9=A4=EB=B2=84=EB=B3=84=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EB=B6=80=EC=97=AC=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20API=20Swagger=20=EC=84=A4=EB=AA=85=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9B=8C=EB=94=A9=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cherrypic/domain/album/controller/AlbumController.java | 2 +- .../domain/album/dto/response/PermissionToggleResponse.java | 2 +- .../org/cherrypic/album/controller/AlbumControllerTest.java | 2 +- .../java/org/cherrypic/album/service/AlbumServiceTest.java | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/album/controller/AlbumController.java b/cherrypic-api/src/main/java/org/cherrypic/domain/album/controller/AlbumController.java index 3b19183d..03ae65e4 100644 --- a/cherrypic-api/src/main/java/org/cherrypic/domain/album/controller/AlbumController.java +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/album/controller/AlbumController.java @@ -43,7 +43,7 @@ public AlbumUpdateResponse albumUpdate( } @PatchMapping("/{albumId}/permission") - @Operation(summary = "앨범 권한 부여 토글 상태 변경", description = "앨범의 권한 부여 토글 상태를 변경합니다.") + @Operation(summary = "앨범 권한 부여 상태 변경", description = "앨범의 권한 부여 허용 여부를 변경합니다.") public PermissionToggleResponse permissionToggle(@PathVariable Long albumId) { return albumService.togglePermission(albumId); } diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/album/dto/response/PermissionToggleResponse.java b/cherrypic-api/src/main/java/org/cherrypic/domain/album/dto/response/PermissionToggleResponse.java index 1d9c1f63..aacf2802 100644 --- a/cherrypic-api/src/main/java/org/cherrypic/domain/album/dto/response/PermissionToggleResponse.java +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/album/dto/response/PermissionToggleResponse.java @@ -4,7 +4,7 @@ import org.cherrypic.album.entity.Album; public record PermissionToggleResponse( - @Schema(description = "권한 부여 토글 상태", example = "true") Boolean permissionControl) { + @Schema(description = "권한 부여 허용 여부", example = "true") Boolean permissionControl) { public static PermissionToggleResponse from(Album album) { return new PermissionToggleResponse(album.getPermissionControl()); } diff --git a/cherrypic-api/src/test/java/org/cherrypic/album/controller/AlbumControllerTest.java b/cherrypic-api/src/test/java/org/cherrypic/album/controller/AlbumControllerTest.java index cabd844b..c45d2e35 100644 --- a/cherrypic-api/src/test/java/org/cherrypic/album/controller/AlbumControllerTest.java +++ b/cherrypic-api/src/test/java/org/cherrypic/album/controller/AlbumControllerTest.java @@ -579,7 +579,7 @@ class 앨범_수정_요청_시 { } @Nested - class 앨범_권한_부여_토글_상태_변경_요청_시 { + class 멤버별_권한_부여_상태_변경_요청_시 { @Test void 유효한_요청이면_권한_부여_토글_상태를_반환한다() throws Exception { diff --git a/cherrypic-api/src/test/java/org/cherrypic/album/service/AlbumServiceTest.java b/cherrypic-api/src/test/java/org/cherrypic/album/service/AlbumServiceTest.java index bb27b76f..852fc643 100644 --- a/cherrypic-api/src/test/java/org/cherrypic/album/service/AlbumServiceTest.java +++ b/cherrypic-api/src/test/java/org/cherrypic/album/service/AlbumServiceTest.java @@ -505,7 +505,7 @@ void setUp() { } @Nested - class 앨범_권한_부여_토글_상태를_변경_할_때 { + class 멤버별_권한_부여_상태를_변경할_때 { @BeforeEach void setUp() { @@ -572,7 +572,7 @@ void setUp() { } @Test - void 유효한_요청이면_앨범의_권한_부여_상태가_변경되고_LIMITED_참가자_권한이_STANDARD로_수정된다() { + void 유효한_요청이면_멤버별_권한_부여_상태를_변경하고_LIMITED_참가자들의_권한을_STANDARD로_변경한다() { // when albumService.togglePermission(1L); From 818eb19977c89483031b4f960293c452a37f4133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=92=E1=85=A7=E1=86=AB=E1=84=90=E1=85=A2=20=E1=84=8E?= =?UTF-8?q?=E1=85=AC?= Date: Sat, 13 Sep 2025 17:53:23 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EC=88=98=EC=8B=A0=20=EB=8F=99=EC=9D=98?= =?UTF-8?q?=ED=95=9C=20=ED=9A=8C=EC=9B=90=EB=A7=8C=20=EB=8C=80=EC=83=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20FCM=20=EC=95=8C=EB=A6=BC=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=EB=90=98=EB=8F=84=EB=A1=9D=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=EB=A7=81=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/repository/MemberRepository.java | 5 +++++ .../notification/service/NotificationServiceImpl.java | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/member/repository/MemberRepository.java b/cherrypic-api/src/main/java/org/cherrypic/domain/member/repository/MemberRepository.java index f3dec136..5d53fb94 100644 --- a/cherrypic-api/src/main/java/org/cherrypic/domain/member/repository/MemberRepository.java +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/member/repository/MemberRepository.java @@ -1,10 +1,15 @@ package org.cherrypic.domain.member.repository; +import java.util.List; import java.util.Optional; import org.cherrypic.member.entity.Member; import org.cherrypic.member.entity.OauthInfo; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; public interface MemberRepository extends JpaRepository { Optional findByOauthInfo(OauthInfo oauthInfo); + + @Query("SELECT m.id FROM Member m WHERE m.id IN :ids AND m.serviceAlarmAgree = true") + List findServiceAlarmAgreedIds(List ids); } diff --git a/cherrypic-api/src/main/java/org/cherrypic/domain/notification/service/NotificationServiceImpl.java b/cherrypic-api/src/main/java/org/cherrypic/domain/notification/service/NotificationServiceImpl.java index 3c5492be..e3d9654c 100644 --- a/cherrypic-api/src/main/java/org/cherrypic/domain/notification/service/NotificationServiceImpl.java +++ b/cherrypic-api/src/main/java/org/cherrypic/domain/notification/service/NotificationServiceImpl.java @@ -2,7 +2,6 @@ import java.util.List; import lombok.RequiredArgsConstructor; -import org.cherrypic.domain.album.repository.AlbumRepository; import org.cherrypic.domain.member.repository.MemberRepository; import org.cherrypic.domain.notification.repository.NotificationRepository; import org.springframework.stereotype.Service; @@ -21,7 +20,6 @@ public class NotificationServiceImpl implements NotificationService { private final FcmTokenService fcmTokenService; private final MemberRepository memberRepository; - private final AlbumRepository albumRepository; private final NotificationRepository notificationRepository; @Override @@ -36,7 +34,9 @@ public void sendAlbumDeleteNotification( notificationRepository.bulkInsertAlbumDeleteNotifications( albumId, senderId, PUSH_ALBUM_DELETE_TITLE, content); - List tokens = fcmTokenService.getFcmTokens(receiverIds); + List serviceAlarmAgreedIds = memberRepository.findServiceAlarmAgreedIds(receiverIds); + + List tokens = fcmTokenService.getFcmTokens(serviceAlarmAgreedIds); if (tokens.isEmpty()) { return; }